当我在配置为使用超过32GB内存的JVM中运行我的Java应用程序时,我试图预测堆内存需求的变化。
我预计相同数量的"有用的"会有很大的内存开销。在将Xmx参数从32GB重新配置为64GB后,我将内存保留在内存中。
我尝试通过在运行小堆(8GB)的本地计算机上应用-XX:-UserCompressedOps
来模拟和估计差异,但尚未得出结论。
根据运行时计算,我的对象在两种情况下都占用相同数量的内存。关闭优化的已使用堆往往会更多,但绝不会超过两倍,因为我可以期待阅读一些解释。
在我的用例中,我只是在程序的整个生命周期内将大量相对较大的POJO对象100-1K保存在堆中。
通过超过32GB限制(当32位优化不再适用时)是否有关于内存需求如何增长的经验法则?
答案 0 :(得分:1)
但绝不是两次,因为我可以期待阅读一些解释。
我的理解是禁用CompressedOops只会使指针大小(引用类型)加倍,而不是基本类型,尤其是字符串,字节数组等。 因此,如果您的堆由原始类型数组控制,那么增加可能很难注意到。
对齐要求也使得大小差异不那么直接,因为较大的指针可能最终会填充一些对齐填充。