JVM参数调优

JVM参数调优

JVM参数配置

JVM提供了诸多的参数进行JVM各个方面内存大小的设置,为Java应用进行优化提供了诸多的工具,本文将会详细分析各个参数的功能与使用。

常见参数配置

-XX:+PrintGC      每次触发GC的时候打印相关日志

-XX:+UseSerialGC      串行回收

-XX:+PrintGCDetails  更详细的GC日志

-Xms               堆初始值

-Xmx               堆最大可用值

-Xmn               新生代堆最大可用值

-XX:SurvivorRatio  用来设置新生代中eden空间和from/to空间的比例.

-XX:NewRatio       配置新生代与老年代占比 1:2

含以-XX:SurvivorRatio=eden/from=den/to

总结:在实际工作中,我们可以直接将初始的堆大小与最大堆大小相等,

这样的好处是可以减少程序运行时垃圾回收次数,从而提高效率。

-XX:SurvivorRatio     用来设置新生代中eden空间和from/to空间的比例.

 

初始队内存 与 电脑内存有关 默认4G  

新生代最大可用值  满了发生Minor GC

Full GC 新生代 老年代 都会一起回收了

 

堆的初始值和最大值一定要相等,不相等的情况下 垃圾回收不停的回收 不停的申请 不停的回收  

 1、垃圾回收时候 其他线程要停止 停顿一下  如果堆内存和最大不同  不停回收 那么程序断断续续的进行 非常不好 大家要注意    

如果不暂停 再次期间产生的新的垃圾不能回收

2、 新生代小于老年代   新生代回收的频率高 老年代低  让新生代去频繁收集 所以调小一些     新生代:老年代=1:2  新生代占比越小越频繁 老年代打不频繁

 

废话不多说!实践!

实战一、堆内存大小配置

package jvmTest;

//打印堆的基本内存信息
public class Test02 {
  public static void main(String[] args) {
        System.out.print("最大内存");
        System.out.println(Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");
        System.out.print("可用内存");
        System.out.println(Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");
        System.out.print("已经使用内存");
        System.out.println(Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");
}
        
}

这是默认的堆存的状态

 进行设置: -Xmx20m -Xms5m     初始5m 最大20m

  

运行结果:

已使用内存 根据初始值申请来的  !

来4M的内存看看:

package jvmTest;

//打印堆的基本内存信息
public class Test02 {
  public static void main(String[] args) {
        byte[] b = new byte[4 * 1024 * 1024];  //4M
        System.out.print("最大内存");
        System.out.println(Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");
        System.out.print("可用内存");
        System.out.println(Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");
        System.out.print("已经使用内存");
        System.out.println(Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");
}
        
}

运行结果:

使用内存 > 9M

但是不能申请25M给它哦,会堆溢出的~大家可以试试

 

 

 

设置新生代比例参数

使用示例: -Xms20m   -Xmx20m  -Xmn1m  -XX:SurvivorRatio=2  -XX:+PrintGCDetails -XX:+UseSerialGC

说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1     (2:1:1)

 Eden 默认 比S0、S0要打 因为S0、S1要复制的 不要太大了

package jvmTest;

//打印堆的基本内存信息
public class Test02 {
  public static void main(String[] args) {
      System.out.println("ssssss");
      byte[] b = null;
      for (int i = 0; i < 10; i++) {
      b = new byte[1 * 1024 * 1024];
      }

 }
  }    

结果:

出现框框内的 说明内存不够 进行垃圾回收了

下面的分配:

配置新生代的

 eden空间和from/to空间的比例为2/1   2:1:1   结果展示完美~~

 

下面这么配置一下看看:

 -XX:+PrintGCDetails -XX:+UseSerialGC

 

结果没有回收哦

最大始值设置20M时候会有 GC回收日志

  因为之前这段代码运行时候 需要的内存是 10M i=10嘛  但是这时候新生代最大可用值是1M   这时候空间不够 为了够用 不停的回收   内存不够了就会不停的回收 

 

 

设置新生代与老年代比例参数

使用示例: -Xms20m -Xmx20m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2

说明:堆内存初始化值20m,堆内存最大值20m,新生代最大值可用1m,eden空间和from/to空间的比例为2/1

新生代和老年代的占比为1/2

哇,竟然回收了三次!

 

新生代与老年的的占比是 1:2 看到eden+from+to : 1369 大致是哦

当然我们可以看下默认占比

大致为:13696:6784=1:2 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值