根据对象的存活率(年龄)Java堆内存划分为3种,新生代,老年代,永久代;

1.新生代

比如我们在方法中区new一个对象,那这方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。

现在的商业虚拟机都采用这种手机算法来回收新生代,新生代中的对象98%都是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块比较小的Survivor空间,每次使用Eden和其中一块Survivor。当会收拾,将Eden和Survivor中还存活的对象一次性放复制到另一块Survivor空间上,最后清理到Eden和刚才用过的Survivor空间,HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%)只有10%的空间会被浪费。

当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖于老年代进行分配担保,所以大对象直接进入老年代。同事,长期存活的对象将进入老年代(虚拟机给每隔对象定义一个年龄计数器)。

来看下面一张图

Minor GC和Full GC

Minor GC:

Minor GC是发生在新生代中的垃圾收集动作,采用的是复制算法。

对象在Eden和From区出生后,在经过一次Minor GC后,如果对象还存活,并且能够被to区所收容,那么在使用复制算法时这些存活的对象就会被复制到to区域,然后清理掉Eden区域和from区域,并将这些对象的年龄设置为1,以后对象在Survivor区域每熬过一次MinorGC,就将对象的年龄加1,当对象的年龄到达某个值时(默认是15岁,可以通过-xx:maxtenuring threshold设置),这些对象就会成为老年代。

但是这也是不一定的,对于一些较大的对象(即需要分配一块较大的拦蓄内存空间)则是直接进入老年代。

Full GC:

Full GC是发生在老年代的来及回收收集动作,采用的是标记-清除、清理算法。

老年代里的对象几乎是在Survivor区熬过啦的,不会那么容易死掉。因为Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比做一次Minor GC的时间长。

另外,如果采用的是标记清除算法的话为产生讯多碎片,伺候如果需要为较大的对象分配内存时,若无法找到足够的连续的内存空间,就会提前出发一次GC。

2.老年代

在新生代中经理了N次垃圾回收后任然存货的对象就会被放到老年代中。而且大对象直接进入老年代。

3.永久代

即方法区。

最新文章

  1. mac,/usr/local is not writable 解决方法
  2. python3 黑板客爬虫闯关游戏(四)
  3. 利用split
  4. Android开源框架——Volley
  5. 网络开始---多线程---NSThread-02-线程状态(了解)(三)
  6. Nutch2.x 演示抓取第一个网站
  7. .net 添加Cookie的4种方法
  8. Visual Studio 2012 主题下的代码配色方案
  9. c库函数之scanf
  10. NAT穿透进行P2P文件传输
  11. java之http协议
  12. Django类方式写view
  13. 逆向工程vgenerator(一)
  14. linux shell 之尝试编写 企业级 启动脚本
  15. HTML5 学习04—— MathML数学标记
  16. 【读书笔记】iOS-iCloud文件备份
  17. i2c_client 几种实例化方法
  18. mybatis 之 parameterType="HashMap"参数包含list
  19. javascript 构造函数类和原型 prototyp e定义的属性和方法的区别
  20. 编写可移植C/C++程序的要点

热门文章

  1. centos7下Zookeeper+sheepdog集群搭建
  2. linux限制用户内存使用
  3. Can I run a local BLAST search again multiple blast databases simultaneously?
  4. EntityFramework 学习 一 DbContext
  5. hive启动时报错 java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D at org.apache.hadoop.fs.Path.initialize
  6. java原生数据类型和引用类型
  7. C/C++ 库函数 是否调用 WinAPI
  8. form表单验证失败,阻止表单提交
  9. Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统
  10. javaScript-基础篇(一)