JVM调优学习之旅-(5)初识gc日志 ParNew+CMS

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

模拟GC

JVM参数

-XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:SurvivorRatio=8 
-XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 
-XX:PretenureSizeThreshold=10485760 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

参数说明

-XX:NewSize 初始新生代大小 5M

-XX:MaxNewSize 最大新生代大小 5M

-XX:SurvivorRatio Eden区与s1 s2 区的比例

-XX:InitialHeapSize 初始堆大小 10M

-XX:MaxHeapSize 最大堆大小 10M

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC 新生代parnew 老年代 cms

-XX:PretenureSizeThreshold=10485760 指定了大对象阈值是10MB

-XX:+PrintGCDetils:打印详细的gc日志

-XX:+PrintGCTimeStamps:这个参数可以打印出来每次GC发生的时间

-Xloggc:gc.log:这个参数可以设置将gc日志写入一个磁盘文件

示例代码

public class Demo1 {
    public static void main(String[] args) {
        byte[] array1 = new byte[1024 * 1024];
        array1 = new byte[1024 * 1024];
        array1 = new byte[1024 * 1024];
        array1 = null;
        byte[] array2 = new byte[2 * 1024 * 1024];
    }
}

gc日志

Java HotSpot(TM) 64-Bit Server VM (25.231-b11) for windows-amd64 JRE (1.8.0_231-b11), built on Oct  5 2019 03:11:30 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 33359028k(19834688k free), swap 35456180k(14483660k free)
CommandLine flags: -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:MaxNewSize=5242880 -XX:NewSize=5242880 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC 
0.103: [GC (Allocation Failure) 0.103: [ParNew: 3684K->512K(4608K), 0.0018922 secs] 3684K->1647K(9728K), 0.0020309 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 par new generation   total 4608K, used 3746K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
  eden space 4096K,  78% used [0x00000000ff600000, 0x00000000ff928990, 0x00000000ffa00000)
  from space 512K, 100% used [0x00000000ffa80000, 0x00000000ffb00000, 0x00000000ffb00000)
  to   space 512K,   0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
 concurrent mark-sweep generation total 5120K, used 1135K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3143K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 343K, capacity 388K, committed 512K, reserved 1048576K

前面都是一目了然 我们从第六行开始看

0.103: [GC (Allocation Failure) 0.103: [ParNew: 3684K->512K(4608K), 0.0018922 secs] 3684K->1647K(9728K), 0.0020309 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
这是一次GC概要说明:
GC (Allocation Failure) 由于分配失败 产生一次gc 系统运行到0.103秒时ParNew 产生一次年轻代gc
年轻代空间4.5M (Eden区是4MB,两个Survivor中只有一个是可以放存活对象的,另外一个是必须一致保持空闲的)
3684K 说明已经使用了多大空间 但是gc 过后 存活下来512k
3684K->1647K(9728K) 这是整个堆gc后整体情况 gc前占用 3684k gc后还占用 1647k
Times: user=0.00 sys=0.00, real=0.00 secs 由于单位是秒  所以忽略为0 了
Heap
 par new generation   total 4608K, used 3746K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
  eden space 4096K,  78% used [0x00000000ff600000, 0x00000000ff928990, 0x00000000ffa00000)
  from space 512K, 100% used [0x00000000ffa80000, 0x00000000ffb00000, 0x00000000ffb00000)
  to   space 512K,   0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
 concurrent mark-sweep generation total 5120K, used 1135K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3143K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 343K, capacity 388K, committed 512K, reserved 1048576K

这是内存结束后的情况

新生代总大小4608k目前还在使用3746k 年轻代目前占用78% 里面包含了2M数组 还有未知对象 s1也占用了一个

老年代也存在1135k对象 。

具体还存在哪些对象后续用工具看清楚,先了解个大概

Metaspace       used 3143K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 343K, capacity 388K, committed 512K, reserved 1048576K

这里牵涉到了操作系统的虚拟内存的概念!

首先 Jdk8开始把类的元数据 放到本地内存(native heap),称之为MetaSpace,理论上本地内存剩余多少,MetaSpace就有多大。 而 class space 是元空间内部的。不过设置了Metaspace大小后还是会有溢出情况。

触发动态年龄判断

JVM参数 其他参数看前一篇解释

-XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 
-XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=10485760 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc1.log

-XX:MaxTenuringThreshold=15 年龄15

新生代我们通过“-XX:NewSize”设置为10MB了 然后其中Eden区是8MB,每个Survivor区是1MB,Java堆总大小是20MB,老年代是10MB,大对象必须超过10MB才会直接进入老年 代

但是我们通过“-XX:MaxTenuringThreshold=15”设置了,只要对象年龄达到15岁才会直接进入老年代。 一切准备就绪,先看看我们当前的内存分配情况

代码

public class Demo2 {
    public static void main(String[] args) {
        byte[] array1 = new byte[2*1024 * 1024];
        array1 = new byte[2*1024 * 1024];
        array1 = new byte[2*1024 * 1024];
        array1 = null;
        byte[] array2 = new byte[128 * 1024];
        byte[] array3 = new byte[2 * 1024 * 1024];
    }
}

当main 方法执行到第五行的时候 给array3分配时新生代肯定放不下,前面已经放了2m +2m+2m+128k 此时 eden区可分配剩余1m左右

gc日志

Java HotSpot(TM) 64-Bit Server VM (25.231-b11) for windows-amd64 JRE (1.8.0_231-b11), built on Oct  5 2019 03:11:30 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 33359028k(19075240k free), swap 35456180k(13369076k free)
CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:MaxTenuringThreshold=15 -XX:NewSize=10485760 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC 
0.100: [GC (Allocation Failure) 0.100: [ParNew: 8130K->642K(9216K), 0.0008885 secs] 8130K->642K(19456K), 0.0010790 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 par new generation   total 9216K, used 3141K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  30% used [0x00000000fec00000, 0x00000000fee70c60, 0x00000000ff400000)
  from space 1024K,  62% used [0x00000000ff500000, 0x00000000ff5a08c8, 0x00000000ff600000)
  to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
 concurrent mark-sweep generation total 10240K, used 0K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3230K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 350K, capacity 388K, committed 512K, reserved 1048576K

分析

0.100: [GC (Allocation Failure) 0.100: [ParNew: 8130K->642K(9216K), 0.0008885 secs] 8130K->642K(19456K), 0.0010790 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

可以看出gc前就已经占用了8130k 垃圾回收后还有642k存在

 par new generation   total 9216K, used 3141K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  30% used [0x00000000fec00000, 0x00000000fee70c60, 0x00000000ff400000)
  from space 1024K,  62% used [0x00000000ff500000, 0x00000000ff5a08c8, 0x00000000ff600000)
  to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)

我们 正常剩余存在的对象应该就是2m+128k左右

由于在128k产生后 分配内存失败引起gc 所以 那一部分去了 s1 也就是日志中的from 后面分配的2048k 去了 eden 区。

此时array2的对象 应该是1岁

更改代码

public class Demo2 {
    public static void main(String[] args) {
        byte[] array1 = new byte[2*1024 * 1024];
        array1 = new byte[2*1024 * 1024];
        array1 = new byte[2*1024 * 1024];
        array1 = null;
        byte[] array2 = new byte[128 * 1024];
        byte[] array3 = new byte[2 * 1024 * 1024];

        array3=new byte[2*1024*1024];
        array3=new byte[2*1024*1024];
        array3=new byte[128*1024];
        array3=null;
        byte[] array4 = new byte[2 * 1024 * 1024];
    }
}

此时的内存分布图 还没执行最后一行

上面代码再次执行gc日志

0.090: [GC (Allocation Failure) 0.090: [ParNew: 8130K->637K(9216K), 0.0009362 secs] 8130K->637K(19456K), 0.0011031 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.092: [GC (Allocation Failure) 0.092: [ParNew: 7150K->366K(9216K), 0.0033473 secs] 7150K->990K(19456K), 0.0033991 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 par new generation   total 9216K, used 2552K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  26% used [0x00000000fec00000, 0x00000000fee225d0, 0x00000000ff400000)
  from space 1024K,  35% used [0x00000000ff400000, 0x00000000ff45bb38, 0x00000000ff500000)
  to   space 1024K,   0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
 concurrent mark-sweep generation total 10240K, used 623K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3230K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 350K, capacity 388K, committed 512K, reserved 1048576K

从这里可以看出 cms 已经有600多k的老年代了 这600多k其实就是第一次gc的时候进入s区的对象,

CMS管理的老年代,此时使用空间刚好是600多k,证明此时Survivor里的对象触发了动态年龄判定规则,虽然没有达到15岁,但是全部进入老年代了。

接着其实此时会发现Survivor区域中的对象都是存活的,而且总大小超过s区50%了,之前对象年龄都是1岁 此时根据动态年龄判定规则:年龄1+年龄2+年龄n的对象总大小超过了Survivor区域的50%,年龄n及以上的对象进入老 年代。 当然这里的对象都是年龄1的,所以老年龄进入老年代了。

再次改变代码

public class Demo2 {
    public static void main(String[] args) {
        byte[] array1 = new byte[2 * 1024 * 1024];
        array1=new byte[2*1024*1024];
        array1=new byte[2*1024*1024];
        byte[] array2 = new byte[128 * 1024];
        array2=null;
        byte[] array3=new byte[2*1024*1024];
    }
}

gc日志

CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:MaxTenuringThreshold=15 -XX:NewSize=10485760 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC 
0.119: [GC (Allocation Failure) 0.119: [ParNew: 8130K->659K(9216K), 0.0020862 secs] 8130K->2709K(19456K), 0.0022548 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 par new generation   total 9216K, used 3158K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  30% used [0x00000000fec00000, 0x00000000fee70c60, 0x00000000ff400000)
  from space 1024K,  64% used [0x00000000ff500000, 0x00000000ff5a4cc0, 0x00000000ff600000)
  to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
 concurrent mark-sweep generation total 10240K, used 2050K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3230K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 350K, capacity 388K, committed 512K, reserved 1048576K

这里出现一个特点 Young GC过后存活对象放不下Survivor区域,从而部分对象会进入老年代

在gc 的时候会发现 有659k未知对象和2M的数组要放进 Survivor 区 放不下 会有部分对象进入老年代。

fullGc之老年代放不下

JVM参数 其他参数看前一篇解释

-XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 
-XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 
-XX:PretenureSizeThreshold=3145728 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc2.log

上面注意一点 大对象给的 3M

代码

public class Demo3 {
    public static void main(String[] args) {
        byte[] array1 = new byte[4 * 1024 * 1024];
        array1=null;
        byte[] array2 = new byte[2 * 1024 * 1024];
        byte[] array3 = new byte[2 * 1024 * 1024];
        byte[] array4 = new byte[2 * 1024 * 1024];
        byte[] array5 = new byte[128 * 1024];
        byte[] array6 = new byte[2 * 1024 * 1024];
    }
}

gc 日志

0.130: [GC (Allocation Failure) 0.130: [ParNew (promotion failed): 8130K->8803K(9216K), 0.0034184 secs]0.134: [CMS: 8194K->6774K(10240K), 0.0030527 secs] 12226K->6774K(19456K), [Metaspace: 3223K->3223K(1056768K)], 0.0070386 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
Heap
 par new generation   total 9216K, used 2422K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  29% used [0x00000000fec00000, 0x00000000fee5d898, 0x00000000ff400000)
  from space 1024K,   0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
  to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
 concurrent mark-sweep generation total 10240K, used 6774K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3230K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 350K, capacity 388K, committed 512K, reserved 1048576K

最后一句代码还没执行时 gc前

分析

接着会执行如下代码:byte[] array6 = new byte[2 * 1024 * 1024];。此时,Eden区 已经放不下了。因此此时会直接触发一次Young GC。

我们看下面的GC日志:0.130: [GC (Allocation Failure) 0.130: [ParNew (promotion failed): 8130K->8803K(9216K), 0.0034184 secs]

这行日志显示了,Eden区原来是有8130K的对象,但是回收之后发现一个都回收不掉,因为上述几个数组都被变 量引用了。

此时,一定会直接把这些对象放入到老年代里去,但是此时老年代里已经有一个4MB的数组了,明显放不下3个2MB的数组和1个128KB的数组;

[CMS: 8194K->6774K(10240K), 0.0030527 secs] 12226K->6774K(19456K), [Metaspace: 3223K->3223K(1056768K)], 0.0070386 secs]

此时执行了CMS垃圾回收器的Full GC,Full GC其实就是会对老年代进行Old GC, 同时一般会跟一次Young GC关联,还会触发一次元数据区(永久代)的GC。

这里看到老年代从8MB左右的对象占用,变成了6MB左右的对象占用 为什么???

首先 执行young gc后 放了两个2M的数组进入老年代 ,发现无法继续再次放数据了 
这时 执行了 old gc 回收了4m的大对象 因为此时4m的大对象是没引用的,可以回收。
然后把剩余的对象放进老年代 差不多2M+2m+2m+128k和一些未知对象存活在老年代。
JVM虚拟机(十二)ParallelGCCMS、G1垃圾收集器的 GC 日志解析 阅读详情

相关推荐

JVM内存溢出排查指南

JVM GC日志分析指南 本文介绍了两种获取GC日志的方法:通过JVM参数(-XX:+PrintGCDetails)打印详细日志,或使用jstat命令实时监控。作者通过具体代码示例和JVM参数配置(设置5M新生代、10M堆空间),演示了Minor GC和Full GC的全过程。 日志分析包括: Minor GC:展示Allocation Failure触发的新生代回收,详细记录回收前后内存变化和耗时 Full GC:完整解析CMS垃圾收集器的各个阶段(初始标记、并发标记、最终标记、并发清除),包括每阶段的内

禅与计算机程序设计的艺术 2950

Java硬核知识:JVM实战手册】GC日志分析大师课:ParNewCMS的恋爱日志

摘要:本文围绕Java虚拟机(JVM)中ParNewCMS垃圾回收器的GC日志分析展开。详细解读了日志时间戳,剖析了停顿时间突增的常见原因,尤其是System.gc用的影响。同时,介绍了使用GCViewer可视化分析工具来更直观地分析GC日志。通过丰富的实操流程和完整代码示例,帮助开发者深入理解GC日志,掌握JVM技巧,提升Java应用程序的性能和稳定性。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1266

Java:JDK8 GCParNewCMS的问题说明

JDK8 GCParNewCMS的问题说明

netyeaxi的专栏 1301

JVM实战:JVM常用参数配置

JVM

dumuzhouguohe的博客 1423

一次性精通JVM JAVA虚拟机

为什么要学JVM1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。3、同时,JVM又是各大软件公司笔试、面试的重中之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。课程介绍本课程包含11个大章节,总计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat总计12种性能监控和故障排查工具的使用。第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas工具,在线诊断各种JVM问题。第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。课程资料课程附带配套项目源码2个159页高清PDF理论篇课件1份89页高清PDF实战篇课件1份Unsafe源码PDF课件1份class_stats字段说明PDF文件1份jcmd Thread.print解析说明文件1份JProfiler内存工具说明文件1份字节码可视化解析工具1份GC日志可视化工具1份命令行工具cmder 1份学习方法理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。      

JVM基础之内存空间详解(四)

堆空间中进行的垃圾回收,是影响虚拟机性能的主要原因。自动垃圾回收机制是一把双刃剑,全面了解它才能掌握它。 一、内存空间参数(JVM启动参数) 非堆内存(永久区)参数 -XX:PermSize 非堆内存初始大小值 -XX:MaxPermSize 非堆内存允许最大值 堆内存参数 -XX:InitialHeapSize-Xms) 堆内存初始大小值,单位可选m或g -XX:MaxHea...

银河舰长的专栏 707

查看JVM运行时的参数

PrintFlagsFinal =表示默认值 :=被用户或者JVM修改后的值 ./java -XX:+PrintFlagsFinal –version ./java -XX:+PrintFlagsFinal -version > /opt/flags.txt //重定向到一个文件中去 bool UseG1GC = false //=表示默认值 u...

lql_h的博客 1040

大白话讲解JVMParNew+CMS

原创不易,如果喜欢的点个赞支持一下吧 文章目录1.ParNew+CMS1.1 回收流程1.2 回收过程涉及的JVM参数 1.ParNew+CMS 我们在《大白话讲解JVM(基础篇)》一文介绍了JVM的运行时数据区域与垃圾回收的一些基础知识,在本文中我们将介绍下ParNew+CMS 垃圾回收的流程与一些JVM参数的介绍。 1.1 回收流程 我们先从ParNew+CMS组合回收器垃圾回收过程说起,当我们在创建一个对象的时候,比如说new User()这行代码,JVM会到Eden中申请一块内存存放这个Us.

猿上生活 3343

JVMGC日志分析及可视化工具介绍

JVMGC日志分析及GCeasy/GCViewer可视化工具介绍

大数据开发、JAVA开发、人工智能AI 4520

JVM之垃圾回收和思路

文章目录GC的基础知识1.什么是垃圾2.如何定位(找到)垃圾3.常见的垃圾回收算法4.JVM内存分代模型(用于分代垃圾回收算法)5.常见的垃圾回收器常见垃圾回收器组合参数设定:(1.8)JVM第一步,了解JVM常用命令行参数PS GC日志详解前的基础概念:什么是,从规划开始化环境解决JVM运行中的问题一个案例理解常用工具jconsole远程连接jvisualvm远程连接jprofiler (收费)arthas在线排查工具GC算法的基础概念CMSCMS的问题CMS日志分析G1G1日志详解案

星星都没我亮的博客 1923

JVM

JVM主要就是整下面两个指标 停顿时间:垃圾收集器做垃圾回收中断应用执行的时间。-XX:MaxGCPauseMillis 吞吐量:垃圾收集的时间和总时间的占比:1/(1+n),吞吐量为1-1/(1+n), -XX:GCTimeRatio = n GC步骤 打印GC日志 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDat...

weixin_43840862的博客 2557

JVM 学习笔记() CMS GC日志详解

GC 日志参数 JVMGC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800) -X

爱折腾的90后 6457

jvm性能实战 - 23 模拟Young GC的发生及分析GC日志

文章目录PreJVM参数示范GC日志配置Code分析对象是如何分配在Eden区内的采用指定JVM参数运行程序 Pre 之前的文章大部分都是在分析JVM的运行原理、GC原理以及化原理,从这里开始我们将要通过各种代码模拟出来JVM的各种场景,同时结合GC日志去分析到底JVM是怎么运行的。 今天的文章,我们将会给大家通过代码演示年轻代的Young GC是如何发生的,同时告诉大家如何在JVM参数中去配置打印对应的GC日志,然后我们通过GC日志来慢慢的分析JVMGC到底是如何运行的。 JVM参数示范 首先,

小工匠 2万+

Java8】jvm 开启GC日志(ParNew+CMS)

ParNew: 230534K->2665K(256256K), 0.0125008 secs] : 本次GCParNewGC,230534K->2665K是本次GC前后新生代的实际size,(256256K)是新生代容量,0.0125008 secs大约是本次GC在新生代的耗时,英文原文是"Duration for the collection w/o final cleanup",不太懂啥意思。实际生产上,有时需要分析GC日志,检查GC回收有没有引起过多的系统暂停,特别是full GC

smallbirdnq的专栏 1771

记一次 HDFS NameNode GC

没有碰到过 GC 问题的人生对写 Java 的人来说是不完整的。大数据生态圈的框架大都以 JVM 系语言开发(Java Scala 为主),毕竟生态成熟嘛要啥有啥。HDF...

漫谈大数据 3655

JVM(CMS+PerNew垃圾回收)

0.问题及排查思路 0.1 线上故障 线上服务器服务进程假死,进程还存在,但是日志已经不打印了,访问失败超时不响应。 0.2 排查思路 0.2.1 使用 jps -l 查看java进程的进程号 假设进程号为9999 [root@izbp1bym5hklu4zctqz logs]$ jps -l 24611 com.alibaba.dubbo.container.Main 11015 sun.tools.jps.Jps 15113 com.alibaba.dubbo...

codeLife1993的博客 1856

老大难的GC原理及,这下全说清楚了

“ 本文介绍 GC 基础原理和理论,GC 方法思路和方法,基于 Hotspot jdk1.8,学习之后你将了解如何对生产系统出现的 GC 问题进行排查解决。文章转载自...

u014714618的专栏 4117

基于日志理解jvm cms 原理,为什么remark要stop the world?(理解CMS GC日志.)

理解CMS GC日志 本文翻译自: https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs 加入自己的思考,特别是为什么remark要stop the world? 准备工作 JVMGC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC

fei33423的专栏 9461

java8 gc_java8添加并查看GC日志(ParNew+CMS)

一、背景java8的垃圾回收器一般推荐的是parNew+CMS,分别针对新生代和老年代的垃圾回收器。实际生产上,有时需要分析GC日志,检查GC回收有没有引起过多的系统暂停,特别是full GC。二、如何添加jvm参数启动GC日志直接上个例子,再解释。-verbose:gc -Xloggc:/var/log/xxx/gc-xxx.log -XX:+PrintGCTimeStamps -XX:+Pri...

weixin_36201438的博客 1462
上一篇: JVM调优学习之旅-(4)G1
下一篇: JVM调优学习之旅-(6)分析工具使用
yakax
博客等级 码龄7年 18粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值