二、JVM参数配置

一、常见参数配置

  • -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
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休止符

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值