一、JVM内存结构
java的内存模型主要分为5个部分,分别是:JVM堆、JVM栈、本地栈、方法区还有程序计数器,他们的用途分别是:
二、JMM内存模型
Java的内存模型决定了线程间的通信方式,JMM的模型是由主存和本地内存构成,两个线程想要正常通行需要将本地内存中的变量刷到主存中,另一个线程才能正确读取得到,这个也是volitile关键词的原理所在。
JMM模型决定了线程见的通信,由于线程内的变量首先会存储在本地内存中,如果需要线程间通信,需要写入主存中,供其他线程读取。
由于JVM在执行程序时会产生重排序,所有需要引入volitile等关键词。
三、GC算法
1.可达性算法
1.1.引用计数算法
原理:对每个对象的引用计数,引用了则+1,释放了则-1;
1.2.GC root算法
给定一个GC root的集合的引用作为根出发, 通过引用关系遍历对象图,能被遍历到的(可达到的)对象就判定为存活, 其余对象(也就是没有被遍历到的)就自然被判定为死亡。
可以做GC root的是:
2.GC算法
对比:基于copy的算法适用于存活对象比较多的GC场景,Mark-sweep适合存活对象较少的场景。
copy based GC算法适合存活对象少的年轻代实现,mark-sweep GC算法适合再存活对象多的老年代实现。
四、GC回收器
衡量GC的指标主要是吞吐量、暂停时间。
吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间+垃圾收集时间)。比如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
暂停时间是指一个时间段内应用程序线程暂停,让GC线程执行的状态。例如,GC期间100毫秒的暂停时间意味着在这100毫秒期间内没有应用程序线程是活动的。
GC回收器的种类:
(1)serial回收器:就是在GC回收的时候工作线程暂定,他是一个串行的回收器;
(2)parallel回收器:就是GC回收器是并发执行的,因此提升了GC的吞吐量,GC过程中会stop the world;
(3)CMS,他的全程是concurrent mark sweep,他的主要优势是在GC回收大多数时候不需要stop the world;
(4)G1:这个是从JDK7后推出的新的GC,在JDK1.9成为了默认的GC回收器;
1.CMS回收器
CMS是并发标记清除GC回收器件,其目标是***获取最短GC停顿时间*** ,比较符合大型web server项目的使用场景。其GC阶段经过4个阶段:
CMS总结:
2.G1回收器
G1回收器会将区域划分为region,每个region可以是新生代也可以是老年代,通过控制对region的回收,做到对垃圾回收导致的STW可控。垃圾回收的阶段前3个阶段和CMS一致,只是最后一个节点需要通过混合清除来回收新生代和老年代所有的对象:
G1总结:
3.对比总结
总结:
对比:
五、对象实例化的过程
首先我们要明白JVM的作用是什么,那就是将.class文件加载到内存,并且实例化成对象,在实例化成对象的过程中,需要有哪些操作呢?
在进入这一步之前需要一些前置知识,包括java的54种引用类型和引用在内存中的指向等:
java引用的4种类型:
(1)强引用:利用这种方式创建的对象是强应用,Object obj = new Object();这种引用在gc时候不会回收;
(2)软引用:软引用在一次gc时候不会回收,之后不一定??
(3)弱引用:弱引用在gc时候一定会被gc;
(4)虚引用:这个用的不多,所以不了解;
栈中引用指向堆中对象:
对象实例化的过程:
(1)在new一个新的对象时,想在本地方法区中找是否有对于的类元信息,有的话直接调用相应的classloader进行加载,没有的话委托给他的父级classloader进行查找,这一步主要是将字节码文件通过字节流的心事加载进来;
(2)为对象分配内存空间。由于对象是存储在堆中,而引用是存在jvm栈中,所以栈中引用需要通过指针的方式只想堆中相应对象,这一步是需要在堆和栈中为对象分配内存空间。
(3)设置默认值和初始化。每一个基本数据都有默认值,所以在这一步,需要为变量设置默认值,同时为成员变量进行初始化操作。
参考资料
JVM内存模型(JVMMM):www.huaweicloud.com/zhishi/arc-…
JVM之配置参数详解和调优总结(二):www.huaweicloud.com/articles/b8…
jstat命令查看jvm的GC情况 (以Linux为例):blog.itpub.net/31543790/vi…
JVM的架构与知识脉络图:mp.weixin.qq.com/s/RxzAePMS3…
《深入理解java虚拟机》
ClassLoader讲的不错:juejin.im/post/5c0489…
参考资料:mp.weixin.qq.com/s?src=11&ti…
弄明白CMS和G1,就靠这一篇了:cloud.tencent.com/developer/a…
JVM:(十六)垃圾回收器:blog.csdn.net/sd_960614/a…
本文由博客一文多发平台 OpenWrite 发布!