1.为什么会有年轻代

我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

2.年轻代中的GC

    HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

3.一个对象的这一辈子

我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了老年代那边,老年代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在老年代里,我生活了20年(每次GC加一岁),然后被回收。

4.有关年轻代的JVM参数

1)-XX:NewSize和-XX:MaxNewSize

用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。

2)-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,这个值也比较重要。

3)-XX:+PrintTenuringDistribution

这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。

4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold

用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。

jvm 中的 “永生代”

“方法区” 主要存储的信息包括:常量信息,类信息,方法信息,而且是全局共享的(多线程共享);

jvm 有多种实现方式(不同的厂商); 并不是所有的jvm 都有永生代的概念;

通常情况下, 很多人把 “方法区” 和“永生代”  对等;  换句话说,是利用“永生代”

去实现“方法区”, 这样可能导致OOM (因为“永生代”的大小是可以通过-XX:PermSize  -XX:MaxPermSize)

设置的; 但是在J9 和JRockit jvm中,方法区使用的内存上限是4G(32位系统可表示的最大范围),不

会存在该问题。

如果利用“永生代”实现“方法区”的垃圾收集, 主要是收集常量池和对类型进行卸载; 通常情况下,这个区域的

收集效率比较低。

一: 常量的回收比较容易

二: 类信息的回收需要满足的条件:

1 . 该类所有的实例已经被回收,JVM中没有任何类的实例;

2.  加载该类的ClassLoader被回收;

3.  该类对应的java.lang.class没有地方引用

Note: 可以使用-verbose:class以及-XX:TraceClassLoading和-XX:TraceClassUnLoading来查看类的加载和卸载情况。

JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】相关推荐

  1. 67.Java垃圾收集机制\对象引用\垃圾对象的判定\垃圾收集算法\标记—清除算法\标记—整理算法\分代收集\垃圾收集器\性能调优

    67.Java垃圾收集机制 67.1.对象引用 67.2.垃圾对象的判定 67.3.垃圾收集算法 67.3.1.标记-清除算法 67.3.2.标记-整理算法 67.3.3.分代收集 67.4.垃圾收集 ...

  2. Tomcat 和 JVM 的性能调优总结

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://rrd.me/enKbC Tomcat性能调优 ...

  3. JVM解读-性能调优实例

    2019独角兽企业重金招聘Python工程师标准>>> JVM性能调优 1 堆设置调优 年轻代大小选择 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选 ...

  4. 一步步带你详解JVM性能调优

    性能调优 性能调优包含多个层次,比如:架构调优.代码调优.JVM调优.数据库调优.操作系统调优等. 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的. 性能调优基本上按照以下步骤进 ...

  5. JVM原理和性能调优

    JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置 2.装载JVM.dll 3.初始化JVM.dll并挂界 ...

  6. Tomcat性能调优-JVM监控与调优

    参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...

  7. 服务器优化:Tomcat、JVM性能调优笔记

    找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建的线程数的设置,当然还 ...

  8. jvm maxgcpausemillis 默认值_Tomcat和JVM的性能调优总结

    Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...

  9. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    参考来自:周志明著 深入理解JAVA虚拟机 https://www.cnblogs.com/therunningfish/p/5524238.html http://www.tuicool.com/a ...

最新文章

  1. python代码检测链表中的环并删除环
  2. 日本农商巨头50年布局多个领域 对话国际农民丰收节贸易会
  3. Oacle 开窗函数 分析函数
  4. 如何将bing搜索页面以HTML Mashup的方式嵌入到SAP C4C页面
  5. python关系图谱_文本分析之制作网络关系图
  6. oracle中只存储两年数据,Oracle中作为永久存储机制的嵌套表的数据追加
  7. 原型磨刀 开源一样的_晚餐也可以像开源一样
  8. hibernate中多对多关系映射时的xml文件
  9. HTML5 FileAPI读取实例---(一)
  10. JavaSE——Java8之函数式接口、函数式编程、Lambda表达式
  11. 【matlab】多维向量的转置
  12. 关于手画猫,耳朵涂颜色
  13. 金九银十,测试思维面试题最新整理!
  14. 3分钟教会你用KaTeX在csdn博客中编辑数学公式
  15. BUUCTF【ez_pz_hackover_2016】
  16. 最近爆火chatGTP是人工智能还是人工智障?
  17. idea ctrl+alt+向左箭头不能用
  18. 查看移动光猫配置文件
  19. JavaScript简单实现论坛发帖(留言)
  20. 高校课堂机器人工程方向教学设计不足与工作反思

热门文章

  1. 小程序 video 控制器外观调整_Razer Kishi 评测:吹破天的手机游戏控制器,真有那么好用吗?...
  2. 简单的proxy之TinyHTTPProxy.py
  3. Integer装箱拆箱、参数传递
  4. android studio 56 下载网络歌曲 代码
  5. 大数据江湖之即席查询与分析(上篇)--即席查询与分析的前世今生
  6. 【错误】Non-static method*** cannot be referenced from a static
  7. 简单的纯JS小游戏--消灭星星
  8. 【Python标准库】base64模块
  9. IndentationError: unindent does not match any outer indentation level问题
  10. 语音处理:音频信号短时平稳性分析