深入理解java虚拟机
1、java7的变化:提供新的G1收集器、加强对非java语言的调用、语言级的模块化支持、升级类加载架构等
2、java商业虚拟机:hotspot、jRockit、J9
3、java虚拟机运行时数据区域:方法区、虚拟机栈、本地方法栈、堆、程序计数器
4、每个线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,称这类内存区域为”线程私有”的内存。分支、循环、跳转、异常处理、线程汇付等基础功能都需要依赖这个计数器来完成
5、Java虚拟机栈也是线程私有的,生命周期与线程相同。虚拟机栈描述java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作找、动态链接、方法出口等信息。
6、本地方法栈与虚拟机栈作用类似,只是虚拟机栈为虚拟机执行java方法(class)服务,而本地方法栈视为native方法服务
7、Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例及数组都在这里分配内存。
8、方法区与java堆一样是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即是编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载
9、运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中
10、对象访问方式主流有两种:使用句柄、直接指针
11、java采用的垃圾收集算法:根搜索算法,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的(用图论的话来说就是从GC Roots到这个对象不可达)、
12、java中可以作为GC Roots的对象包括:虚拟机栈(栈帧中的本地变量表)中的引用的对象、方法区中的类静态属性引用的对象、方法区中的常量引用的对象、本地方法栈中JNI(即native方法)的引用的对象
13、java引用的概念:强引用、软引用、弱引用、虚引用
14、要真正回收一个对象,至少经历两次标记过程,如果无gc roots引用的对象存在finalize方法,会放入F-Queue队列中,但只能拯救一次,任何一个对象的finalize()方法都只能执行一次
15、方法区(永久代)的垃圾收集主要回收两部分内容:废弃常量和无用的类
16、方法区回收类时需满足3个条件:①该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例②加载该类的ClassLoader已经被回收③该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
17、垃圾收集算法:①标记-清除算法②复制算法③标记-整理算法④分代收集算法
18、垃圾收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1
19、Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择
20、ParNew是许多运行在Server模式下的虚拟机中首选的新生代收集器
21、Parallel Scavenge关注点是吞吐量,而不是缩短垃圾手机时用户线程的停顿时间,适合在后台运算而不需要太多交互的任务,自适应调节策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区别
22、Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用”标记-整理”算法。这个收集器的主要意义也是被Client模式下的虚拟机使用。
23、Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和”标记-整理”算法
24、CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS默认启动的回收线程数是(cpu数量+3)/4
25、G1收集器基于”标记-整理”算法实现,不会产生空间碎片,可以非常精确的控制停顿,既能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒, 区域划分及有优先级的区域回收,保证了G1收集器在有限的时间内可以获得最高的手机效率
26、并行:指多条垃圾收集线程并行工作,但此时用户线程任然处于等待状态。并发:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序继续运行,而垃圾收集程序运行于另一个cpu上
27、内存分配的规则并不是百分百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置
28、Minor GC(新生代GC):指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
29、Full GC(老年代GC/Major GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Magor GC的速度一般会比Minor GC慢10倍以上
30、大对象直接进入老年代,使用参数-XX:PretenureSizeThreshold控制阀值
31、查看收集器日志参数-XX:+PrintGCDetails
32、虚拟机给每个对象定义了一个对象年龄计数器(Age),如果对象在Eden出生并经过第一次Minor GC后任然存活,且能被Survivor容纳的话,将被移动到Survivor空间中,每经历过一次GC,年龄就增加1岁,当增加到一定程度(默认15岁),就会晋升到老年代中,阀值可通过参数-XX:MaxTenuringThreshold设置
33、动态对象年龄判定:如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄
34、空间分配担保:在发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则改为直接进行一次Full GC,如果小于,则查看HandlePromotionFailure设置是否允许担保失败,如果允许,那只会进行Minor GC,否则进行一次Full GC
35、