记一次 Jvm 参数调优实战

本文通过四个案例详细分析了JVM参数调优的过程,探讨了年轻代、老年代的设置,以及GC行为,包括ParNewGC和CMS的运作机制。在案例中,通过对象分配和GC日志分析,解释了Full GC的误解,并讨论了不同大小对象的分配策略,最后总结了如何避免OOM问题。
摘要由CSDN通过智能技术生成

案例一

public class test1 {
    private static final int _1MB = 1024 * 1024;

    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("My Process Id is:"+getProcessID());
        Thread.sleep(10000);
        byte[] all1 = new byte[ 2 * _1MB];
        byte[] all2 = new byte[ 2 * _1MB];
        Thread.sleep(2000);
        byte[] all3 = new byte[ 2 * _1MB];
        byte[] all4 = new byte[ 7 * _1MB];
        System.in.read();
    }
    public static  int getProcessID() {
        RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
        return Integer.valueOf(runtimeMXBean.getName().split("@")[0])
                .intValue();
    }
}
复制代码

注:这里getProcessId的作用是拿到进程号

jvm参数

-Xmx20m  //   设置最大堆大小
-Xms20m   // 设置最小堆大小,一般和-Xmx一致
-Xmn10m   //  设置新生代大小
-XX:+UseParNewGC   //表示新生代使用ParNewGc
-XX:+UseConcMarkSweepGC   // 表示老年代使用CMS
-XX:+UseCMSInitiatingOccupancyOnly   //表示CMS不基于运行时收集数据来进行GC控制
-XX:CMSInitiatingOccupancyFraction=75   //而表示当老年代使用率到达阈值75%时触发
复制代码

我们这么设置JVM参数,就可以看出一些基本设置:

  • 年轻代 10M

  • 老年代 10M

  • eden:s0:s1 = 8:1:1

  • 新生代使用ParNewGc

  • 老年代使用CMS,并只有当老年代使用率超过75的时候触发FullGC

我们先简单看一下这么设置有什么问题:

代码里先创建了 2M的对象,直接放入eden区,再创建了2M的对象,同样也放入eden区,此时eden 有4M的对象,再创建了2M的对象,eden有4M,可以放更多,这2M也放进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值