浅谈Java堆内存分代回收
1.概述
与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我们自动的进行对象占用空间的释放.
下面我们带着几个问题来学习:
- 堆内存是如何分代的?
- 各分代之间是如何配合工作的?
2.堆内存是如何分代的
用一张图片来描述(面积大小不代表实际占用空间大小)
堆内存分为: 年轻代(Young) + 老年代(Old), 年轻代又分为: Eden区 + Survivor区 * 2.
通常年轻代中的各区比值为: Eden区: Survivor0 : Survivor1 = 8:1:1
要尽可能的让对象不进入Old区.
S0和S1默认情况下会动态的自动调整大小, 可以使用-XX:UseAdaptiveSizePolicy
来关闭动态调整.
3.各分代之间是如何配合工作的
以一个对象的在每个区之间的复制来描述这个问题, 我们假定这个对象一直存活着.
当我们写一段如下代码时
User user = new User();
user对象首先被放入到Eden区, 当Eden区满的时候会发生第一次Minor GC, 这时垃圾收集器会在S0和S1中随机选择一个区(假设选中了S0)来存放Eden区剩余存活的对象. 当Eden区再次满的时候会发生第二次Minor GC, 这时垃圾收集器会把Eden区存活的对象 + S0中存活的对象复制到S1中, 当Eden区再次满的时候会发生第三次Minor GC, 这时垃圾收集器会把Eden区存活的对象 + S1中存活的对象复制到S0中, 如此循环复制.
那么对象什么情况下会进入到Old区?
- Eden区满时, 在对象将要进入S0或S1中时, 如果S0或S1存放不下Eden区中某个对象时, 这个对象将被复制到Old区.
- 如果一个对象在S0和S1中经历了指定次数(-XX:MaxTenuringThreshold=15)的复制之后, 会被复制到Old区.
顺便说一下: 年轻代垃圾回收使用 复制算法, 老年代回收使用 标记清除算法.
浅谈Java堆内存分代回收的更多相关文章
- AJPFX浅谈Java 性能优化之垃圾回收(GC)
★JVM 的内存空间 在 Java 虚拟机规范中,提及了如下几种类型的内存空间: ◇栈内存(Stack):每个线程私有的.◇堆内存(Heap):所有线程公用的.◇方法区(Method Area):有点 ...
- 浅谈Java的内存模型以及交互
本文的内存模型只写虚拟机内存模型,物理机的不予描述. Java内存模型 在Java中,虚拟机将运行时区域分成6中,如下图: 程序计数器:用来记录当前线程执行到哪一步操作.在多 ...
- 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位
参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...
- Java虚拟机:JVM内存分代策略
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存 ...
- 转载:JVM内存分代策略
Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略. 为什么要分代? 堆内存是虚拟机管理的内存中最大的一 ...
- JVM内存区域以及各区域的内存溢出异常,内存分代策略,垃圾收集算法,各种垃圾收集器
本文整理自周志明老师的<深入理解Java虚拟机-JVM高级特性与最佳实践>第3版的第二章和第三章. 加上了一些网上拼拼凑凑的图片,个人认为很多博客复制来复制去,最后的东西都看不懂,所以从书 ...
- Android内存管理(11)*常见JVM回收机制「Java进程内存堆分代,JVM分代回收内存,三种垃圾回收器」
参考: http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 1,Java进程内存堆分代: 典型的JVM根据generation(代 ...
- JVM调优-Java垃圾回收之分代回收
为什么要进行分代回收? JVM使用分代回收测试,是因为:不同的对象,生命周期是不一样的.因此不同生命周期的对象采用不同的收集方式. 可以提高垃圾回收的效率. Java程序运行过程中,会产生大量的对象, ...
- 谈JAVA的内存回收(一)
谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...
随机推荐
- Vue --- :is
1.1 基本示例 <div id="app"> <!-- template slot transition --> <input type=" ...
- ORA-00257: archiver error. Connect internal only, until freed……
今天给客户测 试问题,让客户把数据发过来了.解压缩后一看,他们还是用的oracle 815版本的(他们exp导出时,带了导出日志,从导出日志中看出来是oracle 815版本的),不过没有关系,低版本 ...
- 【转】linux scp远程拷贝文件及文件夹
转自:http://www.jb51.net/LINUXjishu/73131.html 1.拷贝本机/home/administrator/test整个目录至远程主机192.168.1.100的/r ...
- Go外包 Go语言外包 Golang外包商 浅谈Go的全局变量和生命周期
最近做Go语言开发,有些心得分享下: Go语言全局var不同于PHP里的全局var,最大区别session 还是app,app 所有人都可以改.session自己改.不同过程之间通用 比如我php ...
- C#中基于GDI+(Graphics)图像处理系列
https://blog.csdn.net/lhtzbj12/article/details/54024821
- 【mysql】字段类型和长度的解释
int(11)最大长度是多少,MySQL中varchar最大长度是多少? int(11)最大长度是多少? 在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度. 这个11代表 ...
- Virtualbox扩展硬盘
动态调整 1.VBoxManage showhdinfo win10.vdi 2.VBoxManage modifyhd win10.vdi --resize 61200 3.磁盘管理器中分配空间并格 ...
- SpringCloud注解和配置以及pom依赖说明
在本文中说明了pom依赖可以支持什么功能,以及支持什么注解,引入该依赖可以在application.properties中添加什么配置. 1.SpringCloud 的pom依赖 序号 pom依赖 说 ...
- [UE4]修改瞬移操作方式,默认正前方
瞬移的时候,如果箭头指向正前方的角度跟中心线相差不大,则可以强制箭头指向中心线. 因为向量也可以表示方向,因此只要只要判断向量长度就是了,判断VectorLength值即可:
- 微信小程序企业给零钱打款 提示未配置api发起,请查看产品中心企业付款配置
商户平台: