zoukankan      html  css  js  c++  java
  • JVM 新生代老年代

      1. Java堆中各代分布:

                              

    图1:Java堆中各代分布

    Young:主要是用来存放新生的对象。

    Old:主要存放应用程序中生命周期长的内存对象。

    Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

     

    2. JVM 使用的GC算法是什么?

    分代收集。

    即将内存分为几个区域,将不同生命周期的对象放在不同区域里;

    在GC收集的时候,频繁收集生命周期短的区域(Young area);

    比较少的收集生命周期比较长的区域(Old area);

    基本不收集的永久区(Perm area)。

     

    3.为什么会有年轻代

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

     

    4.年轻代中的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”区被填满之后,会将所有对象移动到年老代中。

     

    5.一个对象的这一辈子

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

     

    6.有关年轻代的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。

     

    7、堆设置 

    -Xms :初始堆大小 
    -Xmx :最大堆大小 
    -XX:NewSize=n :设置年轻代大小 
    -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 
    -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
    -XX:MaxPermSize=n :设置持久代大小 
    收集器设置 
    -XX:+UseSerialGC :设置串行收集器 
    -XX:+UseParallelGC :设置并行收集器 
    -XX:+UseParalledlOldGC :设置并行年老代收集器 
    -XX:+UseConcMarkSweepGC :设置并发收集器 
    垃圾回收统计信息 
    -XX:+PrintHeapAtGC GC的heap详情
    -XX:+PrintGCDetails  GC详情
    -XX:+PrintGCTimeStamps  打印GC时间信息
    -XX:+PrintTenuringDistribution    打印年龄信息等
    -XX:+HandlePromotionFailure   老年代分配担保(true  or false)
    并行收集器设置 
    -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。 
    -XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间 
    -XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) 
    并发收集器设置 
    -XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。 
    -XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

     

  • 相关阅读:
    部门创建注意问题
    我的技术博客开通啦~
    听侯钟雷老师的讲座,确认了几个问题。
    Dynamics CRM 批量添加用户时,报错:Server was unable to process request.
    汉字的Unicode范围(转)
    转载:Apache1.1 post请求无body的bug
    转载:Android有效解决加载大图片时内存溢出的问题
    2.2之前的webkit crash问题
    转载:Expect:100Continue & HTTP 417 Expectation
    城市旅游问题
  • 原文地址:https://www.cnblogs.com/zq-boke/p/8316863.html
Copyright © 2011-2022 走看看