该篇回顾的前半部分为“走近java”和“自动内存管理机制”部分,具体章节包括1~5章节。
1. 原理
Java虚拟机的运行时区域(详细链接)
运行时区域主要分为两块:线程独占区、线程共享区。
线程独占区包括:虚拟机栈、程序计数器、本地方法栈。
虚拟机栈中有栈针和局部变量表;
程序计数器是Java虚拟机规范中唯一没有被定义OutOfMemoryError的区域;
本地方法栈是对于本地方法的栈的结构。
线程共享区包括:堆、方法区。
堆的其唯一目的是存放对象的实例;
方法区是存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;
对象的回收(垃圾回收器)
垃圾回收器有:Serial、ParNew、Parallel Scavenge、Concurrent Mark Sweep (CMS)、G1。
Serial是一个单线程的,结构简单,但是执行效率还算比较高的;
ParNew是多线程的,可以与cms进行结合;
Parallel是用在服务端一个默认的垃圾收集器,主要针对于吞吐量;
Cms是一个并行的垃圾收集器;
G1是目前最高端的垃圾收集器。
垃圾对象的标记算法有两个:引用计数法、可达性分析法。(标记算法与垃圾收集算法)
垃圾收集算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法。
标记-清除算法由于标记和清除的速度比较慢,一般不会倾向使用它;
复制算法比较适用于新生代内存;
标记-整理算法比较适用于老年代内存;
分代收集算法实施结合了以上,根据不同的年龄代去选择了不同的收集算法。
1. 对象首先在Eden区域分配;
2. 大对象直接进入到老年代;
3. 长期存活的对象进入到老年代;
4. 空间的分配担保;
5. 逃逸分析与栈上分配。
2. 工具
命令行工具(命令行工具):jps、jstat、jinfo、jmap、jstack。
图形化工具(JConsole、MAT):JConsole、MAT。