zoukankan      html  css  js  c++  java
  • 转!!Java虚拟机堆的内存分配和回收

    Java内存分配和回收,主要就是指java堆的内存分配和回收。java堆一般分为2个大的区域,一块是新生代,一块是老年代。在新生代中又划分了3块区域,一块eden区域,两块surviver区域。一般称为from surviver和to surviver。这些区域的大小可以自己指定。比如:(-Xms20M 表示可用堆内存大小;-Xmx40M 表示最大堆内存,在堆内存大小不够时,会扩展到最大堆内存;-Xmn10M 表示新生代内存大小)。

    新生代中的对象会在eden区域分配,然后eden区域的内存不够对象分配的时候,会发生一次minor GC。这时候,会把from surviver和eden区域的存活的对象复制到to surviver区域中,这次的to surviver区域变成了下次的form surviver。那么survier区域和eden区域如何按比例划分呢?由于java中很多对象都是朝生夕死的,被分配出来后,马上就会被垃圾回收,存活下来的对象很少,而存活下来的对象都会到surviver区域,所以sun公司觉得surviver区域太大不好,surviver区域大了,eden就小了,这样分配内存的空间就小了。所以sun公司默认surviver 区域和eden区域的比例为 from surviver :to surviver : eden为1:1:8。

    那么大家会觉得,surviver区域的对象每次Minor GC都会存活下来,那么就会越积越多,会不会导致surviver区域存不下呢?答案时,确实会存不下,所以老年代这时候出场了。

    surviver区域的对象,在经过若干次Minor GC之后,会升级成为老年代对象,从而进入老年代。jvm默认时15次gc,新时代还存活就进入老年代。当然,也有可能surviver区域都没有等到15次,surviver却满了,不用担心,这时候jvm会把平均年龄偏大的对象,统统送入老年代中。

    可能大家还有疑问,如果一上来新生成的对象非常大,eden区这小船装不下会怎么办?那也没问题,直接就升级啦,成为老年人啦。不过老年人也是会越来越多的,jvm当然不会容忍这些尸体没人收变成木乃伊,当然要回收它们啦。当老年代内存不够分配的时候,这时候系统就会发生一次FULL GC,把老年代的垃圾也回收了。

    在java虚拟机中,新生代和老年代的垃圾回收是分开的。java虚拟机提供给我们好几个垃圾回收器选择。

    新生代收集器:

    1.Serial收集器,单线程收集器,采用复制算法,由于单线程,所有在java服务器端开发中,肯定不会去用它。

    2.ParNew收集器,是Serial的多线程版本,采用复制算法,可以说是java服务器端首选收集器。 

    3.Parallel Scavenge收集器,多线程,采用复制算法,此收集器最大的特点在可控制垃圾回收的吞吐量,此垃圾收集器适用于非实时和用户交互的服务器,适用于后台跑算法,跑job的服务器。

    老年代收集器:

    1.Serial old, Serial的老年版本。单线程的,采用标记-整理算法,很遗憾,同样不适合服务器中使用。

    2.Parallel old,Parallel Scavenge的老年版本。多线程,标记-整理算法,此收集器和Parallel Scavenge特点一样,这2种收集器搭配,对于跑job的服务器来说,是很不错的,不过还的侃实际应用来配置,万一job任务的时间间隔很短,这时候在gc,可能就有问题,所以也不能一味最求吞吐量。

    3.cms收集器,标记-清除算法,此收集器特点是,垃圾回收停顿时间短,重视服务器响应速度,给用户带来好的体验。

    最后是新生代和老年代通吃的收集器,G1收集器。G1可以说非常强悍,除了吞吐量需求大的,其它的都可以被g1代替了。总之,以后服务器要体验好的,就用g1收集器,要吞吐量大的就用Parallel套装。

  • 相关阅读:
    Windows下Goland的Terminal设置为Git Bash
    BoltDB简单使用教程
    Base64编码转换原理
    [区块链|非对称加密] 对数字证书(CA认证)原理的回顾
    [数据库锁机制] 深入理解乐观锁、悲观锁以及CAS乐观锁的实现机制原理分析
    升级mojave后的小问题解决
    ubuntu安装ssh服务记录
    dubbo+maven多模块项目单元测试
    sass与less
    (转)初识 Lucene
  • 原文地址:https://www.cnblogs.com/wuyun-blog/p/6693442.html
Copyright © 2011-2022 走看看