【发布时间】:2014-03-01 04:33:41
【问题描述】:
对于添加到 Java 应用程序的每个新类,内存成本是多少?
- 是拥有 5000 多个行的大型类还是几个 500-1000 个行的类更好(如果它们都已加载)
- 每次实例化一个 Object 时,唯一的额外内存使用确实是用于实例变量引用
- 对于一个没有实例变量的 5000 行类,加载该类时的成本规模是多少。类文件的大小是一个粗略的近似值吗?
- jar 文件的大小是否表明类将占用的通常或最大内存大小?
在 cruftex 的回答后编辑: 这是我对类拆分的理解:
- 分割成逻辑块可以很好地提高代码重用和 减少行数
- 它还使其更易于理解和 维护代码
这是我现在对类加载的理解:
- 第一次使用时类被加载到内存中(使用的内存大致是类文件的大小)
- 如果使用 JIT,JIT 编译器会创建一些额外的机器友好的二进制版本,这会使用更多的内存
- 如果使用 Hotspot,则仅使用机器友好版本对一些常用类进行优化(以平衡内存和速度)
- 加载类后,创建额外实例的开销可以忽略不计(大约 50-100 字节?)(假设没有实例变量)
- 一旦加载了一个类,该类本身就永远不会被垃圾回收
大致是这样工作的吗?
【问题讨论】:
-
任何拥有超过 5000 行级别的人,尤其是如果必须由其他人维护,都应该被带回来并枪杀。这回答了你的问题了吗?不过说真的,您误认为程序的成本。主要是调试成本高,过早错误的优化也无法改善。如果你这样编码,你的尾巴就会有老虎。
-
内存成本应该相同或非常接近,因为它取决于类中的对象。所以你可以通过做大量的类来为自己节省一两个字节,但代价是可读性。小班是更好的国际海事组织
-
我的应用程序中有几个 5,000+ 行类。此外,不鼓励开设更多短班的做法。我正在尝试了解什么是“正确的事情”!
-
我猜你遇到了比计算行数更紧迫的问题——比如一个严重需要重构和可能进行重大重组的程序。请浏览these books on refactoring 并考虑购买一两个。你不会后悔的。
-
你说的很多问题都是对的。感谢您的链接。 (如果提到包含 scriptlet 和“字符串实习”的 5000 多行 JSP,我会得到更多的反对意见吗:O)
标签: java performance jakarta-ee memory