近期准备系统学习一下Java垃圾回收的知识。本篇主要凝练学习中的知识点,如有笔误之处,敬请指正。

掌握JVM的组成的核心关键在于对其进行合理的操作优化,只有优化到位了,JVM才可以发挥最佳的性能。这种优化一般会分为两种情况考虑:

  • 代码结构优化:不产生过多无用的垃圾空间。
  • JVM可用资源优化。

参考资料


JVM可用资源优化

在JVM之中所有程序的数据都在运行时数据区中进行存储,而在运行时数据区中,唯一可以让用户进行优化的内存空间就是堆内存空间,所以首先必须清楚堆内存空间的基础划分。

堆内存空间划分

Java内存模型#堆内存空间

JVM整体内存调整

实际上针对于JVM的内存空间的优化核心的问题是在于解决伸缩区的使用情况。伸缩区的核心意义在于,如果当前内存区域不足的时候,则可以进行该区域的扩充,那么当伸缩区被沾满之后则表示当前的内存区域没有任何的容量了。而且发现所有的内存里面为了保证程序的执行都会提供有伸缩区,但是伸缩区每一次都要随着对象量的数据量的增长而动态的调整,而当对象缩小之后,又需要动态的缩减,这样一来对于JVM而言就追加了很多的判断逻辑,一定会导致性能问题的出现,所以最简单的优化方案就是直接将伸缩区取消,把所有的可用内存都进行分配。

Java优化内存 jvm内存优化_Java

实际运用

以下参数调整的都是堆的内存空间!可以配置的数据单元为:K、M、G。

-Xms2048M -Xmx2048M -Xmn1024M
  • “-Xms”:初始分配的内存大小,默认为物理内存的64分之一,小于1G。
  • “-Xmx”:最大分配内存,默认大小为物理内存的4分之一,小于1G。
  • “-Xmn”:设置年轻代的堆内存大小。

只要在运行程序时加入上边的参数就可以发挥出服务器的最大性能。这种让MAX=TOTAL,取消伸缩区的优化方案几乎是所有现在的JDK版本通用的方式

Jvm内存优化总结

  1. Jvm内存优化的第一个问题,取消掉伸缩区,让total=max。
  2. 如果内存过大使用G1收集器来进行收集。
  3. 在Tomcat里面由于其使用是基于Jvm的,所以需要设置一个“JAVA_OPTS”指令(看版本)。可以将全部内存供Tomcat使用(默认的最大可用内存为全部内存的1/4。默认的total为全部内存的1/64)。

围绕JVM内存的面试题主要考察如下几点:

  1. 看你是否知道Java中的内存划分。
  2. 看你是否有实际的开发经验,在实际开发中,如果不调整内存,势必造成性能的极大浪费。
  3. 关于GC的解释操作。