java面试总结之JVM

  话不多说我们先上一张图

  由图中我们可以主要讨论以下四个方面的内容:

  一、Class Loader:

   类的加载过程主要是加载,链接(检验,准备,解析),初始化,这里涉及到LoadClass和Class.forName()有什么不同点,其实简单来说使用LoadClass就仅仅完成了类加载过程的第一步也就是加载,而使用Class.forName则完成到了初始化这其中的不同建议下来使用代码进行试验从而加深映像。

   类的加载器主要有四种:1.Bootstrap ClassLoader;2Extension ClassLoader;3Application ClassLoader;4.User ClassLoade。这四种类加载器之间是“父子关系”,我们可以手动实现一个自己的类加载器进而通过getParent()的方法来查看,需要注意的是Bootstrap CalssLoader 是使用C来实现的所以其初始化是使用newInstance(),至于其各自的功能很多的帖子都有在介绍可以自行深入了解

  二.JVM的内存结构也就是Run Data Area;

   JVM的内存结构主要有1.PC Resister 程序计数器

                                        2.Stack 栈(每一个线程都有一个栈,其生命周期是跟随这线程的生命周期的)

                                        3.Heap 堆(是所有线程共享用来存放New创建出来的对象和数组)

                                        4.Method Area 方法区(所有线程共享,用来存储加载类的信息,常量,静态变量,编译器编译后的代码)

                                        5.Native Method Stacks 本地方法栈

     以上的内存结构中个人感觉堆需要特殊关照一下所以上图:

其中年轻代中主要是使用复制算法,老年代中主要是使用标记整理算法这个会在下一个模块中说到 。其中的S0和S1也可以说是From区和To区     

三.垃圾回收算法;

   判断是否是垃圾的标准是对像是否被引用,其主要是涉及到了两种算法:1:引用计数法:通过判断对象的引用次数来判断对象是否可以回收,但是在循环引用的情况是无法判断的

                                                                                                                    2:是可达性分析算法:通过判断对象的引用链条是否可达来决定对象是否被回收

  主要的垃圾回收算法有:1.标记清除算法:就是将需要被回收的垃圾进行标记之后再回收,缺点在于回收后内存区域有碎片

                                       2.复制算法:就是将内存一分二,执行垃圾回收时将已经使用的一边复制到另外一边执行垃圾回收,缺点是内存的的使用率不高,主要是用于对象存活率不高的场景(新生代)

                                       3.标记整理算法:这个是将第一个算法之后将内存整理出来,解决了第一个算法的缺点,但是在整理的时候回非常的耗时,适用于对象存活率较高的场景(老年代)

                                       4.分代收集算法:将以上的算法进行了组合,根据不同的代来执行不同的算法

  四.垃圾收集器:1.串行 serial,用于新生代使用复制算法,用于老年代使用标记整理算法

                          2.并行 Paralle,多条垃圾收集线程并行工作而用户线程处于等待状态

                          3.并发 Concurrent ,用户线程和垃圾收集线程同时执行(不一定是并行,也可能是交替执行),使用于响应时间短的场景

  以上是我对JVM的一些总结,因为篇幅的缘故 很多东西都是比较表面的没有向深处挖掘,这个还需要下来再进行整理。

                                                                                                                                           

猜你喜欢

转载自www.cnblogs.com/yjfb/p/12453666.html