我是Java的新手,我刚刚使用eclispe的MAT进行堆转储分析。所以我只想得到以下几点 a)了解什么是浅层和保留堆大小以及如何计算它?如果您提供示例,那将会很棒。 b)对于性能问题,大多数人建议我保持最小和最大堆大小相同,那么是否正确或者应用程序是主观的?
答案 0 :(得分:4)
浅堆是一个object
占用的内存。对象每个引用需要32位或64位(取决于操作系统体系结构),每个整数4个字节,每个长度8个字节等。根据堆转储格式,可以调整大小
X的保留堆是保留的X集中所有对象的浅层大小的总和,即X保持活着的内存。
参考this链接。
答案 1 :(得分:1)
JVM调整大小和调整并不是一门精确的科学,所以做出最小和最大尺寸相同的决定并不一定是最好的选择。
我发现this可以很好地解释您需要做出的各种决定。在解决你的问题时,它说:
将-Xms和-Xmx设置为相同的值可通过从虚拟机中删除最重要的大小决策来提高可预测性。但是,如果做出糟糕的选择,则虚拟机无法进行补偿。
如果将min和max设置为相同,但具有不适当大小的Eden空间,则可能仍会导致垃圾收集性能不佳。
决定调整大小的唯一方法是在各种工作负载下运行应用程序,并查看GC的执行情况。