Java内存回收(垃圾回收)机制总结
一、背景:
Java程序员编写程序时,对于新建的对象,当不再需要此对象时,不必去释放这个对象所占用的空间,这个工作是由Java虚拟机自己完成的 ,即内存回收或垃圾回收。
二、如何知道一个对象所占用的空间可以回收了呢?
1.常用的一种算法是引用计数法,如果一个对象的引用为0了,那就可以回收了。但是对于这种方法致命缺陷,当对象之间存在循环引用的时候,A引用B,B引用A,这样A和B的引用就一直不会为0,那就无法回收了。
2、Java采用的算法为根搜索算法,以一系列GC Roots为起点,向下搜索,如果存在引用,则对象依然在用,不能回收;如果不存在引用,则可以回收。
可以作为GC Roots的有如下几种:
a、虚拟机栈(栈帧中的本地变量表)中的引用的对象
b、方法区中的类静态属性引用的对象
c、方法区中的常量引用的对象
d、本地方法栈中JNI的引用的对象
三、java堆栈内存结构划分:
1.新生代(Young Generation):又细分为三块(eden,S0,S1)
新的对象总是在新生代创建。
2.老年代(Old Generation)
在新生代存放一定时间之后,在新生代空间不够时,对象会被移到老年代。
3.永久代(Permanent)
用于存在类信息。对于动态生成的类,后续不会再使用到,所以可以进行回收。
四、为什么采用分代(区)的方式来进行堆栈空间的管理呢?
五、主要的空间回收算法:
1.复制算法
对于新生代,划分了eden/S0/S1三块区域,开始对象创建在eden区域上。
下面来描述一下可能的操作过程,各个java虚拟机的实现会有差异,下面是大致进行阐述。
第一次清理的时候,将可以清除的对象删除,将要保留的对象都复制到S0区域,eden区域清空,对象年龄标记增长1;
第二次清理的时候,将可以清除的对象删除,将要保留的对象从eden和S0都复制到S1,并将eden和S0都清空,对象年龄标记增长1;
第三次清理的时候,将可以清除的对象删除,将要保留的对象从eden和S1都复制到S0,并将eden和S1都清空,对象年龄标记增长1;
后续清理的时候,以此重复上面的步骤,当对象的年龄达到一定值时,就被移到老年代中去。
对于上面的过程,可以通过jvisualvm观测到,会发现eden和S0同时被清空,对象转移到S1,或eden和S1同时被清空,对象转移到S0.
下面给出两张jvisualvm的截图:
时刻1:
时刻2:
时刻3:
通过上面三张图对比可以看到,当S0被占用时,S1就是空的;S1被占用时,S0就是空的,这也就印证了上面算法描述里说的信息。
2.标记清除算法(包括整理)
因为老年代中,可以回收的对象很少,所以触发对老年代的回收几率也比较低,对于老年代也不采用复制算法,因为那样空间利用率比较低,而是采用标记清除(整理)方式。如果对应对象的空间可以回收了,就进行回收,并对对象存储位置进行移动,将对象移到到一起,避免中间存在空隙,便于后续内存分配。
六、几个可以用于指定java虚拟机各个块大小的参数:
-XX:PermSize 设置永久代初始大小(样例:-XX:PermSize=40M)
-XX:MaxPermSize 设置永久代最大大小(样例:-XX:MaxPermSize=100M)
(注:java对此参数值限制,具体限制可能因操作系统、CPU/内存差异而又不同,在Window7上测试时,最小值为12M;不能设置为奇数,必须为偶数)
-XX:SurvivorRatio 设置新生代中eden和survivor区(S0/S1)的比例,通过验证,实际大小比例为该值*1.2,如设置为8,则eden空间大小/S0=8*1.2(样例:-XX:SurvivorRatio=8)
-Xmx 设置堆栈最大值,包括老年代和新生代,不包括永久代(样例-Xmx100M)
-Xms 设置堆栈初始大小(样例:-Xms50M)
-XX:NewRatio 老年代和新生代的大小比例,设置此参数时不能设置MaxNewSize,否则此参数失效(样例:-XX:NewRatio=2)
参考资料:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
http://www.open-open.com/lib/view/open1380593930103.html
http://blog.csdn.net/time_hunter/article/details/12405127
Java内存回收(垃圾回收)机制总结的更多相关文章
- Java编程思想学习笔记_1(Java内存和垃圾回收)
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...
- 【转】Java内存与垃圾回收调优
要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...
- Java内存与垃圾回收调优
Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generat ...
- 从JAVA内存到垃圾回收,带你深入理解JVM
摘要:学过Java的程序员对JVM应该并不陌生,如果你没有听过,没关系今天我带你走进JVM的世界.程序员为什么要学习JVM呢,其实不懂JVM也可以照样写出优质的代码,但是不懂JVM有可能别被面试官虐得 ...
- Java内存和垃圾回收
Java内存大体上可以分为:本地方法区(线程共享).Java栈(线程隔离).本地方法栈(线程隔离).Java堆(线程共享).程序计数器(线程隔离). 1.本地方法区 各个线程共享的内存区域,只要存放被 ...
- java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是
答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
- JAVA的堆栈和内存、垃圾回收解说
1.有关java健壮性特点的真相 很多书上都说java健壮性的特点是因为java使用数组代替了c++的指针:c++最令人头痛的问题就是内存问题,java的健壮性使编程人员不用再考虑内存的问题:这种观点 ...
- Java GC(垃圾回收)机制知识总结
目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...
- Java基础教程——垃圾回收机制
垃圾回收机制 Garbage Collection,GC 垃圾回收是Java的重要功能之一. |--堆内存:垃圾回收机制只回收堆内存中对象,不回收数据库连接.IO等物理资源. |--失去使用价值,即为 ...
- Java进阶 JVM 内存与垃圾回收篇(一)
JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...
随机推荐
- c#秒转时分秒
2个办法 @{ int hour = item.track / 3600; int min = (item.track - hour * 3 ...
- poj3696:同余方程,欧拉定理
感觉很不错的数学题,可惜又是看了题解才做出来的 题目大意:给定一个数n,找到8888....(x个8)这样的数中,满足能整除n的最小的x,若永远无法整除n 则输出0 做了这个题和后面的poj3358给 ...
- Laravel-数据库操作笔记
(慕课网_轻松学会Laravel-基础篇_天秤vs永恒老师) 一.直接使用sql语句 1.路由 2.StudentController.php 二.查询构造器 简介:Laravel查询构造器(quer ...
- [原创作品] javascript 实现的web分页器原理
很久没有写博客了,因为最近忙于一些杂七杂八的事情.不过,互联网的价值在于信息共享,因为共享,所以互联网才能飞快发展.博主建了一个技术共享qq群:164858883,因为目前人数还比较少,活跃度还不是很 ...
- 免费邮件服务器:MailEnable
官方网站地址:www.mailenable.com 下载最新版的 Standard Edition (FREE) 安装之前请留意安装指引就可以了,安装上去之后,直接就可以使用了 安装指引上写的清清楚楚 ...
- [RxJS] Handling a Complete Stream with Reduce
When a stream has completed, you often need to evaluate everything that has happened while the strea ...
- 【C疯狂的教材】(九)C语言指针(一)
1.什么是地址? 内存是由若干个1个字节的内存单元组成的存储器 计算机为了管理内存单元.给每一个字节都进行编号 编号的就是地址 2.什么是指针? 地址就是指针 地址: 地址指向的内存单元值:编号相应的 ...
- 使用代码自定义UIView注意一二三
文/CoderAO(简书作者)原文链接:http://www.jianshu.com/p/68b383b129f9著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 当一撮样式一样的视图在 ...
- 《那些事之Log4j》什么是log4j?【专题一】
Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代码运行时轨迹,作为日后审计的依据: 担当集成开发环境 ...
- MFC下的aero效果学习笔记
最近想在MFC中用下aero 首先参考了 http://blog.csdn.net/polytechnic/article/details/5696797 中的一系列的步骤,进行了初步学习 但是对于其 ...