近期准备系统学习一下Java垃圾回收的知识。本篇主要凝练学习中的知识点,如有笔误之处,敬请指正。
掌握JVM的组成的核心关键在于对其进行合理的操作优化,只有优化到位了,JVM才可以发挥最佳的性能。这种优化一般会分为两种情况考虑:
- 代码结构优化:不产生过多无用的垃圾空间。
- JVM可用资源优化。
参考资料
同事推荐的一篇博客,美团网的后端开发工程师的JVM调优总结
JVM可用资源优化
在JVM之中所有程序的数据都在运行时数据区中进行存储,而在运行时数据区中,唯一可以让用户进行优化的内存空间就是堆内存空间,所以首先必须清楚堆内存空间的基础划分。
堆内存空间划分
JVM整体内存调整
实际上针对于JVM的内存空间的优化核心的问题是在于解决伸缩区的使用情况。伸缩区的核心意义在于,如果当前内存区域不足的时候,则可以进行该区域的扩充,那么当伸缩区被沾满之后则表示当前的内存区域没有任何的容量了。而且发现所有的内存里面为了保证程序的执行都会提供有伸缩区,但是伸缩区每一次都要随着对象量的数据量的增长而动态的调整,而当对象缩小之后,又需要动态的缩减,这样一来对于JVM而言就追加了很多的判断逻辑,一定会导致性能问题的出现,所以最简单的优化方案就是直接将伸缩区取消,把所有的可用内存都进行分配。
实际运用
以下参数调整的都是堆的内存空间!可以配置的数据单元为:K、M、G。
-Xms2048M -Xmx2048M -Xmn1024M
- “-Xms”:初始分配的内存大小,默认为物理内存的64分之一,小于1G。
- “-Xmx”:最大分配内存,默认大小为物理内存的4分之一,小于1G。
- “-Xmn”:设置年轻代的堆内存大小。
只要在运行程序时加入上边的参数就可以发挥出服务器的最大性能。这种让MAX=TOTAL,取消伸缩区的优化方案几乎是所有现在的JDK版本通用的方式。
Jvm内存优化总结
- Jvm内存优化的第一个问题,取消掉伸缩区,让total=max。
- 如果内存过大使用G1收集器来进行收集。
- 在Tomcat里面由于其使用是基于Jvm的,所以需要设置一个“JAVA_OPTS”指令(看版本)。可以将全部内存供Tomcat使用(默认的最大可用内存为全部内存的1/4。默认的total为全部内存的1/64)。
围绕JVM内存的面试题主要考察如下几点:
- 看你是否知道Java中的内存划分。
- 看你是否有实际的开发经验,在实际开发中,如果不调整内存,势必造成性能的极大浪费。
- 关于GC的解释操作。