`
san_yun
  • 浏览: 2652059 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

聊聊JVM的年轻代

    博客分类:
  • gc
 
阅读更多

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。

 

5. 常用的配置参数

写道
/duitang/dist/sys/java/bin/java -Djava.util.logging.config.file=/solr/conf/logging.properties -server -Xms8g -Xmx8g -Xmn4g -XX:PermSize=96m -XX:MaxPermSize=256m -XX:+UseCompressedOops -Djava.awt.headless=true -Dsolr.solr.home=/duitang/data/solr -Dorg.apache.lucene.FSDirectory.class=org.apache.lucene.store.NIOFSDirectory -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/solr/endorsed -classpath /solr/bin/bootstrap.jar -Dcatalina.base=/solr -Dcatalina.home=/solr -Djava.io.tmpdir=/solr/temp org.apache.catalina.startup.Bootstrap start

 

分享到:
评论

相关推荐

    年轻代gc jvm crash

    "年轻代GC"是指发生在JVM内存结构中的年轻代区域的垃圾回收过程。年轻代主要分为 Eden区、Survivor区(通常有两个,S0和S1),新创建的对象首先分配到Eden区,然后通过一系列GC周期,存活下来的对象会被移动到...

    JVM技术,反射与动态代理

    Java虚拟机(JVM)是Java程序运行的核心,它负责加载、验证、执行Java字节码,使得开发者可以在任何支持JVM的平台上运行Java程序,实现了“一次编写,到处运行”的理念。本主题将深入探讨JVM技术,特别是反射与动态...

    JVM.zip_JVM代理_classloader

    在Java世界中,JVM(Java虚拟机)是运行所有Java程序的核心,它负责加载、验证、执行字节码,并管理内存。而JVM代理(JVM Agent)和类加载器(ClassLoader)则是两个关键的概念,它们对于深入理解Java应用程序的运行...

    jdk,jvm源码

    常见的垃圾收集算法有标记-清除、复制、标记-整理和分代收集等。 6. 多线程:JVM支持多线程并发执行,每个线程都有自己的程序计数器和虚拟机栈。 7. 安全管理:JVM执行严格的类型检查和权限控制,确保代码的安全性...

    JVM调优实战(转)

    在堆内存中,年轻代是用于存储短生命周期对象的区域,老年代是用于存储长生命周期对象的区域,而持久代是用于存储类的元数据和常量池的区域。方法区是用于存储类的结构信息、字段和方法数据、方法代码和构造函数的...

    JVM设置Young Gen大小

    "JVM设置Young Gen大小"这个话题涉及到的是如何调整Java堆内存中年轻代(Young Generation)的大小,以优化应用程序的性能。年轻代是新生对象的存放区域,它的大小直接影响垃圾收集(Garbage Collection, GC)的频率...

    JVM性能调优总结.docx

    持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。 二、垃圾收集器选择 JVM提供了三种垃圾收集器:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况,因此这里的选择主要...

    jvm调优实战经验

    垃圾回收是JVM自动清理不再使用的对象的过程,分为Minor GC(针对年轻代)和Major / Full GC(针对老年代或整个堆)。不同的垃圾回收器(如Serial、Parallel、CMS、G1等)有不同的回收策略和性能特点,选择合适的GC...

    jvm内存状况查看

    JVM内存主要分为年轻代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)(在Java 8之后被元空间(Metaspace)取代)。年轻代进一步细分为eden区、survivor区(From和To)以及老年代...

    jvm参数设置

    - **Minor GC**:当年轻代中的eden区空间不足时触发,主要回收年轻代中的对象。 - **Full GC**:当老年代空间不足或者系统检测到内存压力过大时触发,会清理整个堆内存,包括年轻代和老年代。 GC策略的选择和配置...

    深入理解JVM&G1; GC

    开发者可以通过调整JVM参数,如设置年轻代与老年代的比例、分配的Region数量、暂停时间目标等,来优化G1 GC的行为,从而达到更好的系统性能。 总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

    jvm常用调优方式

    * -XX:NewRatio=n: 设置年轻代和年老代的比值 * -XX:SurvivorRatio=n: 年轻代中 Eden 区与两个 Survivor 区的比值 * -XX:MaxPermSize=n: 设置持久代大小 收集器设置: * -XX:+UseSerialGC: 设置串行收集器 * -XX:+...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    JVM 深入学习教程深入分析JVM教程!jvm 内存原型,优化等等

    1. 内存参数调整:通过调整-Xms、-Xmx设置堆大小,-XX:NewRatio控制年轻代与老年代比例,-XX:SurvivorRatio设置Eden和Survivor区比例,优化内存分配。 2. 对象池技术:减少频繁创建和销毁对象带来的开销,例如...

    jvm参数设置_JVM参数设置_

    - `-XX:NewRatio`:这个参数用来设置年轻代和老年代的比例。例如,`-XX:NewRatio=3` 表示年轻代与老年代的比例为1:3。调整此比例有助于优化垃圾回收效率。 3. Eden区和Survivor区比例: - `-XX:SurvivorRatio`:...

    jvm 配置jvm参数

    2. **年轻代和年老代配置**:根据经验,年轻代大小设置为总堆大小的1/3,即500MB (`-Xmn500m`)。这样可以平衡年轻代和年老代的空间分配,减少晋升到年老代的对象数量。 3. **线程堆栈大小**:对于大多数应用,128KB...

Global site tag (gtag.js) - Google Analytics