• jdk1.6与1.7垃圾回收


    最近项目中遇到了个关于JVM中GC线程数的问题,做一下简单的总结

    问题场景:

    server:均为 sun公司的solaris 系统 CPU 128个

    项目8.1时使用的 java版本:   jdk1.6_u38 升级到9.1后使用jdk1.7_U21 下面两图分别为1.6和1.7时的prstat输出情况,可明显发现1.7的cpu使用情况增大



    做了一个简单的测试(测试机型同上)代码如下,运行时不加任何JVM参数

    public class Test {

        public static void main(String[] args) {
            List<OOM> oom = new ArrayList<OOM>();
            int i = 0;
            int j = 0;
            while (true) {
                oom.add(new OOM());
                i++;
                if (i % 100000 == 0) {
                    j++;
                    System.out.println("force gc System.gc() " + j + " the i number is " + i);
                    System.gc();
                    if (i > 0) {
                        try {
                            System.out.println("the program is sleeping");
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        
        static class OOM {
            private String name;
        }
    }

    下面两图分别为1.6和1.7的测试的结果,可看到在1.7中大量CPU在运行着,而1.6基本都是sleep

    翻阅了一下 oracle官网中的 JVM参数介绍 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html 发现

    JDK1.6中对默认的GC 回收方式为:-XX:-UseParallelGC  年轻代为并行年老代为串行,  1.6中引入了新的参数设置-XX:-UseParallelOldGC 年轻代为并行,年老代也为并行

    而在JDK1.7中默认的GC回收方式则变成了-XX:-UseParallelOldGC

    另外通过在1.6的环境中加上-XX:-UseParallelOldGC次参数可以看到与1.7任何参数不加 相同的结果

    最终在项目加入了 -XX:ParallelGCThreads=<n>来限定gc执行时的线程数,默认如果不加入的话 等于你服务器中CPU的个数(CPU<=8的时候)或者 cpu*5/8 (CP>=8的时候)



  • 相关阅读:
    一道模拟赛题
    Codechef Union on Tree
    BZOJ3435: [Wc2014]紫荆花之恋
    BZOJ3924: [Zjoi2015]幻想乡战略游戏
    BZOJ4372: 烁烁的游戏
    BZOJ3730: 震波
    BZOJ4317: Atm的树+2051+2117
    [六省联考2017]相逢是问候(扩展欧拉定理+预处理幂)
    「BJOI2018」治疗之雨(概率+高斯消元转递推)
    「BJOI2018」链上二次求和(线段树)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3299675.html
Copyright © 2020-2023  润新知