JVM与垃圾回收机制(GC)和类的生命周期
JVM运行时数据区
GC(垃圾回收机制)
什么是垃圾回收机制:
在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回收机制回收的是内存。同时GC回收的是堆区和方法区的内存。
JVM回收的特点:
当要进行垃圾回收时候,不管何种GC算法,除了垃圾回收的线程之外其他任何线程都将停止运行。被中断的任务将会在垃圾回收完成后恢复进行。GC不同算法或是GC调优就是减少stop-the-world的时间。à(为何非要stop-the-world),就像是一个同学的聚会,地上有很多垃圾,你去打扫,边打扫边丢垃圾怎么都不可能打扫干净的哈。当在垃圾回收时候不暂停所有的程序,在垃圾回收时候有new一个新的对象B,此时对象A是可达B的,但是没有来及标记就把B当成无用的对象给清理掉了,这就会导致程序的运行会出现错误。
如何判断那些对象需要回收?
- 引用计数算法(java中不是使用此方法):每个对象中添加一个引用计数器,当有别人引用它时候,计数器就加1,当别人不引用的时候计数器就减1,当计数器为0的时候对象就可以当成垃圾。算法简单,但是最大的问题就是在于循环引用的时候不能够正确的把对象当成垃圾。
- 根搜索方法(这是后面的垃圾搜集算法的基础):这是JVM一般使用的算法,设立了若干个对象,当若干个根对象对某一个对象都不可达成的时候,这个对象就是无用的对象。对象所占的内存可以回收。
根搜索算法的基础上,现代虚拟机的实现当中,垃圾搜集的算法主要有三种,分别是标记-清除算法、复制算法、标记-整理算法。
标记-消除算法:当堆中的有效内存被耗尽的时候,就会停止整个系统,就会调用标记-消除算法,主要做两件事,1就是标记,2就是清除。然后让程序恢复。
标记:遍历所有GCroots把可达的对象标记为存活的对象。
清除:把未标记为存活的对象清楚掉。
缺点:1.就是效率相对比较低。会导致stop-the-world时间过长。
类的生命周期
生命周期关系图:

生命周期的几个步骤:
1.类的加载:
我们编写一个java的源文件,经过编译后生成一个后缀名为.class的文件,这结合四字节码文件
java虚拟机就识别这种文件,java的生命周期就是class文件从加载到消亡的过程。
关于加载,其实,就是将源文件的class文件找到类的信息将其加载到方法区中,
然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。
但是这一功能是在JVM之外实现的,主要的原因是方便让应用程序自己决定如何获取这个类,
在不同的虚拟机实现的方式不一定相同,hotspot虚拟机是采用需要时在加载的方式,
也有其他是先预先加载的。
2.连接
一般会跟加载阶段和初始化阶段交叉进行,过程由三部分组成:验证、准备和解析三步
(1)验证:确定该类是否符合java语言的规范,有没有属性和行为的重复,继承是否合理,总之,就是保证jvm能够执行
(2)准备:主要做的就是为由static修饰的成员变量分配内存,并设置默认的初始值
默认初始值如下:
1.八种基本数据类型默认的初始值是0
2.引用类型默认的初始值是null
3.有static final修饰的会直接赋值,例如:static final int x=10;则默认就是10.
(3)解析:这一阶段的任务就是把常量池中的符号引用转换为直接引用,通俗地讲就是jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址。
3.初始化
这个阶段就是将静态变量(类变量)赋值的过程,即只有static修饰的才能被初始化,执行的顺序是:父类的静态域或者是静态代码块,然后是子类的静态域或者静态代码块。
4.使用
在类的使用过程中分为三步:
对象实例化==》垃圾收集==》对象终结
1.对象实例化:
就是执行类中的构造函数,如果该类中存在父类JVM会通过显示或者隐示的方式先执行父类的构造函数,在堆中为父类的实例变量开辟空间,并赋予初始值,然后再根据构造函数的代码内容将真正的值赋予实例变量本身,最后,引用变量获取对象的首地址,通过操作对象来调用实力变量和方法。
2.垃圾收集:
当对象不再被引用的时候,就会被虚拟机表上特别的垃圾标记,在堆中等待GC回收
3.对象的终结:
对象被GC回收后,对象就不再存在,对象的生命也就走到了尽头
使用中的两种引用:
主动引用
如果一个类被主动引用,就会触发类的初始化。在java中,主动引用的情况有:
- 通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。
- 通过反射方式执行以上三种行为。
- 初始化子类的时候,会触发父类的初始化。
- 作为程序入口直接运行时(也就是直接调用main方法)。
- 引用父类的静态字段,只会引起父类的初始化,而不会引起子类的初始化。
- 定义类数组,不会引起类的初始化。
- 引用类的常量,不会引起类的初始化。
被动引用
5. 类的卸载:
就是类的生命周期走到了最后一步,程序中不再有该类的引用,该类也就会JVM垃圾回收,从此生命周期结束.
在类使用完之后,如果满足下面的情况,类就会被卸载:
1.该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2.加载该类的ClassLoader已经被回收。
3.该类对应的java.lang.Class对象没有任何地方被引用,没有在任何地方通过反射访问该类的方法。
JVM与垃圾回收机制(GC)和类的生命周期的更多相关文章
- JavaScript巩固篇(一)——数据类型与全局变量、局部变量、垃圾回收机制、存储方式、生命周期
知识要点 数据类型 存储方式 全局变量与局部变量 变量的生命周期 垃圾回收机制 知识概览 数据类型 JavaScript的数据类型分为:基本类型.引用类型 本质区别: 基本数据类型的变量实际值存储在栈 ...
- Java虚拟机(JVM)与垃圾回收机制(GC)的详解
一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC
一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(转)
作者:Jeff Wong 出处:http://jeffwongishandsome.cnblogs.com/ 本文版权归作者和博客园共有,欢迎围观转载.转载时请您务必在文章明显位置给出原文链接,谢谢您 ...
- 03 JVM的垃圾回收机制
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- 垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)
来源 图像操作,易内存泄露,边界像素 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对 ...
- JVM虚拟机—JVM的垃圾回收机制(转载)
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
随机推荐
- abap编辑器中代码不可修改
当出现abap编辑器中代码不能修改的情况,可以按如下设置: edit——> 修改操作——>关闭助手
- mysql数据库从删库到跑路之mysq索引
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- 设置 Quick-Cocos2d-x 在 Windows 下的编译环境
http://cn.cocos2d-x.org/tutorial/show?id=1304 设置 Quick-Cocos2d-x 在 Windows 下的编译环境 Liao Yulei2014-08- ...
- PHP计算上一个月最后一天、当月最后一天、下一个月最后一天
上个月最后一天: $last_month_last_day = date('Y-m-t',strtotime('-1 month')); 当月最后一天: $first_day=date('Y-m-01 ...
- Linux系统——NFS网络文件系统
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资 ...
- JS传参中文乱码问题.NET
前台js代码 window.location.href = "/product.aspx?id=2&title=" +encodeURIComponent(strtitle ...
- CDOJ 1502 string(简单贪心)
题目大意:原题链接 相邻两个字母如果不同,则可以结合为前一个字母,如ac可结合为a.现给定一个字符串,问结合后最短可以剩下多少个字符串 解体思路:简单贪心 一开始读题时,就联想到之前做过的一道题,从后 ...
- 使用 vim + ctags + cscope + taglist 阅读源码
转自:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找到合 ...
- JavaEE学习记录(一)--软件系统体系结构
1 常见软件系统体系结构B/S.C/S 1.1 C/S l C/S结构即客户端/服务器(Client/Server),例如QQ: l 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户 ...
- oracle中job定时器任务
对于DBA来说,经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作.但是,Oracle定时器Job时间的处理上,千变万化,今天我把比较常用 ...