JVM原理以及参数详解

JVM原理:
JVM是java核心和基础,在Java编译器和OS平台之间的虚拟处理器。他可以在上面执行java的字节码程序,java编译器只要面向jvm,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台的机器码,通过特定平台运行。
JVM体系结构:

类加载器:加载class文件;

执行引擎:执行字节码或者执行本地方法

运行时数据区:包括方法区、堆、Java栈、PC寄存器、本地方法栈


image.png

一、解释
1、PC寄存器:用于存储每个线程下一步将执行的JVM指令。
2、栈:栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放当前线程中的局部基本类型的变量。
3、堆:它是JVM用来存储对象实例以及数组值的区域。堆中对象的内存需要等待GC进行回收。堆是JVM所有线程共享的。
4、方法区:存放了所加载的类信息、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息;通过class对象中的getName等方法来获取信息时,实际这些数据是来源于方法区,方法区是全局共享的。
5、运行时常量池:存放类中固定的常量信息、方法和Field的引用信息等,其空间是从方法区中分配。
6、本地方法栈:JVM采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

二、如何判断对象是否存活:
1、引用计数法:给对象中添加一个引用计数器,当一个地方引用了对象,计数加1;当引用失效时,计算器减1;当计算器为0的时候,表示该对象已死,可回收;但是很难解决循环引用问题
2、可达性分析:通过一些列称为“GC ROOT”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象GC Roots没有任何引用链相连,则证明此对象已死,可回收。java中可以作为GC Roots的对象包括:虚拟机栈中引用的对象、本地方法栈中native方法引用的对象、方法区静态属性引用的对象、方法区中常量引用的对象。
三、JVM垃圾回收
1、对新生代的对象的收集叫 minor GC;
2、对老年代的对象的收集叫 full GC;
3、程序中主动调用System.gc()强制执行的GC 为 full GC;
4、强引用:默认情况下,对象采用的均为强引用;如果一个对象具有强引用,垃圾回收器不会回收它,当内存空间不足,虚拟机宁愿抛出OutOfMemoryError,也不会回收具有强引用的对象。
5、软引用:适用于缓存场景(只有内存不够用的情况下才会被回收)
6、弱引用 : 在GC时一定会被GC回收
7、虚引用:用于判断对象是否被GC。如果一个对象只具有虚引用,那么它就和没有任何引用一样,随时会被JVM当做垃圾回收。
四、垃圾收集算法
1、标记-清除算法:有两点不足,一个效率问题,标记和清除过程效率都不高。一个是空间问题,标记清除后会产生大量不连续的内存碎片。
2、复制算法:解决了内存碎片问题,但是内存利用率低
3、标记整理法:解决了内存碎片问题
4、分代收集算法
(1)新生代:在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法
(2)老年代:老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。
六、垃圾收集器
1、Serial收集器(串行收集器):单线程收集,并且在收集的时候必须暂停所有工作线程;
2、CMS收集器:
Concurrent-Mark-Sweeo的缩写,并发的标价与清除
收集器是一种以获取最短回收停顿时间为目标的收集器;基于标记清除算法,并发收集、低停顿、运作过程复杂(初始标记、并发标记、重新标记、并发清除)。CMS收集器有3个缺点:
(1)对CPU资源非常敏感(占用资源);
(2)无法处理浮动垃圾(在并发清除时,用户线程新产生的垃圾叫浮动垃圾),可能出现Concurrent Mode Failure失败
(3)产生大量的内存碎片。
CMS只有在触发FullGC的情况下才会对堆空间进行compact。
如果现实应用长时间进行,碎片化会非常严重,会很容易造成promotion failed.为了结局这个问题,线上很多应用通过定期重启或者受到触发FullGC来触发碎片整理。
3、G1收集器
特点:(1)分代收集:G1可以不需要其他GC收集器的配合就能独立管理整个堆,采用不同的方式处理新生对象和已经存活一段时间的对象;
(2)空间整合:采用标记整理算法,局部采用复制算法,不会有内存碎片,不会应为大对象找不到足够的连续空间而提前触发GC;
(3)可预测的停顿:能够让使用者明确指定一个时间片段内,消耗在垃圾收集上的时间不超过时间范围内。
-XX:+UseG1GC
4、并行收集器:这是JVM默认的收集器,它最大的优点是使用多个线程来扫描和压缩堆。缺点是minor和full GC的时候都会暂停应用的运行。并行收集器最适合用再可以容忍程序停滞的环境使用,它占用较低的CPU因而能提高对应的吞吐。
-XX:+UseParallelGC
七、Java的内存模型
主内存
工作内存
八、双亲委派模型
九、JVM类加载
十、内存泄露和内存溢出
内存泄露:指程序在申请内存后,无法释放已申请的内存空间
内存溢出:指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory
出现内存泄露的情况:
1、静态集合类
2、各种连接没有被释放
3、监听器
4、变量不合理的作用域
5、单例模式可能会造成内存泄露
内存溢出的情况(OOM):
1、内存中加载的数据量过大,如一次取出过多数据
2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收
3、代码中存在死循环或者循环产生过多重复的对象实体
4、启动参数内存值设定的过小。
十一、内存屏障
十二、访问对象时,如何定位到该对象

你可能感兴趣的:(JVM原理以及参数详解)