java内功 ---- jvm虚拟机原理总结,侧重于GC
写作日期 2016-08-22-23
交流qq:992591601
参考资料:《深入理解java虚拟机》、《thinking in java》、《Effective Java》
直接从最要紧的地方讲,Java GC算法。需说明一点,GC机制只是涉及堆内存的。因为堆内存是动态的,在程序运行期间分配的。
一.判断什么需要被回收:
1.引用计数法
问题在于两个对象互相引用,然后各种指向null。堆内存中的对象是不会被回收的。
上图是体现一种变化,绘画技巧不行,用绿框表示对象成员,两个对象互相指向。
依据引用计数法,当a=null,b=null。A、B不会被回收内存,因为他们互相引用。
2,可达性分析算法
为了解决引用计数的缺陷,引入可达性分析算法。
GC Root:
1,虚拟机栈(栈帧中的本地变量表)中引用的对象。
2,方法区中类静态属性引用的对象。
3,方法区中常量引用的对象。
4,本地方法栈中JNI(即一般说的Native方法)引用的对象。
对于之前的例子。当a、b(栈中的变量)指向A、B(堆中的变量)时 ,A与B是GC Root。当a=null、b=null。A与B不再是GC Root,虽然A与B相互引用,但没有与其它任何GC Root可达。所以A与B,会被回收。
3.方法区的回收
永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。废弃常量的回收与对象的回收是一个道理。
重点谈废弃的类需满足的几点:
1,该类的所有实例都已被回收
2,加载该类的ClassLoader已经被回收
3,该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问到该方法
二,垃圾收集算法:
1.标记-清除
分为,标记和清楚两个阶段,想想便知道,会留下很多内存碎片。
2.复制算法
将内存分为8:1:1。8的部分为Eden,1的部分为Survivor。
首先是使用Eden部分内存,按照1的标记-清除算法来,做垃圾收集,自然会产生碎片。当Eden部分内存不够时,就将活着的对象都放入一个Survivor。此时Eden为空。继续分配对象内存、同时也就继续回收。这时那个装载着存活对象的survivor也在做着垃圾回收。当Eden或这个survivor内存不够用的时候,便将二者内存里活着的对象都放入另一个surviror。如此循环往复。
3.标记-整理
与标记-清除相对,是一种标记后不直接清除,而是将所有活着的对象像一端移动,然后直接清理掉端边界以外的内存。
不同场合应当使用不同的垃圾回收算法,当前商业虚拟机的垃圾回收都采用“分代收集”算法。新生代死亡率高,采用复制算法,老年代存活率高,采用标记-清除或者标记-整理。
三,实用性建议
最后我们看下《Effective Java》一书给出的实用性建议:
1.消除过期的对象引用
了解了上述判断对象是否该回收的内容后,你就知道,如果堆内存里的对象被栈内存的变量所引用时,这块对象内存是不会被回收的。这便是java的内存泄漏。其逻辑在于,虽然Java的GC很有效,但一个应当释放的堆一直被你引用着,GC程序是没法给它判死刑的。
2.避免使用总结方法
终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。
这两点结合起来看,就是java不像C++有好用的delete方法来释放对象内存,java需要依赖GC,但是java要保证及时释放引用,以保证不会内存泄漏。
java内功 ---- jvm虚拟机原理总结,侧重于GC的更多相关文章
- java内功 ---- jvm虚拟机原理总结,侧重于虚拟机类加载执行系统
参考书籍:<深入理解java虚拟机>,三天时间用了八个小时看完,像读一本武侠小说,挺爽. 另外需声明:图片都是从我自己的csdn博客转载,所以虽然有csdn标识,但都是我自己画的图片. j ...
- java中JVM虚拟机内存模型详细说明
java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03| 分类: JAVA | 标签:java jvm 堆内存 虚拟机 |举报|字号 订阅 JVM的内部结构 ...
- JAVA的JVM虚拟机工作原理.V.1.0.0
注意:一下内容纯属个人理解,如有错误,欢迎批评指正. (90度弯腰)谢谢. java在JVM上的运行过程: 1,编辑好的java代码(IDE无报错,测试运行无错误): 2,java源代码通过javac ...
- 学习JVM虚拟机原理总结
0x00:JAVA虚拟机的前世今生 1991年,在Sun公司工作期间,詹姆斯·高斯林和一群技术人员创建了一个名为Oak的项目,旨在开发运行于虚拟机的编程语言,允许程序多平台上运行.后来,这项工作就演变 ...
- JAVA和JVM运行原理揭秘
这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器 ...
- java中JVM的原理
转载:https://blog.csdn.net/witsmakemen/article/details/28600127 一.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Jav ...
- jvm虚拟机原理1
JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理.冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操 ...
- java中JVM的原理重温【转】
一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...
- Java中JVM虚拟机详解
1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
随机推荐
- java访问ftp的一些操作
通过java代码来访问ftp服务器,进行下载操作
- 【Java学习笔记】函数的可变参数
package p2; public class ParamterDemo { public static void main(String[] args) { int sum1 = add(4,5) ...
- 类Arrays
package p2; import java.util.Arrays; import java.util.List; public class ArraysDemo { public static ...
- KMP详解
原文: http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 1. 引言 本KMP原文最初写于2年多前的2011年12月, ...
- HTML5所有标签汇总
来自lampbrother兄弟连HTML5与CSS3教程.<xmp> 结构标签:(块状元素) 有意义的div<article> 标记定义一篇文章<header&g ...
- 修改Linux可显示的行数
在/boot/grub/menu.lst中,找到kernel开头的那一行,在后面加上参数vga=791 下面是vga可以取的值 # +----------------------------- ...
- Java面试题整理
1 Switch能否用string做参数? a.在 Java 7 之前, switch 只能支持byte,short,char,int 或者其对应的封装类以及 Enum 类型.在JAVA 7中,St ...
- The Strategy pattern
public class Strategy {public static void main(String[] args) {int [] array=new int[]{26,25,15,42,36 ...
- doxygen的使用(一)配置并生成文档
原创文章,欢迎阅读,禁止转载. doxygen是个好用的文档生成工具,他的强大功能有很多介绍,我就不说了.自带的chm帮助手册很全面,包括功能.注释规范.怎么配置.工具用法等.doxygen的用法共3 ...
- 通过json数据进行传递调用
最近在弄andriod的程序,需要调用web服务器上的数据,服务采用C#写的,并部署在iis服务器上.我们可以像.NET那样调用服务那,利用andriod库自带的HttpPost和HttpGet类来调 ...