一、常见参数配置
-XX:+PrintGC
:每次触发GC的时候打印相关日志-XX:+UseSerialGC
:串行回收-XX:+PrintGCDetails
:更详细的GC日志-Xms
:堆初始值-Xmx
:堆最大可用值-Xmn
:新生代堆最大可用值-XX:SurvivorRatio
:用来设置新生代中eden空间和from/to空间的比例.-XX:NewRatio
:配置新生代与老年代占比 1:2-XX:SurvivorRatio
:用来设置新生代中eden空间和from/to空间的比例.
- 两个总结
- a)将初始的堆大小与最大堆大小相等
- 这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率
- 因为在垃圾回收的时候,其他的线程会处于等待
- 降低垃圾回收的频率,就可以提高程序运行效率
- b)新生代空间一定要小于老年代空间
- 尽量让垃圾回收机制在新生代中回收,减少在老年代中回收
- 空间比较小的时候,垃圾回收的次数就会比较多
- 一般来说,新生代与老年代的占比配置为1:2
二、堆内存大小配置
- 示例: -Xmx20m -Xms5m
- 说明: 当下Java应用最大可用内存为20M, 初始内存为5M
- JVM内存调优主要就是针对堆内存进行的
- IDEA中配置堆内存方法:
- Run -> Edit Configurations… -> 选择对应的项目 -> VM options
==注意:===这个是为了测试所以配置在项目中,在实际的生产环境中,JVM的参数是配置在Tomcat中的
public class App{
public static void main(String[] args) {
System.out.println("最大内存" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");
System.out.println("可用内存" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "M");
System.out.println("已经使用内存" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "M");
}
}
//结果输出
/*
最大内存18M
可用内存4M
已经使用内存5M
*/
- 此时增加一个数组空间申请
public static void main(String[] args) {
byte[] b = new byte[4 * 1024 * 1024];
System.out.println("分配了4M空间给数组");
System.out.println("最大内存" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "M");
System.out.println("可用内存" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "M");
System.out.println("已经使用内存" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "M");
//结果输出
/*
分配了4M空间给数组
最大内存18M
可用内存4M
已经使用内存10M
*/
}
- 此时如果申请25M的数组,就会发生内存溢出
byte[] b = new byte[25 * 1024 * 1024];
- “Exception in thread “main” java.lang.OutOfMemoryError: Java heap space”
三、设置新生代比例参数
- 示例:
-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC
- 说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1
-XX:+PrintGCDetails
:GC日志打印-XX:SurvivorRatio=2
:配置新生代中 eden from to 比例关系 2 1 1- 不配置的话JVM默认占比关系是8:1:1
-XX:+UseSerialGC
:配置串行回收
public static void main(String[] args) {
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
}
- 使用如上的配置,运行程序后,Run日志显示
[GC (Allocation Failure)
:这个是当内存空间不够的,GC进行回收的日志信息(如果内存足够,就不会显示该信息)
/*
[GC (Allocation Failure) [DefNew: 508K->255K(768K), 0.0008591 secs] 508K->433K(20224K), 0.0009189 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 767K->112K(768K), 0.0009255 secs] 945K->544K(20224K), 0.0009497 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 618K->161K(768K), 0.0007434 secs] 3099K->2642K(20224K), 0.0007907 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 768K, used 282K [0x00000000fec00000, 0x00000000fed00000, 0x00000000fed00000)
eden space 512K, 23% used [0x00000000fec00000, 0x00000000fec1e370, 0x00000000fec80000)
from space 256K, 63% used [0x00000000fecc0000, 0x00000000fece86b0, 0x00000000fed00000)
to space 256K, 0% used [0x00000000fec80000, 0x00000000fec80000, 0x00000000fecc0000)
tenured generation total 19456K, used 10672K [0x00000000fed00000, 0x0000000100000000, 0x0000000100000000)
the space 19456K, 54% used [0x00000000fed00000, 0x00000000ff76c300, 0x00000000ff76c400, 0x0000000100000000)
Metaspace used 3229K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 350K, capacity 388K, committed 512K, reserved 1048576K
*/
四、设置新生代与老年代比例参数
- 示例:
-Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2
- 说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1
新生代和老年代的占比为1/2 -XX:NewRatio=2
:新生代和老年代的占比为1/2(JVM默认就是1:2)
public static void main(String[] args) {
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
}
- 使用如上的配置,运行程序后,Run日志显示
new generation
:新生代的空间tenured generation
:老年代的空间
/*
[GC (Allocation Failure) [DefNew: 2720K->1641K(5120K), 0.0020596 secs] 2720K->1641K(18816K), 0.0021008 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 4814K->1024K(5120K), 0.0019856 secs] 4814K->1637K(18816K), 0.0020094 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [DefNew: 4178K->1024K(5120K), 0.0005092 secs] 4790K->1637K(18816K), 0.0005310 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 5120K, used 4231K [0x00000000fec00000, 0x00000000ff2a0000, 0x00000000ff2a0000)
eden space 3456K, 92% used [0x00000000fec00000, 0x00000000fef21b88, 0x00000000fef60000)
from space 1664K, 61% used [0x00000000ff100000, 0x00000000ff2000e0, 0x00000000ff2a0000)
to space 1664K, 0% used [0x00000000fef60000, 0x00000000fef60000, 0x00000000ff100000)
tenured generation total 13696K, used 613K [0x00000000ff2a0000, 0x0000000100000000, 0x0000000100000000)
the space 13696K, 4% used [0x00000000ff2a0000, 0x00000000ff3394a8, 0x00000000ff339600, 0x0000000100000000)
Metaspace used 3176K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 344K, capacity 388K, committed 512K, reserved 1048576K
*/