jvm复习笔记总结

本文地址:http://www.cnblogs.com/maplefighting/p/7923339.html 

1、  (1) 判断对象存活:引用计数器,当有引用时就加1。

   缺点:难解决对象之间的循环引用      objA.inst = objB;  objB.inst = objA;

(2) 可达性分析算法:通过"GC Roots" 为起始,向下搜索,当有一个对象不可达,说明可回收

2、引用分为强引用 (new) ,软引用(要内存溢出时回收) ,弱引用(回收时),虚引用(回收时收到通知),逐渐减弱

3、可达性分析算法中不可达的对象,会被第一次标记并进行筛选,当对象没有覆盖fianlize() 或者finalize() 被调过,则回收,否则在此间引用到Roots可达,则不回收   自救机会只有一次。

4、垃圾回收算法:标记-清楚算法,复制算法,标记-整理算法,分代收集

5、垃圾回收器

      (1)serial收集器      stop the world    复制

      (2)parnew         多线程的serial       复制     除了serial old只与CMS 搭配

      (3)parallel scavenge  可控制吞吐量            只与serial old 搭配

      (4)serial old       老年代                 标记-整理

      (5)parallel old                                标记-整理

      (6)CMS 初始标记,并发标记,重新标记,并发清除      标记-清除

                                stop   the    world

      (7)G1    初始标记,并发标记,最终标记,筛选回收

            整体:标记-整理     两个region之间:复制

           自己管理整个堆  分成多个大小相等独立区域,优先回收价值最大的

6、HotSpot 虚拟机默认Eden和Survior (两块) = 8 : 1

     标记-清除算法:两个过程效率都不高,会产生大量不连续内存碎片      实现简单

     复制算法:有10%浪费了

7、(1)对象大多数情况在新生代Eden区中分配,内存不足时发起Minor GC

      (2)大对象直接进入老年代

      (3)长期存活的对象进入老年代(没过一次Minor GC 年龄就加1岁,增加到一定程度就可以进入老年代)

      (4)如果Survivor相同年龄对象大小总和大于Survivor,则大于或等于该年龄对象直接去老年代

      (5)在发生Minor GC之前,虚拟机先检查老年代空间是否大于新生代所有对象总空间。是就安全。不是,检查是否允许担保失败。允许的话会继续查老年代最大连续空间是否大于历次晋升到老年代的平均大小。如果大于,将Minor GC。小于则 Full GC。

8、新生代复制收集算法,当出现大量对象Minor GC后仍存活,就需要老年代进行担保,直接进入老年代

9、类从被加载到内存到卸载出内存,生命周期为:加载,验证,准备(类变量分配内存,初始化),解析(将常量中符号引用替换为直接引用),初始化,使用和卸载。

10、Java定义5种线程状态:新建,运行,等待(wait),限期等待(sleep),阻塞,结束  (了解转换图)

11、Java各种操作共享的数据分为:不可变,绝对线程安全,相对线程安全,线程兼容,线程对立。

12、堆和栈的区别:栈在编译时分配,堆在运行时分配

                                    栈比较快

                                    栈是存放基本数据类型的变量和对象的引用,堆是存放new创建的对象与数组

13、(1)Minor GC 当Eden满时,触发Minor GC

        (2)Full GC:调用System.gc(),不必然执行

                            老年代空间不足

                            方法区空间不足

                            新生代转到老年代,老年代可用内存小于转的内存

14、方法区,常量,静态变量

15、类加载器

        双亲委派模型:自动加载器<--扩展类加载器<--应用程序加载器<--自定义类加载器

                                                                                                                      <--自定义类加载器

        以组合关系,而不是继承

        工作过程:一个类加载器收到加载请求,会委派给父亲去完成,父亲完成不了,才让下面的完成

        稳定运作,优先级的层次关系,加载同一个类,保证最基础的行为

16、Java内存模型:原子性,可见性,有序性

17、逃逸分析:当一个对象在方法中被定义后,被外部方法引用,称为方法逃逸。被外部线程访问,称为线程逃逸

         (给全局变量赋值,方法返回值,实例引用)

        没逃逸可优化:栈上分配,同步消除

18、线程共享的有堆,方法区

       线程私有的有栈,程序计数器,本地方法栈

19、JIT编译器

a、当虚拟机发现某个方法或代码块特别频繁时,会认定为热点代码,在运行时,会把他们编译成机器码

b、特点代码包括:被多次调用的方法,被多次调用的循环体

c、当程序迅速启动和执行时,解释器可以立即执行,解释器执行减少内存,编译器执行提升效率

d、判断是否为热点代码,需要热点探测

    基于采样探测        基于计数器探测(HotSpot采用的)

20、jvm内存参数设置

       -Xmx:堆内存最大值,默认为物理内存的1/4

       -Xms:堆内存初始值

       -Xmn:年轻代大小

       -Xss:栈内存大小

21、可行性分析GCRoots时,虚拟机用叫OopMap的数据结构记录存放对象引用 

        但每一条指令都记录,空间成本会很高,所以只在“安全点”记录

        特定位置:a、循环的末尾  

                         b、方法返回前

                         c、调用方法的call之后

                         d、抛出异常的位置

22、静态代码块是在类加载时自动执行的

23、可作为GC Roots对象

a、虚拟机栈中引用的对象

b、方法区中的类静态属性引起的对象

c、方法区的常量引用的对象

d、本地方法栈中JNI引用的对象

24、垃圾回收主要是针对堆的,对堆分为新生代和老年代,新生代复制算法的话分为Eden和Survivor,老年代一般为标记-整理算法。被详细的问时基本可以牵扯到效率这问题上回答。

25、jvm分为方法区,虚拟机栈,本地方法栈,堆,程序计数器等

 

参考书籍:深入理解Java虚拟机 JVM高级特性与最佳实践第二版(推荐),垃圾回收的算法与实现, (日)中村成洋 相川光

--------------------------------------------------------------------------------------------------------------

 以上为maplefighting个人笔记整理,如有出错,欢迎指正

 

posted @ 2017-11-30 20:19  maplefighting  阅读(285)  评论(0编辑  收藏  举报