JVM基础01-基础知识概括
JDK8官方地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html
1. Java 执行流程
1.1 类的初始化过程
1.2 类加载器
双亲委派机制
就是如果一个类加载器收到了类加载请求,
它首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,
因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有父类加载器反馈到无法完成这个加载请求(它的搜索范围没有找到这个类),子加载器才会尝试自己去加载
1.3 运行时数据区
Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的。在创建线程时创建每个线程的数据区域,在线程退出时销毁每个数据区域。
2 垃圾回收器GC(主要是对堆和方法区内存回收)
-
MinorGC: 也叫Young GC,指的是新生代 GC,发生在新生代的垃圾回收。 Minor GC 通常很频繁,一般回收速度也很快
-
MajorGC: 老年代的 GC,发生在老年代的垃圾回收,该区域的对象存活时间比较长,通常来讲,发生 Major GC时,会伴随着一次 Minor GC,而 Major GC 的速度一般会比 Minor GC 慢10倍。
-
FullGC: 指的是全区域(整个堆)的垃圾回收,通常来说和 Major GC 是等价的。
2.1 垃圾回收过程
1.判断对象是否死亡
-
引用计数算法:给每一个创建的对象增加一个引用计数器,每当有一个地方引用它时,这个计数器就加1;而当引用失效时,这个计数器就减1。当这个引用器的数组为0时,说明没有对象使用它,那么这是一个无效的对象。
- 这种算法无法解决对象之间循环引用的问题。因此无法用它来进行垃圾回收;
-
可达性算法(根搜索算法):概念是:从GC Roots节点(起始点)出发向下搜索,如果没有任何引用链相连(即GC Roots到对象不可达),则证明此对象不可用。
-
可以作为GC Roots节点的是:
-
虚拟机栈(栈帧中的本地变量表)中引用的对象
-
方法区中的静态变量属性引用的对象
-
方法区中常量引用的对象
-
本地方法栈中(JNI)(即一般说的Native方法)的引用的对象
-
-
缺点:
- 相对比较耗时;
-
2.垃圾回收过程
-
1.新生成的对象存入到Eden;
-
2.当Eden存满之后,MinorGC对Eden进行清理,存活下来的对象存储到SO区域;
-
3.新生的对象继续存入Eden;
-
4.当Eden再次存满时,再次进行清理,将Eden剩余存货的对象和S0剩余的对象,移到S1中;
-
5.重复以上的步骤。并记录对象的年龄。当年龄到达阈值后,移动到老年代;
-
6.重复将达到阈值的年轻代对象移动到老年代;
-
7.直到老年代内存不够,进行MinorGC,进行标记和整理压缩;一般MajorGC会同时触发FullGC;
2.2 垃圾回收算法
-
标记清理算法:可达性标记出需要清理的对象,然后再用清理算法进行清理;
-
容易产生内存碎片
-
标记和清理计算,效率比较低;
-
-
复制算法:进行对象清理,将存活的对象复制到另一块内存;
-
优点:避免碎片化
-
缺点:内存浪费,将内存一分为二
-
-
标记-整理算法:先标记出所有存活的对象,然后让所有存活对象向一端进行移动,最后直接清理到端边界以外的内存
-
优点:避免内存浪费
-
缺点: 移动操作频繁,效率较低
-
-
分代收集算法:将堆内存进行分区,分成新生代,老生代。
-
对新生代的内存,采用复制算法;
-
对老生代的内存,使用清除-整理算法
-
3.JVM常见参数
-
xms:堆的初始内存大小;
-
xmx:堆的最大内存大小;
-
xx:NewRatio:设置年轻代和老年代的比值;
-
xx:NewSize:设置年轻代大小;
-
XX:PermSize:永久代初始值;
-
GC收集器选择
-
XX:+UseSerialGC:设置串行收集器
-
XX:+UseParallelGC:设置并行收集器
-
XX:+UseParalledlOldGC:设置并行年老代收集器
-
XX:+UseConcMarkSweepGC:设置并发收集器
-
-
GC 打印
-
XX:+PrintGCDetails
-
XX:+PrintGCTimeStamps
-

浙公网安备 33010602011771号