1

在像 Hibernate 等使用 JPA/ORM 时,通常定义 Java bean/POJO 来表示映射到相应 RDBMS 表的实体。但是,我正在尝试开发的平台涉及支持 200,000 个此类实体。如果我必须使用标准的 Spring MVC + Hibernate 模型,我最终可能会创建 200K 模型 POJO、200K DAO 类和另外 200K 左右的 JavaBeans,其中包含的数据格式可以在视图中显示。除了 Spring、Hibernate 和许多其他库所需的 Java 类之外,这相当于大约 60 万个 Java 类。假设每个 POJO Model 类有 10 个 String 实例变量及其对应的 getter/setter。现在我想知道加载所有这些类需要多少 PermGen 空间。

找到 PermGen Space 开销的最佳方法是什么?一个疯狂的想法是编写一个程序来生成这些 200K 类,加载它们(但不创建它们的实例)并运行分析器来识别“没有实例的类”指标以及如何获取它们的永久大小。

事实上,我也在寻找一个更简单的解决方案,它可以只使用 Field Vs Value Map 的 java.util.Map,其中 Field 包含有关 RDBMS 表/列映射和生成 JDBC CRUD 语句的元数据(例如JOOQ.org没有新类的开销)。

目标是运行节目而不必使用太多反射和加载太多只携带数据的类!

非常感谢您对此事的任何帮助。

4

2 回答 2

1

正如您所建议的那样,影响将是 PermGen 空间很快就会耗尽,并且您会收到 OutOfMemoryException。对于这么多类,您很可能在启动应用程序之前使用默认的 JVM 设置就耗尽了内存。(有关估计内存中类的实际大小的帮助,请参阅The Java Specialists' Newsletter 的第 142 期。)

您当然可以通过命令行(例如-XX:MaxPermSize=256M. 但是,对于这么多类,您将需要数 GB 的 PermGen 空间。我们的应用程序使用了略多于 1K 的类,并且我们已经观察到 OOME,因此不得不将 PermGen 空间限制提高到 128M。更不用说维护这么多类将是一场噩梦......

因此,正如您得出的结论,最好找到一种替代方法。

于 2012-04-21T10:08:38.197 回答
1

我认为实际上指出所需的总 perm gen 空间是非常困难的。当你继续使用它时,运行可视化 vm 或 jmap 可以指示加载的类的数量。我们还在处理一个如此庞大的应用程序,我们分配了大约 2048 MB 的 perm gen 空间,即使在那之后我们也遇到了限制。您可以尝试查看延迟加载,以便并非所有这些都处于活动状态,同时启动并运行,并结合使用 c3po。

于 2012-04-21T10:12:23.227 回答