理解JVM GC对于我们把控Java应用有很大的帮助。下面我从运维角度,把网上的JVM相关的资料整理如下,以加深对JVM GC的理解。
如有错误的地方,请看官指正。

JVM内存使用分类

JVM的内存分区关系:

  • 【JVM整个堆内存】=年轻代+年老代
  • 【JVM整个内存】= (堆内存) + 非堆内存 = (年轻代 + 年老代) + 持久代

关于年轻代、年老代、持久代

对于JVM来说,内存分为三个区域:年轻代、年老代和持久代。年轻代和年老代用来存放Java进程中的变量,持久代用于放Java类信息。
一般对我们主要关注年轻代和年老代。JVM的分代可以用下面这张图表示:

年轻代分为三个区域:一个Eden区(简称E区域),两个Survivor区(我们定义为S0、S1)。
Java程序新申请的变量会放在E区;当E区满时,所有存活的对象会被移动到S0区。当S0区满时,S0中存活的对象被移动到S1区(这时候S0就空了,E区满时存活的对象会移动到S1区)。当S1区满时,将经历过S0的对象移动到年老代(O区)。S0区和S1区是对等的,这样一个对象要进入持久代会经历E区、S0区、S1区,然后进入到O区。

年老代用于存放从年轻代晋升上来的对象(E区->S0区->S1区->O区),一般我们设置的时候年老大比较大。

使用jstat查看当前Java进程JVM各区的情况

使用方法

jstat -gcutil 进程pid  刷新秒s

举例

[hadoop@localhost ~]$ jstat -gcutil 6572 1s
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673
0.00 0.13 10.61 60.38 63.44 249 117.204 2 1.468 118.673

这里可以看到S0、S1、E、O区各个使用率情况,另外还有gc的次数统计

年轻代和年老代的 GC 关系

由于JVM的内存有限,而Java应用程序不会管理不用的内存,所以JVM需要一种垃圾回收机制(Garbage Collection),这就是JVM GC机制。
目前常见的GC收集器的概况如下:

内存区 GC算法 是否多线程 是否stop-the-world
年轻代 Serial 单线程
年轻代 ParNew 多线程
年轻代 Parallel Scavenge 多线程
年老代 CMS 多线程 整个过程有2次短暂stop-the-world
年老代 Serial Old(MSC) 单线程
年老代 Parallel Old 多线程 unkown

年轻代和年老代都有各自的垃圾回收机制。并且在我们实际使用的时候,是相互搭配的,具体搭配关系见下图:

理解JVM GC的更多相关文章

  1. JVM相关 - 深入理解 System.gc()

    本文基于 Java 17-ea,但是相关设计在 Java 11 之后是大致一样的 我们经常在面试中询问 System.gc() 究竟会不会立刻触发 Full GC,网上也有很多人给出了答案,但是这些答 ...

  2. 深入理解JVM+G1+GC.pdf (中文版带书签)

    目录 序 VII前言 IX 第1章 JVM & GC基础知识 11.1 引言 21.2 基本术语 31.2.1 Java相关术语 41.2.2 JVM/GC通用术语 241.2.3 G1涉及术 ...

  3. 如何避免后台IO高负载造成的长时间JVM GC停顿(转)

    译者著:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下. 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是L ...

  4. 【转】深入理解Major GC, Full GC, CMS

    声明:本文转自http://blog.csdn.net/iter_zc/article/details/41825395,转载务必声明. 很多人都分不清Major GC, Full GC的概念,事实上 ...

  5. 深入理解JVM垃圾收集机制(JDK1.8)

    垃圾收集算法 标记-清除算法 最基础的收集算法是"标记-清除"(Mark-Sweep)算法,分两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 不足: ...

  6. 【转载】Java性能优化之JVM GC(垃圾回收机制)

    文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

  7. 深入理解Major GC, Full GC, CMS

    很多人都分不清Major GC, Full GC的概念,事实上我查了下资料,也没有查到非常精确的Major GC和Full GC的概念定义.分不清这两个概念可能就会对这个问题疑惑:Full GC会引起 ...

  8. 走进JVM【二】理解JVM内存区域

    引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...

  9. Java性能优化之JVM GC(垃圾回收机制)

    Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

随机推荐

  1. Scala学习(一)练习

    Scala基础学习&l练习 1. 在Scala REPL中键人3.,然后按Tab键.有哪些方法可以被应用 在Scala REPL中需要按3. 然后按Tab才会提示. 直接按3加Tab是没有提示 ...

  2. anaconda安装opencv3

    opencv是C和C++语言编写的,很多教程都是基于C++语言进行学习的,可是机器学习最多的库是python写的,所以还是学学python怎么安装opencv3, 面向学习的大都是使用了anacond ...

  3. 《Effective Java》学习笔记 —— 序列化

    Java的序列化API提供了一个框架,用来将对象编码成一个字节流(序列化,serializing),并从字节流中重新创建对象(反序列化, deserializing). 第74条 谨慎地实现Seria ...

  4. SpringBoot日记——错误页处理的配置篇

    在我们访问页面的时候经常会遇到各种问题,比如404,400,500,502等等,可返回的错误页对用户来讲,并不太亲民,所以要定制一下自己的错误页. 我们先访问一个错误页面,看下效果:(虽然给我们提供了 ...

  5. CodeFirst从零搭建ASP.NETCore2.0

    没时间介绍了,废话不说先上车 以下所有扯淡都是建立在.NETCore2.0环境已经搭建好 右键解决方案>新建项目> 选择Web>ASP.NETCoreWeb应用程序(.NET Cor ...

  6. Azure : 通过 SendGrid 发送邮件

    SendGrid 是什么? SendGrid 是架构在云端的电子邮件服务,它能提供基于事务的可靠的电子邮件传递.并且具有可扩充性和实时分析的能力.常见的用例有:1. 自动回复用户的邮件2. 定期发送信 ...

  7. 一款基于Zigbee技术的智慧鱼塘系统研究与设计

    在现代鱼塘养鱼中,主要困扰渔农的就是养殖成本问题.而鱼塘养殖成本最高的就是养殖的人工费,喂养的饲料费和鱼塘中高达几千瓦增氧机的消耗的电费.实现鱼塘自动化养殖将会很好地解决上述问题,大大提高渔农的经济效 ...

  8. Jmeter+ant+Jenkins构建接口自动化测试

    1.已写好jmeter脚本 2.安装ant并将ant-jmeter-1.1.1.jar文件放入ant/lib目录,用于调用jmeter 3.修改jmeter的jmeter.properties文件(将 ...

  9. MIT 6.824 lab1:mapreduce

    这是 MIT 6.824 课程 lab1 的学习总结,记录我在学习过程中的收获和踩的坑. 我的实验环境是 windows 10,所以对lab的code 做了一些环境上的修改,如果你仅仅对code 感兴 ...

  10. EOS 权限管理之-权限的使用

    首先,跟大家说声抱歉,由于之前一直在准备EOS上线的一些工作,所以,很长时间没有更新内容.今天正好有时间,也想到了一些题材,就来说一下这个话题.本文完全是个人见解,如有不当之处,欢迎指出. 前提回顾: ...