所以,小弟希望可以从之前的工作经历和前人的总结中,讲述一些 jvm 实际操作相关的知识,包括但不限于 GC 日志解析、GC 时间异常相关实例和发生原因、OOM 等 jvm 相关异常等等~不定时更新吧~...,不过是一次 ygc,一次 fgc ,姑且不管 fgc 发生的原因,我们先来解析一下 GC 日志 young gc 日志解析 [GC (Allocation Failure) [PSYoungGen:...GC策略:gc前内存占用->gc后内存占用(新生代总大小) 8046K->6746K(19456K) gc前->gc后jvm堆内存占用(jvm堆大小) 0.0030729 secs GC...fgc耗时 [gc耗时详细信息] 看懂GC日志有什么用 GC日志是很多jvm问题排查和定位的第一道工具。...现代jdk的gc日志,进化的很好了应该已经,基本上看展示出来的gc原因也可以猜个大概。
上篇文章说jvm的实际运行情况。...@hashSet.add(“arthasAdd”) 二、GC日志详解 Java -jar -Xloggc:....fullGC原因在日志文件也可以看到,原因是Metadata GC threshold,元空间不够。...CMS: 这时候我们需要改jvm启动参数: -Xloggc:d:/gc-cms-%t.log -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Xms50M -Xmx50M...G1: 这时候我们需要改jvm启动参数: -Xloggc:d:/gc-g1-%t.log -XX:+UseG1GC 这是G1的初始标记,并发标记,最终标记,回收。
# JDK8 -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC CMS 日志格式: [GC (Allocation Failure)...0.0136830 secs] 5504K->1556K(19840K), 0.0137738 secs] [Times: user=0.06 sys=0.01, real=0.01 secs] [GC...0.0012950 secs] 7060K->2102K(19840K), 0.0013310 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] [GC...0.0175172 secs] 7606K->4311K(19840K), 0.0176172 secs] [Times: user=0.07 sys=0.01, real=0.01 secs] [GC...real=0.01 secs] # ParNew:年轻代收集器 6144->640:收集前后的对比 (6144):整个年轻代容量 9815 ->7694:整个堆的情况(19840):整个堆大小 [GC
通过阅读Gc日志,我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表 -XX:+PrintGC 输出GC日志。...类似:-verbose:gc -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimestamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDatestamps.../logs/gc.log 日志文件的输出路径 打开GC日志 -verbose:gc 这个只会显示总的GC堆的变化,如下: [GC (Allocation Failure) 80832K->19298K...打开GC日志 -verbose:gc -XX:+PrintGCDetails [GC (Allocation Failure) [PSYoungGen:70640K->10116K(141312K...日志存到文件的话,是下面的参数: -Xloggc:/path/to/gc.log 日志补充说明 "[GC"和"[Full GC"说明了这次垃圾收集的停顿类型,如果有"Full"则说明GC发生了"Stop
本文大概阐述和GC日志相关的jvm启动参数的一些内容。.../logs/gc.log 日志文件的输出路径 特殊说明:生产环境gc日志要遵循够用就好的原则,因为gc日志的时间也是会算在stw时间里的,如果gc日志的输出是同步刷盘模式,有可能会因为系统其他...GC日志滚动 -XX:+UseGCLogFileRotation GC日志的输出会发生文件IO,有时候也会造成不必要的停顿,可以将GC日志输出到tmpfs(内存文件系统)中,但tmpfs会消耗内存,为了避免内存被浪费可以使用...,进而导致了gc时间和系统响应时间增大,关于安全点和偏向锁的异常案例,我们也放在下一篇一并列举 补:性能和调优相关特殊参数 1. dump相关参数 这个应该不属于gc日志相关参数,但是都在jvm启动参数里...总结 本篇主要概述了gc日志所涉及到的一些可能需要关注的参数设置,其中提及的一些实际案例,我们后续文章补充;也顺便列举了一些和性能相关的jvm启动参数,在大家平时有遇到类似问题可以当做个参考。
Parallel Scavenge 日志格式 -XX:+PrintGCDetails ?...secs] [Times: user=0.06 sys=0.06, real=0.01 secs] # GC / Full GC 表示 是 YGC 还是 Full GC; # (Allocation...Failure) 表示 触发GC的原因; # PSYoungGen GC 发生的地方,指年轻代; 127520K->20064K(149504K) 分别指 GC回收前年轻代占用的空间,GC 回收后年轻代占用的空间...;(149504K) 是 JVM分配年轻代总的空间; # 127520K->121449K(491008K) 描述的是整个 heap 堆(新生代+老年代), GC回收前占用的空间,GC 回收后占用的空间...;(491008K) 是 JVM分配总的空间; # 0.0136101 secs 指本次GC所消耗的时间; # [Times: user=0.06 sys=0.06, real=0.01 secs]
jdk11默认的GC是G1 JVM常用命令参数 JVM命令可从如下网站查阅: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html...不稳定 -XX开头,下个版本可能取消 这是高级选项,以-XX开头,不建议随意使用。...也不能保证所有JVM实现都支持它们,并且它们可能会发生变化。 下面我们用一段程序,通过调JVM参数,使用JVM命令用不同的GC,看一下运行情况。 开始之前,先普及一下内存泄漏和内存溢出。...通过这段日志可以看到最后通过几次FullGC都没办法清除,最终导致了OOM。...secs] [Times: user=0.01 sys=0.02, real=0.01 secs]」 该句GC日志的含义: 「GC」:YGC,产生在年轻代(新生代)的GC。
深入理解JVM - 解读GC日志 前言 这次的文章会根据实战来介绍如何看JVM的日志,看JVM日志说难也难,说容易也容易,更多的是需要时间去不断的尝试进行总结。...然后看下:eden space 8192K, 48% used,可以看到即使不运行任何的代码我们也使用了4M左右的空间,那么这4M的空间是什么东西呢,这部分对象其实是JVM自身运行产生的一些对象,这里也会放到后面的文章进行解读...堆溢出测试: 下面来看下堆溢出的情况下GC的日志打印了哪些内容,JAVA异常的信息忽略了,因为影响我们看日志: 参数配置: -verbose:gc -Xms20M -Xmx20M -Xmn10M -...接着看一下full gc的日志,可以看到这里直接对于新生代和老年代回收内存之后发现几乎没有空间剩余,还是放不下20M的大对象,所以直接抛出了oom。...如果对于对象分配策略的感兴趣可以阅读之前个人的文章:深入理解JVM虚拟机 - jvm的对象分配策略 写在最后 阅读日志建议更多的是实操和练习,多尝试几遍之后更能加深记忆,由于个人机器本身不跑任何代码也会产生
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志。而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数。...为了认为制造 GC,我们启动时的 JVM 参数固定加上下面几个参数: -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+...下面就让我们来看看油管 GC 的参数有哪些吧。 打印GC日志 在 GC 日志参数中,最简单的一个参数就是打印 GC 日志:-XX:PrintGC。...这个时间戳表示 JVM 启动后到现在所逝去的时间。...保存GC日志 -Xloggc 这个参数可以将 GC 日志输出到文件中保存起来。
文章目录 一、设置 JVM 命令参数输出 GC 日志 二、GC 日志示例 三、GC 日志分析 一、设置 JVM 命令参数输出 GC 日志 ---- 在 IntelliJ IDEA 的启动参数中设置 -XX...日志示例 ---- 运行如下代码 : public class Main { public static void main(String[] args) { Main main...= new Main(); main = null; System.gc(); } } 命令行输出的 GC 日志 : [GC (System.gc()) [PSYoungGen...日志分析 ---- [GC (System.gc()) [PSYoungGen: 7895K->744K(153088K)] 7895K->752K(502784K), 0.0125267 secs]...[Times: user=0.00 sys=0.00, real=0.03 secs] GC (System.gc()) : GC (System.gc()) 表示是开发者手动调用了 System.gc
若要在Idea上打印JVM相应GC日志,其实只需在Run/Debug Configurations上进行设置即可。...其中,-XX:+PrintGCDetails这是收集器日志参数输出,即开启了GC日志输出;-XX:SurvivorRatio=8意味着新生代中Eden区与一个Survivor区的空间比例是8:1。...设置完后,执行代码,即可在IDEA上打印出GC的日志信息: ?
日志。...二、GC日志参数配置 1、堆空间参数 -Xms:初始堆大小 默认物理内存的1/64(小于1GB)空余堆大小小于40%时,JVM就会增大堆直到-Xmx的最大限制 -Xmx:最大堆大小 默认物理内存的1/4...输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2018-06...事件(GC event)开始的时间点 2、0.086:GC事件的开始时间,相对于JVM的启动时间,单位是秒(Measured in seconds) 3、GC :有两种:GC(Minor GC)和...用户耗时、Young GC用户耗时、Young GC实际耗时 常用的GC日志监控工具:jvisualvm、jconsole,这两个都是jdk自带的,在bin目录下。
而且你的程序真的不差你GC时打印日志I/O消耗的那点性能 打印基本 GC 信息 打印 GC 日志的第一步,就是开启 GC 打印的参数了,也是最基本的参数。...所以需要一种分割日志的机制,这个机制嘛……JVM自然是提供的。...JVM 的日志分割 JVM提供了几个用于分割 GC 日志的参数: # GC日志输出的文件路径 -Xloggc:/path/to/gc.log # 开启日志文件分割 -XX:+UseGCLogFileRotation...不使用 JVM 提供的日志分割功能,而是每次启动用时间戳命名日志文件,这样可以每次启动都使用不同的文件,就不会出现覆盖的问题了。...XX:NumberOfGCLogFiles=14 # 每个文件上限大小,超过就触发分割 -XX:GCLogFileSize=100M 配置时间戳作文 GC 日志文件名的同时,也配置JVM的GC日志分割策略
文章目录 概述 GC格式 实例 GC监控 安装GC可视化插件 启动本地进程,监控和分析GC情况 GC日志分析工具 概述 每一种收集器的日志形式都是由他们自身的实现决定的,也就是说每个收集器的日志格式都可能不一样...日志开头的 [GC 和 [Full GC 说明了这次垃圾收集器的停顿类型,而不是用来区分新生代GC还是老年GC的。...如果有 Full ,说明了这次GC发生了Stop-The-World. 如果是调用了System.gc()方法所触发的收集,那么将显示[Full GC (System),如上日志所示。...如果是用的Parallel Scavenge收集器,新生代名则显示为“[PSYongGen”,如日志中显示。 老年代和永久代同理,名称也是由收集器决定的。...---- GC日志分析工具 如果GC日志比较多,一般情况我们不直接阅读,都是通过GC日志分析工具提供的图形化页面来查看。
http://static.cyblogs.com/WechatIMG459.png http://static.cyblogs.com/WechatIMG460.png 如何看GC日志 设置gc日志配置...-XX:+PrintGC 输出简要GC日志 -XX:+PrintGCDetails 输出详细GC日志 -Xloggc:gc.log 输出GC日志到文件 -XX:+PrintGCTimeStamps...输出GC的时间戳(以JVM启动到当期的总时长的时间戳形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800...5、0.0041139 secs表示这次GC总计所用的时间 在JDK 8中,-verbose:gc是-XX:+PrintGC一个别称,日志格式等价与:-XX:+PrintGC,。...-XX:+PrintGCTimeStamps那么日志仅仅比1.1介绍的最前面多了一个时间戳:1.963, 表示从JVM启动到打印GC时刻用了1.963秒。
在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。...产生原因: 年老代(Tenured)被写满 持久代(Perm)被写满 System.gc()被显示调用 上一次GC之后Heap的各域分配策略动态变化 Full GC日志: Metaspace的存储空间...4.Minor GC 日志 PSYounGen:新生代收集算法 2336k:新生代收集前占用的内存 288:新生代收集后占用的内存 2560k:新生代总共大小 8274k:收集前堆的大小 6418k:...时候,程序暂停,多线程开始GC -XX:MaxGCPauseMills:最大停顿时间,单位毫秒;GC尽力保证回收时间不超过设定值。...比如,在用户线程运行过程中,分一半CPU去做GC,系统性能在GC阶段,反应速度就下降一半。 清理不彻底:因为在清理阶段,用户线程还在运行,会产生新的垃圾,无法清理。
Table of Contents GC如何判断对象死活 堆分配策略 垃圾回收算法 jvm监控工具 jvm调优 GC如何判断对象死活 引用计数法 对象被引用一次, 引用计数器+1, 引用失效时, 引用计数器...-1, 当引用计数器为0时,就会通知GC来回收 不能处理循环引用的对象, 所以主流的jvm厂商不会选择这用算法 GC roots可达性分析 从gc roots对象出发, 不可达将被通知GC去回收 gc...重新标记会stop the world 有内存碎片 并发收集, 低停顿 G1 收集器 Garbage First 面向server端 jdk1.7引入 并行并发 分代收集 空间整合 可预测的停顿 jvm...java-rmi.cgi jcmd jcontrol jdeps jinfo jmap jmc.ini jrunscript jstack jstatd jvm...堆设置java物理内存的1/4 官方推荐新生代栈对的3/8 Xms与Xmx 设置一样值, 能够避免jvm因为频繁的GC导致大起大落
在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解。 JVM垃圾判定算法 常见的JVM垃圾判定算法包括:引用计数算法、可达性分析算法。...日志中包含“3329K->744K”,意味着虚拟机并没有因为这两个对象互相引用就不回收它们,说明虚拟机不是通过引用技术算法来判断对象是否存活的。...Object obj = new Object(); PhantomReference pf = new PhantomReference(obj); JVM垃圾回收算法...在介绍JVM垃圾回收算法前,先介绍一个概念。 Stop-the-World Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行,并且这种情形会在任何一种GC算法中发生。...当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态直到GC任务完成。
java堆 对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。...可以位于物理上不连续的空间,但是逻辑上要连续。 程序计数器 内存空间小,线程私有。...一直是句柄地址,速度慢 通过指针,引用时常改变,速度快 垃圾回收与分配策略 概述 程序计数器、虚拟机栈、本地方法栈 3 个区域随线程生灭(因为是线程私有),栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作...(Major GC / Full GC) 发生在老年代的垃圾回收动作,出现了 Major GC 经常会伴随至少一次 Minor GC(非绝对)。...Major GC 的速度一般会比 Minor GC 慢十倍以上。 大对象直接进入老年代,长期存活的对象将进入老年代 java内存模型与线程 ? ?
而且我们还通过代码和堆JVM参数配置,制造出了OOM异常。下面我们就来分析GC回收器的日志信息。...先来看看,OOM后,GC详细日志信息: 编辑 编辑 新生区的伊甸园区GC日志分析 新生区的Eden区的GC,叫法:GC或者是YGC或者是MinorGC或者是轻GC 我们复制一条来分析:...; :新生代总内存大小; :YoungGC前JVM堆内存占用量; :YoungGc后JVM堆内存使用量; :JVM堆内存总大小; :YoungGC耗时 :YoungGC用户耗时; :YoungGC系统耗时...:YoungGC实际耗时 年老代GC日志分析: 年老代GC的叫法:Full GC或者FGC或者MajorGC或者重GC 同样,我们拿出OOM之前的一条GC日志进行分析 [Full GC (Ergonomics①...:GC后堆内存占用 :JVM堆内存总大小 :元空间区 :GC前占用内存 :GC后占用内存 :元空间总大小 :GC耗时 :用户耗时 :系统耗时 :实际耗时 如下图: 编辑 接下来,我们继续学习的是