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是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
随机推荐
- MariaDB kill命令
MariaDB的KILL命令不只可以杀掉连接,而且可以只杀掉某连接当前的SQL,而不断开连接.KILL QUERY thread_id;kill thread_id可以杀掉当前的连接,而kill QU ...
- asp.net(C#) Excel导出类 导出.xls文件
---恢复内容开始--- using Microsoft.Office.Interop.Excel; 针对office 2003需添加引用Microsoft Excel 11.0 Obje ...
- 收缩数据库 DBCC SHRINKFILE
/* from: http://www.cnblogs.com/blackcore/archive/2010/12/27/1917911.html */ 数据库中的每个文件都可以通过删除未使用的页的方 ...
- AngularJS之ng-options的best practise
废话不多说,直接上代码. function MySelectCtrl($scope) { $scope.Model = [ { id: 10002, MainCategory: '男', Produc ...
- Kinect2 随记
2016.03.30 calibration工作: 地板砖1.24m一格,大概走到2.5m时5*7的pattern开始无法检测到. 20种板上位姿*20种黑板位姿=400幅图像. 距离越远,水平角能检 ...
- Android观察者模式的简单实现demo
观察者模式就是:当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新. 下面介绍一种简单的使用方法,(下面有demo链接)先看一下project的目录构成: ObserverList ...
- 关于mysql的access denied 错误解决方案
mysql -u root -p 按回车,输入密码后提示access denied......ues password YES/NO的错误? 第一步: 这时你需要进入/etc/mysql目录下,然后s ...
- PSP&进度条
11号 类别 开始时间 结束时间 间隔 净时间 燃尽图 8::00 8:20 0 20分钟 站立会议 8:20 8:50 0 30分钟 读构建之法 9:20 13:20 120分钟 120分钟 四人小 ...
- UOJ#34 FFT模板题
写完上一道题才意识到自己没有在博客里丢过FFT的模板-- 这道题就是裸的多项式乘法,可以FFT,可以NTT,也可以用Karasuba(好像有人这么写没有T),也可以各种其他分治乘法乱搞-- 所以我就直 ...
- [置顶]PADS PCB功能使用技巧系列之NO.001- 如何走蛇形线?
蛇形线是布线过程中常用的一种走线方式,其主要目的是为了调节延时满足系统时序设计要求,但是设计者应该有这样的认识:蛇形线会破坏信号质量,改变传输延时,布线时要尽量避免使用,因此一块PCB上的蛇形线越多并 ...