垃圾收集使Java内存变得高效,因为它从堆内存中移除未引用的对象,并为新对象腾出空间。那么在垃圾收集的过程中,我们应该怎么做才能更系统更高效的运行呢?想学习Java中垃圾收集的技巧和方法,不妨报名参加java培训,在专业老师和系统课程的指导教学下,可以快速提升自己。
避免手动触发
除了垃圾收集的基本机制之外,要了解Java中垃圾收集的最重要的一点是它是不确定性的。这意味着无法预测垃圾收集在运行时何时发生。
可以在代码中包含一个提示,用System.gc()或者Runtime.gc()方法,但它们不能保证垃圾收集器实际运行。
使用工具进行分析
如果你没有足够的内存来运行你的应用程序,你将会遇到速度变慢、长时间的垃圾收集、“stop the world”事件,并最终出现内存不足的错误。这可能表明你的堆太小,但也可能意味着你的应用程序中存在内存泄漏。
你可以从监控工具中获得帮助,如jstat或者Java飞行记录器查看堆使用量是否无限增长,这可能表明你的代码中存在错误。如果你也对垃圾回收感兴趣,不妨报个java培训班,有专业讲师面授指导教学,还有更加系统全面的课程,让学习更科学,更有效。
默认设置是好的
如果你正在运行一个小型的独立Java应用程序,你很可能不需要任何类型的垃圾收集调优。默认设置应该就可以了。
使用JVM标志进行调优
调优Java垃圾收集的最佳方法是在JVM上设置标志。标志可以调整要使用的垃圾收集器(例如串行、G1等等)、堆的初始和最大大小、堆段的大小(例如年轻代、老代)等等。
选择正确的收集器
被调优的应用程序的性质是设置的良好初始指南。例如,并行垃圾收集器是高效的,但会频繁地导致“停止世界”事件,这使它更适合后端处理,在后端处理中,长时间的垃圾收集暂停是可以接受的。
另一方面,CMS垃圾收集器旨在最大限度地减少暂停,使其成为基于web的应用程序的理想选择,在这些应用程序中,响应性是非常重要的。在java培训学习中,既有理论知识课程,又有实训项目操作课程,让你学以致用,真正掌握有用的技能。
如何选择正确的垃圾收集器
如果你的应用程序没有严格的暂停时间要求,你应该运行你的应用程序并允许JVM选择正确的收集器。
大多数时候,默认设置应该就可以了。如有必要,你可以调整堆大小以提高性能。如果性能仍然不能满足你的目标,你可以根据你的应用要求修改收集器:
l 串行—如果应用程序具有较小的数据集(最多约100 MB)和/或将在无暂停时间要求的单个处理器上运行
l 并行—如果应用程序性能达到峰值,并且没有暂停时间要求或暂停一秒或更长时间是可以接受的
l CMS/G1—如果响应时间比总吞吐量更重要,垃圾收集暂停时间必须保持在大约1秒以内
l ZGC—如果响应时间是高优先级的,和/或你使用的是非常大的堆
结论
对于许多简单的应用程序来说,Java垃圾收集不是程序员需要有意识地考虑的事情。然而,对于想要提高Java技能的程序员来说,参加java培训理解Java垃圾收集是如何工作的非常重要。