堆内存是否越大越好
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作,但是现在垃圾回收器也支持了与用户线程同时进行,但是总体来说,如果内存很大的情况下,gc效率还是降低的,在gc时对服务器的性能影响很大
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
硬件环境
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。
堆内存占用率是高好还是低更好
这个问题也还是要从GC的角度考虑
首先分析占用率低的情况
首先jvm只有在gc的时候才会清理堆内存中的对象,如果堆内存的占用总是很小的话
- jvm几乎没有创建新的对象
- jvm频繁的发生gc,也就是堆内存经常满,然后gc,但是gc的效率很有效。总能将堆内存的清理到内存占用低的情况。
分析占用率高的情况
- 几乎没有发生full gc,很多对象仍然在老年代。这种情况是比较理想的情况,也就是大部门的对象是朝生夕死的,在年轻代就将大部分gc掉了。效率较高
- 也有可能是很多对象根本gc不掉,这样会导致占用率飙升,甚至oom
总结 堆内存占用高或者低,这个问题并不能直接得到答案,还需要借助jvm的架空工具,比如jstat命令,查看gc次数,gc时间等。