zoukankan      html  css  js  c++  java
  • jvm系列之-gc日志查看

    在上一篇中我们介绍的有参数的设置,那我们要了解不同的参数对于程序的影响和对于调优的影响,这个时候我们就需要查看gc日志来看我们设置的参数是否合理,这一章节中我们就来查看gc日志

    一、新生代和老年代的比值对性能的影响

     Map map = new HashMap<>();
            for (int i = 0; i < 10; i++) {
                byte[] b = new byte[1024*1024];
                map.put(i,b);
            }
            System.out.println(map);
    -Xmx10M -Xms10M -verbose:gc -XX:+PrintGCDetail  -XX:PrintHeapAtGC  -Xloggc:ggc.log

    image.png
    - 1、我们首先来看一个问题:yong = eden+survivor from + survivor to的,但是 2048+512+512 > 2560

    解释如下:新生代的可用空间:eden+survivor from,是的 to不属于可用空间,在一次MinorGC之后,eden和from中还活着的对象会被全部复制到to中,然后from和to的角色互换,即可用空间只是eden+from

    • 2、第二个问题,我们可以看到在 before gc前,from和to都是 0%,而old区则为85%,为何新生代的from和to都是0%呢?

    解释如下:我们每次产生的对象的大小都是1m的对象,当对象过大时,会直接进入老年代

    • 3、有很多的博文都是介绍XX:SurvivorRation的默认值为8,我的上一篇博文中也是这样来写的,但是我们可以看到这里的比值很显然不是8,

    解释如下:在我们不断上调Xmx和Xms的时候,这个比值近似8

    针对问题2,我们现在做一些改动,现在只是生成10M大小的对象,单个对象的大小是1M,显然我们是需要调整Xmn和SurvivorRation的比例的

    二、设置Xmn和SurvivorRation的比值

    -Xmx10M -Xms10M -Xmn6M -XX:SurvivorRatio=4 -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:gcc.log

    即:堆区20m ,新生代6M,Eden:surviror = 4 ,即eden=4096:from=1024:to=1024
    image.png
    我们可以看到,在 before gc前,对象都存在于eden区,
    image.png
    在 after gc之后,我们可以看到,一部分对象存在于from区了,说明我们的调整是有效的

    下一篇我们将会讨论一下jvm的垃圾回收机制,这一篇估计会比较麻烦 ,但是阅读垃圾回收的策略,你会发现其实挺好玩的

  • 相关阅读:
    迁移到MSYS2 与 Qt 工具链注意的几个事情(g++在链接时,符号依赖项查找遵循从左至右的顺序,但qmake会自动合并造成错误。使用脚本给Mingw32-make创造出一个局部的VC编译环境)
    MSYS2 瘦身小攻略(使用junction)
    Boost.Http
    MySQL中临时表的基本创建与使用教程(CREATETEMPORARY TABLE)
    Javascript设计模式
    CORS
    axure & Markman
    JSON序列化那点事儿
    软件开发生涯
    CoffeeScript NgComponent
  • 原文地址:https://www.cnblogs.com/fkxuexi/p/9574981.html
Copyright © 2011-2022 走看看