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二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...
随机推荐
- HIbernate Oracle存储过程
之前为了实现基于Hibernate+Oracle的存储过程调用,发现了一个又一个坑,然后一个一个的尝试解决. 需求:使用Hibernate调用Oracle的存储过程,需要支持的有动态表名.存储过程变量 ...
- programData
以.结束语句输入;
- easyui获取日期datebox中的值
<input type="text" class="easyui-datebox" id="CTIME" style="wi ...
- MVC 区域模块
mvc4.0新增的area区域机制,可以协助你在架构较为大型的项目,让独立性较高的部分功能独立成一个MVC子网站,以降低网站与网站之间的耦合性,也可以通过area的切割,让多人同时开发同一个项目时候, ...
- BeyondCompare两个文件中同一行字符长度不一致的文件对比,比如pi文件对比(xjl456852原创)
假设有两个文件,里面存放的数字都只有一行,但长度不一样,对比时会有问题 示例文件: 对比示例如图: 左边的pi的字符串比较长,右边的比较短. 右边的pi的值不是从开始的第一个位置对比的,这样的情况是有 ...
- python ctypes小例子
import time import ctypes import ctypes.wintypes SEE_MASK_NOCLOSEPROCESS = 0x00000040 SEE_MASK_INVOK ...
- PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236
一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...
- EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充
EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...
- Div与table的区别
1:速度和加载方式方面的区别 div 和 table 的差异不是速度,而是加载方式,速度只能是指网络速度,如果速度足够快,是没有差异的: div 的加载方式是即读即加载,遇到 <div> ...
- Android服务Service总结
转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们, ...