JVM GC原理和监控

摘要:
3.Jvmgc监控命令:jstat gcutilid No.采样间隔采样次数执行结果:S0:S0区域使用率;S1:S1区域使用率E:Eden区域使用率O:Old区域使用率P:永久发电区域使用率YGC:YoungGC乘以YGCT:YoungGC总消耗时间FGC:FullGC乘以FGCT:FullGC总时间GCT:垃圾收集总消耗时间

1、JVM内存空间
JVM内存空间,包含新生代空间(Young)和老年代空间(Old)。新生代空间又被分为2个部分,Eden区域和Survivous区域;Survivous区域分为2个板块,s0(To survivous)和s1(From Survivous);

JVM GC原理和监控第1张

每个部分的具体作用:
Eden区域:用来存放使用new或者newInstance等方式创建的对象,默认这些对象都是存放在Eden区,除非这个对象太大,或者超出了设定的阈值-XX:PretenureSizeThresold,这样的对象会被直接分配到Old区域。
S0区域:用来存放垃圾minor GC时不能被回收的对象;
S1区域:中转站
老年代空间:用于存放s0区域空间不足无法保存的不能被回收的对象;

2、JVM GC原理
第一次young GC:
在不断创建对象的过程中,当Eden区域被占满,此时会开始做Young GC也叫Minor GC,Young GC过程如下:
1)将Eden区域不能被回收的对象,存储到s0区域;若s0区域被占满了,Eden区域剩下不能被回收的对象存放到old区域;
2)将Eden区域全部清空,此时s0区域也是空的;
3)将s0和s1切换标签,即把之前不能回收的对象转移到s1区域,保证s0区域为置空状态,供第二次young gc使用;

第二次young gc:
1)将Eden区域不能被回收的对象和s1中的对象,存储到s0区域;若s0区域被占满了,Eden区域剩下不能被回收的对象存放到old区域;
2)将Eden区域全部清空,此时s0区域也是空的;
3)将s0和s1切换标签,即把之前不能回收的对象转移到s1区域,保证s0区域为置空状态,供第二次young gc使用;

以此类推,young gc的次数,默认为15次,可通过参数--XX:MaxTenuringThreshold=15 配置,当old区域被占满时,就会触发FULL GC 对整个空间进行清空处理;
在发生FULL GC的时候,意味着JVM会安全的暂停所有正在执行的线程(Stop The World),来回收内存空间,在这个时间内,所有除了回收垃圾的线程外,其他有关JAVA的程序,代码都会静止,反映到系统上,就会出现系统响应大幅度变慢,卡机等状态。

3、jvm gc监控
监控命令:
jstat -gcutil pid号 采样间隔(ms) 采样次数

执行结果:

JVM GC原理和监控第2张

 S0:S0区域使用比例;

S1:S1区域使用比例
E:Eden区域使用比例
O:Old区域使用比例
P:永久代区域使用比例
YGC:Young GC次数
YGCT:Young GC消耗总时间
FGC:Fu'll GC次数
FGCT:Full GC总时间
GCT:垃圾回收消耗总时间

免责声明:文章转载自《JVM GC原理和监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇css实现字体小于12pxSpringCloud 之 Netflix Hystrix 服务监控下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

执行sparksql出现OOM问题

一开始使用yarn-client模式提交作业时一切正常,但换成cluster模式下使用sparksql方法执行hive查询语句时,却出现了如下的OOM问题: Exception in thread "Thread-3" java.lang.OutOfMemoryError: PermGen space 出现这个错误原主要原因是太多的类或者太大的类都被加载...

JVM调优总结 Xms Xmx Xmn Xss

转http://unixboy.iteye.com/blog/174173 堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物...

JVM学习笔记之CodeCache

一. CodeCache简介 从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code)。当然JNI(Java本地接口)的机器码也放在codeCache里,不过JIT编译生成的native code占主要部分。 大致在JVM中的分布如下: 大家都知...

JVM内存结构、垃圾回收那点事(转)

翻看电脑的文件夹,无意看到了9月份在公司做的一次分享,浏览了一下"婆婆特",发现自己在ppt上的写的引导性问题自己也不能确切的回答出来,哎,知识这东西,平时不常用的没些日子就生疏了。于是,本小白决定把他整理下来,不敢班门弄斧,对于入门的同学可以快速了解虚拟机的大概,有错误的地方请批评指正。 一、java虚拟机的内存结构     方法区:线程共享,存放已被...

JVM调优之经验

在生产系统中,高吞吐和低延迟一直都是JVM调优的最终目标,但这两者恰恰又是相悖的,鱼和熊掌不可兼得,所以在调优之前要清楚舍谁而取谁。一般计算任务和组件服务会偏向高吞吐,而web展示则偏向低延迟才会带来更好的用户体验。 本文从性能和经验上来分享一下JVM参数的设置。 调优之前可以先用-XX:+PrintFlagsFinal来查看虚拟机是否默认开启某参数,不同...

hs_err_pid.log日志,有趣的两个Jvm参数

遇到一个很有意思的问题,Jvm进程因系统资源不足时会被操作系统kill掉,当守护进程重新拉起该进程时,会产生一个日志文件:hs_err_pid.log,默认情况下这个日志会被生成到工作目录下。今天为了修改这个默认路径,复现了一下Jvm进程OOM后Crash的情况。 那么OOM究竟会不会导致Jvm进程被Crash掉呢?今天上网查了下资料和自己测试了下,结果是...