耶粉有什么作用?
简单说,JVM里所有跟内存相关的工作都需要借助Java Heap的运作来完成。 更准确地说,JVM里负责对象分配、收集以及执行监控等工作的线程都要在Java Heap上执行。这些工作都是为了能让GC有足够的线索来判定哪些对象可以回收。所以从GC的频率和性能上就能看出一个应用的java heap的使用情况。 如果发现GC太频繁,可以通过调整参数-XX:+UseGCOverheadLimit的方式来减少GC次数(不过这可能会影响GC的监测精度);如果发现GC运行时间长,那么需要仔细检查应用是否确实存在内存泄漏的情况了。 对于大型的Java应用来说,合理的设定java heap的大小是非常必要的,因为过小的jvm heap会造成内存的浪费,而太大的java heap则可能造成GC过于频繁甚至OOM。
对于单机应用来说,一般设成物理内存的1/2到2/3比较合适。而对于分布式应用来说,根据每台机器的内存大小合理地分配Java Heap能最大程度降低GC的压力。一般来说,每台机器分配的Java Heap应该小于物理内存的一半并且和内存频率成正比。 另外,通过-verbose:gc查看GC的详细信息和日志也能帮助我们诊断问题。
最后,如果一切设置都很合理,但应用依然频繁GC的话,则需要进一步分析应用逻辑了——有没有可能产生了大量无用的对象但却没有及时释放? 当然,最好的预防方法是认真编写代码,尽量减少对垃圾收集的依赖。