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是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...
随机推荐
- CSS布局技巧 -- sticky属性
在一些很长的表格中,往往需要使用表头悬浮的设计以方便用户使用,例如H5电商页面通过下滑展示大量商品列表时,顶部的导航栏需要在离开屏幕时,需要固定在屏幕顶部以方便用户筛选类别.这种效果一直以来需要通过J ...
- .Net 对App.config和Web.config的访问操作(增、删、读、改)
一.首先引用Configuration 1)App.config如下: using System.Configuration;//若果还没有Configuration,右键引用文件夹添加引用,在.NE ...
- (Python )格式化输出、文件操作、json
本节学习Python的格式化输出,文件操作以及json的简单用法 1.格式化输出 将非字符串类型转换成字符串,可以使用函数:str() 或者repr() ,(这两个函数的区别目前我还没搞懂,求解答) ...
- python核心编程笔记
1.python的对象是通过引用传递的. 2.多元赋值: x, y = y, x
- 脚本tips
脚本中所有的命令都要echo到log文件里,方便跟踪. grep的时候要小心grep出多行,正则表达式的匹配越精确越好!
- linux环境下安装mongodb
最近有用到mongodb,顺便找到了以前的指南,顺便写一篇随笔,以后或许有用到的地方. 第一步:下载mongodb的linux版本,mongodb-linux-x86_64-3.2.4.tgz(去官网 ...
- 实验一报告--认识DOS
实验一 DOS命令解释程序的编写 13物联网 黄鸿佳 201306104107 一. 实验目的 (1)认识DOS: (2)掌握命令解释程序的原理: ...
- SpringAOP代理报错问题
public class BaseDataSyncPushJob implements StatefulJob{ /*** 日志 */ private static final Log LOG = L ...
- 在VS2010下编译和使用tesseract_ocr识别验证码
对于自动识别验证码,使用trsseract是个不错的选择,有兴趣的的朋友可以试试. 编译tesseract 官网提供了vs2008的编译说明和工程,但在vs2010下的编译时基本相同的,因此我使用的方 ...
- WIN8 平台应用隐私声明
隐私权声明 本应用连接网络仅为控制硬件设备,不会收集你的个人信息,也不共享你个个人信息. 应用名称 雅典娜监控平台移动客户端 关于本应用 本应仅为控制设备应用,不关注任何配置相关信息,所有数据均来自服 ...