文章转自 http://qindongliang.iteye.com/blog/2199633,好文要顶,感谢分享!!!

JVM是JAVA世界的核心,了解它有助于我们更好调试,调优和开发程序,最近散仙在看JAVA特种兵一书,看完觉得,作者写的内容还是挺不错,大家感兴趣的,也可以购买本温故而知新下。

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图:

大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常有用的,在这里面了解JVM的GC原理,是非常重要的一块知识。 我们都知道对于一个大型网站,如果JVM频繁发生FULL GC,那么将会是致命的危险,不仅仅会造成网站响应迟钝,更严重的时候会导致系统崩溃,这对用户体验来讲,都是我们不愿意看到的。

在JVM里的内存空间,从大的层面划分,主要有新生代空间(Young)和老年代空间(Old),其中Young空间,又被分为2个部分和3个板块,分别是1个Egen区,和2个Survivor区,看下图:

OK,下面来具体看下,每部分都是干啥的 
(1)Eden区域是用来存放使用new或者newInstance等方式创建的对象,默认都是存放在Eden区,除非这个对象太大,或者超过了设定的阈值-XX:PretenureSizeThresold,这样的对象会被直接分配到Old区域。

(2)2个Survivor(幸存)区,一般称S0,S1,理论上他们是一样大的,解释一下,他们是如何工作的: 
在不断创建对象的过程中,Eden区会满,这时候会开始做Young G也叫Minor GC,而Young空间的第一次GC就是找出Eden区中,幸存活着的对象,然后将这些对象,放到S0,或S1区中的其中一个, 假设第一次选择了S0,它会逐步将活着的对象拷贝到S0区域,但是如果S0区域满了,剩下活着的对象只能放old区域了,接下来要做的是,将Eden区域 清空,此时时候S1区域也是空的。

当第二次Eden区域满的时候,就将Eden区域中活着的对象+S0区域中活着的对象,迁移到S1中,如果S1放不下,就会将剩下的部门,放到Old区域中,只是这次对象来源区域增加了S0,最后会将Eden区+S0区域,清空

第三次和第四次依次类推,始终保证S0和S1有一个是空的,用来存储临时对象,用于交换空间的目的,反反复复多次没有被淘汰的对象,将会放入old区域中,默认是15次。具体的交换过程就和上图中的信息相似。

问题一:怎么定义活着的对象? 
从根引用开始,对象的内部属性可能也是引用,只要能级联到的都被认为是活着的对象

问题二:什么是根? 
本地变量引用,操作数栈引用,PC寄存器,本地方法栈引用等这些都是根。

问题三:对象进入Old区域有什么坏处? 
old区域一般称为老年代,老年代与新生代不一样,年轻代,我们可以认为存活下来的对象很少,而老年代则相反,存活下来的对象很多,所以JVM的 堆内存,才是我们通常关注的主战场,因为这里面活着的对象非常多,所以发生一次FULL GC,来找出来所有存活的对象是非常耗时的,因此,我们应该尽量避免FULL GC的发生。

问题四:S0和S1一般多大,靠什么参数来控制,有什么变化?

一般来说很小,我们大概知道它与Young差不多相差一倍的比例,设置的的参数主要有两个: 
-XX:SurvivorRatio=8 
-XX:InitialSurvivorRatio=8

第一个参数是Eden和Survivor区域比重,注意是一个Survivor的的大小,如果将其设置为8,则说明Eden区是一个Survivor区的8倍,换句话说S0或S1空间是整个Young空间的1/10,剩余的80%由Eden区域来使用。

第二个参数是Young/S0的比值,当其设置为8时,表示s0或s1占整个Young空间的12.5%。

问题五;一个对象每次Minor Gc时,活着的对象都会在s0和s1区域转移,经过经过Minor GC多少次后,会进入Old区域呢?

默认是15次,参数设置-XX:MaxTenuringThreshold=15,计数器会在对象的头部记录它交换的次数

问题六:为什么发生FULL GC会带来很大的危害?

在发生FULL GC的时候,意味着JVM会安全的暂停所有正在执行的线程(Stop The World),来回收内存空间,在这个时间段内,所有除了回收垃圾的线程外,其他有关JAVA的程序,代码都会静止,反映到系统上,就会出现系统响应大幅度变慢,卡机等状态。

举个通俗易懂点的例子,就是在一个房间里,如果有一个人,不停的扔垃圾,然后有一个清洁工不停扫垃圾,这时候,我们的系统是OK的,因为基本不会 出现垃圾堆满房间的情景,而且因为清洁工可以对付过来,假设现在有10个人不停扔垃圾,那么就房间就会很快被堆满,这时候清洁工,由于工作不过来了,大声 吼一声,你们都暂停3分钟,别再扔了,我先把这个房间打扫完,你们才可以扔。 
在这个场景中,一个人扔,一个人扫,就类似于Minor GC,这时候,并不会影响扔垃圾的人,然后一旦10个人同时仍,而且很快就没地方仍了,这时候,就会触发Full GC,然后JVM下令,你们暂时都别仍了,等我什么时候回收完垃圾了,你们在仍,现在大家清楚了吧,所谓的10个人,就是类似我们成千上百的java类, 在不停的执行任务,所谓的清洁工,就是我们的GC机制,所以,大家在平时编码的时候,一定注意尽量少造点垃圾对象,这样触发FULL GC的几率,才会变小。

JDK 8 JVM性能优化相关推荐

  1. JVM性能优化, Part 2 ―― 编译器

    2019独角兽企业重金招聘Python工程师标准>>> ImportNew注:本文是JVM性能优化 – 第2篇 <JVM性能优化, Part 2 ―― 编译器>第一篇 & ...

  2. 【Java架构师】JVM性能优化(一)JVM技术入门下

    JVM性能和"一次编译,到处运行"的挑战 我有新的消息告诉那些固执的认为Java平台本质上是缓慢的人.当Java刚刚做为企业级应用的时候,JVM被诟病的Java性能问题已经是十几年 ...

  3. JVM性能优化之堆区域OOM问题

    本文来说下JVM性能优化之OOM问题 文章目录 概述 堆溢出 堆溢出实践 本文小结 概述 常见内存溢出异常 在JVM内存区域中,除了程序计数器外,Java虚拟机的其他运行时区域都有可能发生OutOfM ...

  4. 性能优化专题 - JVM 性能优化 - 04 - GC算法与调优

    目录导航 前言 Garbage Collect(垃圾回收) 如何确定一个对象是垃圾? 引用计数法 可达性分析 垃圾收集算法 标记-清除(Mark-Sweep) 复制(Copying) 标记-整理(Ma ...

  5. JVM性能优化(一)

    作者 Eva Andreasson Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨 ...

  6. JVM性能优化, Part 1 - JVM简介

    原文出自:http://www.importnew.com/1774.html 众所周知,Java应用程序是运行在JVM上的,但是你对JVM有所了解么?作为这个系列文章的第一篇,本文将对经典Java虚 ...

  7. JVM性能优化之栈区域OOM问题

    本文来说下JVM性能优化之栈区域OOM问题 文章目录 概述 StackOverflowError异常 本文小结 概述 关于虚拟机栈和本地方法栈,分析内存异常类型可能存在以下两种: 如果现场请求的栈深度 ...

  8. JVM性能优化之CPU负载过高

    本文来说下JVM性能优化之CPU负载过高的问题 文章目录 概述 程序测试 问题定位 本文小结 概述 一般性结论:一般来说,CPU占用高不高的问题,不是给定一个数值,例如90%以上就算高,以下就算正常, ...

  9. JVM性能优化, Part 5:Java的伸缩性

    感谢朋友[吴杰]投递本文. JVM性能优化系列文章由Eva Andearsson在javaworld上发表共计5篇文章,ImportNew上有前4篇译文.本文(第5篇)由吴杰翻译自:javaworld ...

最新文章

  1. 苹果电脑安装python3密码_mac系统安装Python3初体验
  2. 实战SSM_O2O商铺_05集成SSM后验证DAO层、Service层、Controller层的配置
  3. Android Gesture 手势识别使用实例 - Android - mobile - ITeye论坛
  4. CentOS 7 + nginx-1.12 + php-7.2 + MySQL-5.7
  5. java监听机制_详解java的事件监听机制和观察者设计模式
  6. centOS 7镜像文件下载
  7. linux svn pacman,【图片】manjaro Linux 中的etc pacman.conf设置错误了,谁发个默认的我看看,谢谢大佬们了_manjaro吧_百度贴吧...
  8. 没想到,我能这么细心地看算法
  9. 看你能坚持读几本书?!——三十本互联网必看书籍
  10. TTL、CMOS和RS232电平的区别和联系
  11. AutoCAD-线型
  12. 如何关闭AutoCAD2016上的“开始”界面、打开CAD就自动新建一个drawing1、“文件”选项卡?
  13. 【HLA】初识HLA/RTI
  14. idea-2017破解教程
  15. 中国科学院大学计算机非全日制,中国科学院大学能考非全日制研究生?
  16. 离阿里最近的机会,来了
  17. Java实现随机生成车牌号
  18. 【英语】maintext2-Emotional Mastery译文
  19. 作为全球最大的乳酸链球菌素生产区,2020年我国乳酸链球菌素产量达到1388.3吨[图]
  20. C语言查询工具的使用

热门文章

  1. 数据库系统概论实验二——创建及管理数据库
  2. 数据预处理-离群值检测与处理
  3. 解决mac 休眠后唤醒死机问题
  4. js添加多marker 高德地图_h5高德地图javascript调起app导航定位多个marker
  5. 分销商城系统开发应用概述详解
  6. 学习手册--没必要装模做样,只有你自己最清楚
  7. 魔百盒CM201-2_YS、ZG、CH、(emmc,nand)_海思3798mv300_全套刷机固件
  8. 除了迅雷,这几款下载神器也超级好用!
  9. java简单学生成绩系统_JAVA 实现简单的学生成绩管理系统
  10. 网卡的 Ring Buffer 详解