zoukankan      html  css  js  c++  java
  • JVM常用参数(七)

     内存监控

     -verbose:gc

    测试代码

      public static void main(String[] args){
                List<Classes> classes=new ArrayList<Classes>();
                int count=0;
                for(int i=0;true;i++){
                    classes.add(new Classes());
                    if(classes.size()>10000){
                        count++;
                        classes.clear();
                        classes=new ArrayList<Classes>();
                        System.out.println("标记为可回收");
                    }
                    if(count>20){
                        break;
                    }
                }
        }

    1253K表示为回收前占用内存 903k表示回收后占用内存 可以发现标记回收后垃圾对象被成功回收, 3584为总内存 最后一个为回收时间 

    GC (Allocation Failure 表示为新生代回收

    如果我们不标记为可回收会怎么样

    因为没有标记为已回收 新生代from to 迭代15次或者满了以后直接放到老年代 循环多次后老年代内存快满了时触发fullGC 因为都没有标记为可回收所以每次回收后 占用内存没有变化 最终导致内存溢出

    XX:+DisableExplicitGC

    禁止代码调用System.gc() 加了此参数则调用无效

    -XX:MaxTenuringThreshold

    控制在复制区域存活的年龄,超过年龄才到老年代 默认15,注:但是并不表示到了15才会到老年代,如果eden区回收非垃圾对象在复制区域申请不到足够的内存,则直接托管到老年代
    -XX:MaxTenuringThreshold=15

     -XX:+PrintGCDetails 

     -XX:+PrintGCDetails

    打印每次gc的回收情况 程序运行结束后打印堆空间内存信息(包含内存溢出的情况)

    [PSYoungGen: 512K->400K(1024K)] 表示年轻代占用空间 回收前和回收后

    512K->400K(1536K) 表示为java堆的空间总内存的回收签回收后内存

    PsYoungGen 为新生代 总内存(total1024k ) 使用(used 462K) 其中:

            eden区  512K

            from区  512K

            to区      521K

     年轻代可用空间为1024可以发现eden+from+to大于1024  新生代的内存为eden+from或者+to 因为年轻代采用复制算法 所以复制区域会有一块儿重复的区域512 不能使用

    ParOldGen 为老年代 总空间512K

    Metaspace  PermGen永久代废弃 jdk8使用 Metaspace(元空间) 替代 

    -XX:+PrintGCTimeStamps

    打印每次gc的间隔的时间戳 full gc为每次对新生代老年代以及整个空间做统一的回收 系统中应该尽量避免

    产生fullgc的几种情况   老年代空间不足    持久代(元空间 或者jdk8的元空间)空间不足  手动调用system.gc  可以使用可以DisableExplicitGC来禁止

     -XX:+TraceClassLoading

     打印类加载情况

     

    -XX:+PrintClassHistogram 

    打印每个类的实例的内存占用情况

    通过按ctrl+Break 会打印 用的mac不知道咋么按  哈哈哈

    -XX:+PrintHeapAtGC

     打印每次gc前后的内存情况

    回收前年轻代eden区使用100% 老年代使用0% 回收后 eden区放到from区   老年代使用14%

    Xloggc

    配合上面的使用将上面的日志打印到指定文件

    -Xloggc:/Users/liqiang/Desktop/logs/log.log

     -XX:HeapDumpOnOutOfMemoryError

     发生内存溢出将堆信息转存起来 以便分析

    -XX:HeapDumpPath为转存位置     生成的文件使用JProfiler 打开 分析

    也可以在内存溢出时执行脚本 比如发送邮件给系统管理员脚本
    -XX:OnOutOfMemoryError ="sh ~/cleanup.sh" 

     

     内存分配参数

     -Xmx -Xms 堆的最大内存和最小内存(最小内存为初始内存 ,如果满了将不断扩容到最大内存)默认是物理内存的1/64

      -Xmx20m -Xms20m  则固定堆空间为20m(年轻代+老年代)

     -XX:SurvivorRatio  Survivor(from-to)区和eden区的占比 

    例如 -XX:SurvivorRatio=5 则是5:1:1

           -XX:SurvivorRatio=8:则是8:1:1

    2560*(2/7)  则是from和to的大小 剩下则是eden区的大小

      -XMmn  设置新生代的大小 (绝对值)

     -Xmn2m  则设置新生为2m  

    -XX:NewRatio 新生代占老年代的比例

       如果是4 则是1:4   如果是5则为1:5 默认为2

    如:

    虽然新生代空间为2m但是2m通过计算eden和from to的的空间 但是真实新生代则是 eden+from或者to

     -XX:PermSize  -XX:MaxPermSize   设置永久代的值和最大值 

    因为jdk8之后溢出了永久代 使用元空间代替

    MaxMetaspaceSize  元空间大小受制于操作系统内存 

    官方推荐堆空间内存分配

    新生代占堆的3/8     幸存代占新生代的1/10

    栈空间内内存分配

    -Xss 

    栈空间是保存变量的地址 所以栈空间的大小决定了方法调用的深度 。比如递归方法会产生大量的变量

    设置栈大小为108k  运行 几秒后栈溢出

     则报栈溢出

    我们如果我们将参数改为10m 则会等很久才会内存溢出

    内存分配参数默认值

    -Xms(minimum memory size for pile and heap)   默认情况下为机器内存的64分之一

    -Xmx(maximum memory size for pile and heap)   默认情况下为机器内存的4分之一 等同于-XX:MaxHeapSize

    -Xmn(年轻代的大小具体值)默认情况下堆内存的64分之一

    -XX:NewRatio(年轻代占老年代的比例)默认为2(1:2)

    -XX:SurvivorRatio(eden区与form to区的比例)默认为8(8:1:1)

    jdk永久代大小设置 -XX:PermSize=64M -XX:MaxPermSize=128M 

    避免Concurrent Mode Failure

    年老代剩余空间>=EDEN+SURVIROR,即:

    (Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2))

    优化相关

    -XX:+UseFastAccessorMethods

    get,set 方法转成本地代码(对于jvm来说是冗余代码,jvm将进行优化) 

    Minor GC、Major GC和Full GC之间的区别

    Minor GC

    新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具
    备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。一般感知不到

    Full GC

    又称为老年代GC或者Major GC 整堆回收 一般会至少伴随一次Minor GC  的速度一般会比 Minor GC 慢 10
    倍以上。

  • 相关阅读:
    Shell脚本sed命令
    Shell脚本常用unix命令
    Shell的case语句
    3.5.2 数值之间的转换
    3.5.1 数学函数与常量
    3.5 运算符
    3.4.2 常量
    3.4.1 变量初始化
    3.4 变量
    Python异常捕捉的一个小问题
  • 原文地址:https://www.cnblogs.com/LQBlog/p/9194927.html
Copyright © 2011-2022 走看看