精华内容
下载资源
问答
  • 方法区用于存放已被加载的类的信息,常量,静态...JVM中的堆一般分为:新生代老年代、永久代 新生代:             用来存放新生的对象,一般占据...

    方法区用于存放已被加载的类的信息,常量,静态变量即时编译器编译后的代码等数据
    方法区–>动态扩容–>OutOfMemoryError
    JDK8开始移除永久代


    JVM中的堆一般分为:新生代、老年代、永久代
    新生代
                用来存放新生的对象,一般占据1/3的空间由于频繁创建对象,所以新生代会频繁出发MinorGC进行垃圾回收
    新生代:Eden区、ServivorFrom、ServivorTo三个区

    • Eden区:java新对象的出生地(如果新创建的对象占用内存很大,直接分配到老年区)。当Eden内存不够的时候,就会触发MinorGC对新生代进行一次垃圾回收
    • ServivorTo:保留了一次MinorGC过程中的幸存者
    • ServivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者
      当JVM无法为新对象分配内存空间时(Eden满了),Minor GC被触发,因此新生代空间占有率越高,Minor GC越频繁
      Minor GC的过程:采用复制算法:
      1:首先,把Eden和ServivorFrom区域中存活的对象复制到ServivorTo区域【如果有对象的年龄达到老年的标准,一般为15,则赋值到老年区】
      2:同时把这些对象的年龄增加1,如果ServivorTo不够位置就放到老年区
      3:然后清空Eden和ServivorFrom中的对象,最后,ServivorFrom 和 ServivorTo互换,原ServivorTo成为下一次GC的ServivorFrom区
      老年代:老年代对象比较稳定,所以Major GC不会频繁执行
      在进行Major GG前一般都先进行了一次Minor GC,使得有新生代的对象晋入老年代,导致空间不够用才触发,当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次Major GC进行垃圾回收腾出空间
      Major GC采用标记-清除算法:
      1:首先扫描一次所有老年代,标记存活的对象
      2:回收没有标记的对象
      Major GC耗时比较长,因为要扫描再回收,Major GC会产生内存碎片,为了减少内存损耗,我们一般进行合并或者标记出来,方便下次直接分配
      当老年代也满了装不下了,就会抛出OOM【out of memory】异常
      永久代:指内存的永久保存区域,主要存放class和Meta(元数据)信息
      class在被加载的时候被放入永久区域,它和存放实例不同,GC不会在主程序运行期间对永久区域进行清理,这导致永久代区域随着类加载的class增多而胀满,最终抛出OOM(Out Of Memory)异常
      在java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代
      元空间
              本质与永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代之间最大的区别在于:元空间不在虚拟机中,而是使用本地内存,因此,默认情况下元空间的大小仅受本地内存限制,类的元数据放入native memory,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而是由系统的实际可用空间来控制
      Major GC 和 Full GC 的区别:
      Full GC:收集young gen、old gen、perm gen
      Major GC:有时又叫 old gc ,只收集 old gen
      PermGen space 与 方法区:
      在这里插入图片描述
    展开全文
  • Java堆可以分为新生代和老年代两个区,其中新生代又可以分为一个Eden区和两个Survivor区,两个Survivor区分别被命名为From和To以示区分,新生代老年代的比例为1:2,它们共同组成堆的内存区,所以新生代占堆的1/3...

    Java堆可以分为新生代和老年代两个区,其中新生代又可以分为一个Eden区和两个Survivor区,两个Survivor区分别被命名为From和To以示区分,新生代和老年代的比例为1:2,它们共同组成堆的内存区,所以新生代占堆的1/3,老年代占2/3,但这个比例可以修改,下面分别来介绍一下新生代和老年代。

    1、【新生代】

    新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其中一块Survivor(From),在经过一次Minor GC后,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor空间上(这里使用的复制算法进行GC),最后清理掉Eden和刚才用过的Survivor(From)空间。将此时在Survivor空间存活下来的对象的年龄设置为1,以后这些对象每在Survivor区熬过一次GC,它们的年龄就加1,当对象年龄达到某个年龄(默认值为15)时,就会把它们移到老年代中。

    在新生代中进行GC时,有可能遇到另外一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代;

    总结:

    1、Minor GC是发生在新生代中的垃圾收集,采用的复制算法;

    2、新生代中每次使用的空间不超过90%,主要用来存放新生的对象;

    3、Minor GC每次收集后Eden区和一块Survivor区都被清空;


    2、【老年代】

    老年代里面存放都是生命周期长的对象,对于一些较大的对象(即需要分配一块较大的连续内存空间),是直接存入老年代的,还有很多从新生代的Survivor区域中熬过来的对象。

    老年代中使用的是Full GC,Full GC所采用的是标记-清除算法。老年代中的Full GC不像Minor GC操作那么频繁,并且进行一次Full GC所需要的时间要比Minor GC的时间长。

    总结:

    1、老年代中使用Full GC,采用的标记-清除算法

    展开全文
  • jvm java虚拟机 新生代的配置

    万次阅读 2016-04-04 10:31:46
    设置一个较大的新生代会影响老生代的大小,因为这两者的总和是一定的,这个系统参数对于系统性能以及GC行为有很大的影响,新生代一般设置为整个堆空间的1/3 到1/4左右最合适。 参数-XX:SurvivorRatio用来设置新生代...

    1.1.1.1. -Xmn参数

    参数-Xmn1m可以用于设置新生代的大小。设置一个较大的新生代会影响老生代的大小,因为这两者的总和是一定的,这个系统参数对于系统性能以及GC行为有很大的影响,新生代一般设置为整个堆空间的1/31/4左右最合适。

    参数-XX:SurvivorRatio用来设置新生代中eden空间和from/to空间的比例,公式如下:

    -XX:SurvivorRatio=eden/from =eden/to

    解释:fromto之间的两块区间内存是相等的。可以参考

    java虚拟机 jvm java堆 方法区 java栈这篇文章,下面的输出也会印证fromto之间的两块区间内存是相等的。

    使用不同的堆分配参数确实有很大的影响,下面开始验证影响。

    下面代码是循环十次每次申请1M的空间一共申请10M,代码如下:

    byte[] b = null;
    for (int i = 0; i < 10; i++) {
    b = new byte[1 * 1024 * 1024];
    }


    1.1.1.2. 第一种情况:-Xmx20m -Xms20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails

    配置上面的参数程序的输出如下:

    [GC [DefNew: 512K->256K(768K), 0.0010949 secs] 512K->377K(20224K), 0.0011182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    Heap

     def new generation   total 768K, used 488K [0x335d0000, 0x336d0000, 0x336d0000)

      eden space 512K,  45% used [0x335d0000, 0x3360a2e0, 0x33650000)

      from space 256K,100% used [0x33690000, 0x336d0000, 0x336d0000)

      to   space 256K,  0% used [0x33650000, 0x33650000, 0x33690000)

     tenured generation   total 19456K, used 10361K[0x336d0000, 0x349d0000, 0x349d0000)

       the space 19456K,  53% used [0x336d0000, 0x340ee730, 0x340ee800, 0x349d0000)

     compacting perm gen  total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)

       the space 12288K,   1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)

        ro space 10240K,  45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)

        rw space 12288K,  54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)

    设置的edenfrom的比例是2:1 from=to 这里前面说过,输出也确实证明是相等的。所以eden512K,新生代我们分配的是1M=512K+256K+256k=1024K=1M,总的可用的新生代为512K+256K=768K;

    由于新生代的eden区域的内存为512K我们每次申请的空间是1M,所以没有办法容纳,因此触发了一次GC垃圾回收,对eden区域的内存进行了部分的回收,新生代没有内存容纳1M的内存还是不够存储,所以数组都被分配到老生代,老生代最终占用了10361K空间。

    1.1.1.3. 第二种情况:-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails

    第二种情况将新生代内存扩大到7M,输出如下:

    [GC [DefNew: 2795K->1498K(5376K), 0.0018315 secs] 2795K->1498K(18688K), 0.0018637 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    [GC [DefNew: 4687K->1024K(5376K), 0.0011140 secs] 4687K->1498K(18688K), 0.0011327 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    [GC [DefNew: 4125K->1024K(5376K), 0.0004712 secs] 4599K->1498K(18688K), 0.0004903 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    Heap

     def new generation   total 5376K, used 3163K [0x335d0000, 0x33cd0000, 0x33cd0000)

      eden space 3584K, 59% used [0x335d0000, 0x337e6d38, 0x33950000)

      from space 1792K, 57% used [0x33b10000, 0x33c10010, 0x33cd0000)

      to   space 1792K,  0% used [0x33950000, 0x33950000, 0x33b10000)

     tenured generation   total 13312K, used 474K[0x33cd0000, 0x349d0000, 0x349d0000)

       the space 13312K,   3% used [0x33cd0000, 0x33d468e0, 0x33d46a00, 0x349d0000)

     compacting perm gen  total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)

       the space 12288K,   1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)

        ro space 10240K,  45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)

        rw space 12288K,  54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)

    在这个参数下eden的内存为3584K所以可以有空间存储数组,所以数组先被分配到这个eden区,但是还不能完全预留全部的10M内存,所以运行的时候产生了3GC垃圾回收,因为程序申请内存的时候,变量失去了上一次的引用指针。所以是在新生代中进行GC垃圾回收。最终的结果:所有的内存都被分配到新生代进行,通过GC保证了新生代有足够的空间存储。而没有进入老年代,只是在GC过程中,部分新生对象晋升到老年代。

     

    1.1.1.4. 第三种情况:-Xmx20m -Xms20m -Xmn15m -XX:SurvivorRatio=8 -XX:+PrintGCDetails

    第三种情况将新生代内存扩大到15M,输出如下:

    Heap

     def new generation   total 13824K, used 11223K [0x335d0000, 0x344d0000, 0x344d0000)

      eden space 12288K,  91% used [0x335d0000, 0x340c5f50, 0x341d0000)

      from space 1536K,  0% used [0x341d0000, 0x341d0000, 0x34350000)

      to   space 1536K,  0% used [0x34350000, 0x34350000, 0x344d0000)

     tenured generation   total 5120K, used 0K[0x344d0000, 0x349d0000, 0x349d0000)

       the space 5120K,   0% used [0x344d0000, 0x344d0000, 0x344d0200, 0x349d0000)

     compacting perm gen  total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)

       the space 12288K,   1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)

        ro space 10240K,  45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)

        rw space 12288K,  54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)

     

    在这次的测试中,新生代被分配15M内存,eden的内存是12288K所有这个区域完全可以容纳10M的内存数组,所以所有的分配都是在eden直接进行,并没有触发GC垃圾回收,因此from/to和老年代tenured使用率都是0.

    通过上面的例子,发现不同的堆分配策略对系统执行的影响还是很大。所以在实际开发中,还是要合理的设置值,基本策略:尽可能将对象预留在新生代,减少老年代GC次数。(第一种情况对象都被分配到老年代,老年代肯定要进行GC垃圾回收)

    1.1.1.5. -XX:NewRatio参数

    -XX:NewRatio参数主要设置新生代和老年代的比例。公式如下:

    -XX:NewRatio=老年代/新生代

    1.1.1.6. 第四种情况:-Xmx20m -Xms20m  -XX:NewRatio=2 -XX:+PrintGCDetails

    第四种参数设置为:-Xmx20m -Xms20m  -XX:NewRatio=2 -XX:+PrintGCDetails 程序的输出如下:

    [GC [DefNew: 4899K->474K(6144K), 0.0016090 secs] 4899K->1498K(19840K), 0.0016426 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    [GC [DefNew: 5768K->0K(6144K), 0.0011308 secs] 6792K->2522K(19840K), 0.0011490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

    Heap

     def new generation   total 6144K, used 1134K [0x335d0000, 0x33c70000, 0x33c70000)

      eden space 5504K,  20% used [0x335d0000, 0x336eb8c8, 0x33b30000)

      from space 640K,   0% used [0x33b30000, 0x33b30088, 0x33bd0000)

      to   space 640K,   0% used [0x33bd0000, 0x33bd0000, 0x33c70000)

     tenured generation   total 13696K, used 2522K [0x33c70000, 0x349d0000, 0x349d0000)

       the space 13696K,  18% used [0x33c70000, 0x33ee6878, 0x33ee6a00, 0x349d0000)

     compacting perm gen  total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)

       the space 12288K,   1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)

        ro space 10240K,  45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)

        rw space 12288K,  54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)

    因为堆空间分配的内存为20M,老年代和新生代比例我们设置的是2:1,所以新生代的内存大约是6144K 老年代的内存是13696K由于新生代Gc的时候,from/to的内存容纳不下任何一个1m数组对象,影响了新生代的正常回收,所以对象都跑到老年代空间了。因此导致两个1MB数组进入老年代,(新生代GC,还有1M数组幸存,按理说应进入from/to但是from/to只有640K空间不足)

    注意:

     -XX:SurvivorRatio可以设置eden区与Survivor区比例,-XX:NewRatio可以设置老年代新生代的比例。

    完成的公式如下图所示:




    展开全文
  • 通过前面两篇博客的铺垫:java虚拟机JVM–java虚拟机的结构, java虚拟机JVM–java虚拟机垃圾的回收机制详解, 本篇将从JVM的内存如何分配的以及内存是如何回收的 角度来介绍java虚拟机的内存管理,来回答这一个遗留下...

    前言
    在上一篇博客中,还遗留了一个问题:JVM的内存如何分配最高效?换一种说法就是:JVM的内存是如何的分配以及回收的?通过前面两篇博客的铺垫:java虚拟机JVM–java虚拟机的结构, java虚拟机JVM–java虚拟机垃圾的回收机制详解, 本篇将从JVM的内存如何分配的以及内存是如何回收的 角度来介绍java虚拟机的内存管理,来回答这一个遗留下的的问题。

    再贴一下JVM内存结构图:

    å¨è¿éæå¥å¾çæè¿°

    学java时应该看过这么一句话:new 出来的对象都是在堆中的。事实上, 堆内存是JVM中最大的一块内存, 而GC也是针对堆内存进行回收,所以下面我们将进入堆内存, 去看看堆内存的结构。

    内存的分配及回收–堆中的新生代和老年代
    java堆被分为两部分, 一部分被称为新生代, 一部分称为老年代, 他们的比例通常为 1:2:

    å¨è¿éæå¥å¾çæè¿°

    新生代
    新对象被创建后一般来说都是进入新生代。新生代的特点是每次垃圾回收都需要回收大量的对象。JAVA中的对象大多数都是朝生夕死,所以很多对象创建后很快就没用了,需要被回收,所以在新生代中垃圾回收算法是使用了前一篇博客介绍到的 复制算法, 因为这样是最高效的,所以我们把新生代又划分为了三个区域,一个Eden区, 两个Survivor区,比例为 8:1:1,这种比例提升了复制算法的内存使用效率

    å¨è¿éæå¥å¾çæè¿°每次对象会存在于Eden区和一个Survivor区, 当Eden内存不够时,触发GC(Minor gc),然后把依然存活的对象复制到另一个空白的Survivor区, 然后直接清空其余新生代内存,然后如此循环总有一个Survivor区是空白的。每进行一次GC,存活对象的年龄+1, 默认情况下,对象年龄达到15时,就会移动到老年代中。

    在发生Minor GC时,虚拟机会检查每次晋升进入老年代的大小是否大于老年代的剩余空间大小,如果大于,则直接触发一次Full GC,否则,就查看是否设置了-XX:+HandlePromotionFailure(允许担保失败),如果允许,则只会进行MinorGC,此时可以容忍内存分配失败;如果不允许,则仍然进行Full GC(这代表着如果设置-XX:+Handle PromotionFailure,则触发MinorGC就会同时触发Full GC,哪怕老年代还有很多内存,所以,最好不要这样做)。

    老年代
    老年代的特点是每次回收都只回收少量对象。当对象的年龄达到15就会存放到老年代,还有一种情况就是对象需要分配较大空间是,也会直接存放到老年代,从上面的图也可看出, 老年代的空间是要比新生代大的。老年代空间大的原因在于, 老年代的对象都是生命周期比较长的, 会被引用的时间比较久,如果GC太频繁,会严重影响效率,因为每次被回收的对象总是很少的, 确需要把整个老年代扫一次, 所以给老年代分配更多空间,减少GC回收的频次,有利于提升效率。这就是为什么新生代和老年代的比例为 1:2.

    针对老年代的特点,采用的垃圾回收算法是标记整理算法, 就是将标记不回收的对象移动到一端,然后清除边界以外的内存。

    老年代的GC(MajorGC)触发,一般都伴随着新生代的GC,因为新生代触发一次GC,就可能有对象年龄大于15而移动到老年代, 导致老年代内存满了。Major GC的速度一般会比Minor GC慢10倍以上

     

    永久代
    在上图中的方法区, 还画了一个永久代。我们都知道方法区中(即永久代)存放类及方法的信息、静态常量等(在JDK1.7以前,不包括1.7)。但是类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。所以从JDK 1.7开始, 存在于永久代的常量池移动到了 堆区中,从JDK1.8开始,就没有永久代了, 永久代被元空间的概念所替代。

    元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过参数来指定元空间的大小。
     

     

     

    Full GC(清理整个堆空间,包括年轻代和老年代): 触发条件    https://www.toutiao.com/a6758583528897643012/  

    (1)System.gc()方法的调用

    此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI(Java远程方法调用)调用System.gc。

    (2)老年代空间不足MinorGC后存活的对象超过了老年代剩余空间 或者新生代创建大的对象)

         如果创建一个大对象(需要大量连续存储空间)会直接分配到老年代、长期存活的对象晋升到老年代,老年代空间不足以存放这些对象的时候会触发Full GC。

    (3) Minor GC晋升到老年代的平均大小大于老年代的剩余空间

    在发生Minor GC前,会检查老年代是否有足够的连续空间,如果当前老年代最大可用连续空间小于平均历次晋升到老年代大小,则触发Full GC。

    (4) PermGen(永久代)或Metaspace(元空间)不足

    在JDK8之前的版本中,PermGen(永久代)是HotSpot虚拟机中方法区的一种实现,它用于存放类的信息、常量、静态变量等数据,当系统中要加载的类、反射的类等较多时,永久代出现空间不足,在未配置为采用CMS GC的情况下会触发Full GC。

    在JDK8中移除了永久代,改用了Metaspace,它也是方法区的一种实现,不过它与永久代最大的区别是Metaspace并不在虚拟机中,而是使用本地内存。当Metaspace空间不足进行回收时,需同时满足如下三个条件的类才会被卸载:该类所有的实例都已经被回收、加载该类的ClassLoader已经被回收、该类对应的java.lang.Class对象没有任何地方被引用,进而触发Full GC。可采用的方法为增大Perm Gen空间或转为使用CMS GC

    (5)  CMS GC异常
    promotion failed:MinorGC时,survivor空间放不下,对象只能放入老年代,而老年代也放不下造成concurrent mode failure:GC时,同时有对象要放入老年代,而老年代空间不足造成

     

    原文:https://blog.csdn.net/qq475703980/article/details/79982759
              https://blog.csdn.net/weixin_39788856/article/details/80388002

    展开全文
  • Java虚拟机(JVM)你只要看这一篇就够了!

    万次阅读 多人点赞 2018-08-14 12:55:02
    根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。 1.1.1 程序计数器 内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节...
  • -XX:+HandlePromotionFailure 老年代分配担保(true or false) 并行收集器设置  -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。  -XX:MaxGCPauseMillis=n :设置并行收集...
  • 新生代中的复制算法会从Eden区将对象复制到survivor区,那对象晋升到老年代是通过什么方式呢?
  • Java虚拟机(JVM)面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:26:32
    HotSpot虚拟机对象探秘对象的创建为对象分配内存处理并发安全问题对象的访问定位句柄访问直接指针内存溢出异常Java会存在内存泄漏吗?请简单描述垃圾收集器简述Java垃圾回收机制GC是什么?为什么要GC垃圾回收的优点...
  • java新生代 老年代 永久代

    千次阅读 2017-05-11 20:51:50
    新生代回收:(复制算法) 在堆中,新生代主要存放的是哪些很快就会被GC回收掉的或者不是特别大的对象(是否设置了-XX:PretenureSizeThreshold 参数)。复制算法的新生代分为3个区:较大的Eden和两个较小的...
  • 图1:Java堆中各代分布 Young:主要是用来存放新生的对象。 Old:主要存放应用程序中生命周期长的内存对象。 Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被...
  • java虚拟机收集器之老年代收集器

    千次阅读 2016-06-28 11:35:05
    java虚拟机收集器之老年代收集器Serial Old收集器Serial Old收集器是Serial收集器的老年代版本,同样是一个单线程收集器,使用“标记-整理”算法。这个收集器的主要意义也是在于Client模式下的虚拟机使用。 主要...
  • java虚拟机老年代回收GC---CMS

    千次阅读 2018-05-22 13:54:56
    转自:http://www.iteye.com/topic/11194911.总体介绍:CMS(Concurrent Mark-Sweep)是以...在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。2...
  • 64位操作系统的jvm虚拟机新生代GC最大年龄为15后转为老年代的原因 我们所知道的对象布局中对象头中会存储对象的GC状态,而这个GC状态也就有对象的GC年龄。而在对象头中,它是由4位数据来对GC年龄进行保存的,所以...
  • java虚拟机

    2018-05-11 15:25:26
    是垃圾收集的主要区域("GC 堆"),现代的垃圾收集器基本都是采用分代收集算法,该算法的思想是针对不同的对象采取不同的垃圾回收算法,因此虚拟机Java 堆分成以下三块: - 新生代(Young Generation) - 老年代...
  • 新生代回收:(复制算法)在堆中,新生代主要存放的是哪些很快就会被GC回收掉的或者不是特别大的对象(是否设置了-XX:PretenureSizeThreshold 参数)。复制算法的新生代分为3个区:较大的Eden和两个较小的Survivor...
  • 实战java虚拟机 学习笔记 认识java虚拟机的基本结构 一、 java虚拟机的基本结构 1. 类加载子系统:负责从文件系统或者网络中加载class信息。 2. 方法区:1加载的类信息放在方法区,方法区还会包括运行时...
  • Java虚拟机

    2016-03-30 21:25:29
    java虚拟机Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么。正是得益于Java虚拟机,它号称的“一次编译,到处...
  • 本文为学习笔记,参考《深入理解Java虚拟机:JVM高级特性与最佳实践》一书。该书内容是基于JDK 1.7的,会具有一定的滞后性, 与现在Java虚拟机的状况不一定完全吻合。如想了解现在的Java虚拟机标准可以参考Java...
  • java新生代老年代的垃圾回收规则

    千次阅读 2019-05-05 19:45:07
    java新生代分为两部分:Eden区和两个Survivor区,它们的比例是8:1:1,两个Survivor区又分为 fromSurvivor区和to Survivor区,其中新生代每次进行Minor GC(新生代的GC)之前,to Survivor区一定是空的。 每当新创建...
  • Java JVM 8-java新生代老年代的划分及回收算法

    万次阅读 多人点赞 2018-06-17 11:39:21
    Java堆(Java Heap)是JVM所管理的最大内存区域,也是所有线程共享的一块区域,在JVM启动时创建。  此内存区域存放的都是对象的实例和数组。JVM规范中说到:”所有的对象实例以及数组都要在堆上分配”。  Java堆...
  • 《深入理解Java虚拟机》个人读书总结——JAVA虚拟机内存
  • java 持久代 新生代 老年代

    千次阅读 2019-06-10 21:52:51
    持久代(jdkq1.7),jdk1.8被称为元数据区 元数据区主要是java程序代码的代码区和数据区 java程序中类(class)会被加载到整个区域的不同数据结构中去,包括常量池、域、方法数据、方法体、构造函数、以及类中的专用...
  • 总计有5个系列实战Java虚拟机之一“堆溢出处理”实战Java虚拟机之二“虚拟机的工作模式”实战Java虚拟机之三“G1的新生代GC”实战Java虚拟机之四“禁用System.gc()”实战Java虚拟机之五“开启JIT编译” 新生代GC的...
  • 这是我在学习周志明的《深入理解Java虚拟机》的第一篇总结,我的目标是每学习一章,总结一次。 Java虚拟机是什么,我们这里就不说了,我们直接进入正题 Java虚拟机运行时数据区域的五大块 Java...
  • JAVA虚拟机

    2018-01-18 18:13:51
    JAVA虚拟机术语程序虚拟机。二、虚拟机参数:1.-XX:+PrintGC :每次触发GC的时候打印相关日志; -XX:+PrintGCDetails:更详细的GC日志; -Xms:堆初始值; -Xmx:堆最大可用值。 总:在实际工作中,我们可以直接将初始的...
  • 浅读Java虚拟机

    2018-04-01 22:54:19
    理解Java虚拟机结构是Java从业人员必备技能,下面描述Java虚拟机结构、垃圾收集器与内存分配策略,在排查java性能问题以及性能优化时大有帮助,掌握Java虚拟机20%的知识能解决工作中80%的Java性能诊断及优化(与JVM...
  • JAVA虚拟机的内存划分 1、程序计数器 当前线程所有的字节码的行号指示器,是线程独有的一块内存。 2 、JAVA虚拟机栈 线程私有的,用于存放局部变量表、操作栈、动态链接、方法出口等。 3、本地方法栈 存放本地方法中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,304
精华内容 15,321
关键字:

java虚拟机新生代老年代

java 订阅