# Java JVM 虚拟机

# 第1章 介绍了Java技术体系的过去、现在和未来的一些发展趋势,并介绍了如何独立地编译一个OpenJDK 7

关键字:HotSpot VM openjdk编译 思考:学习虚拟机不意味着要去修改虚拟机的源码,而是要写出便于虚拟机优化的java代码

# 第二部分 自动内存管理机制

# 第2章 讲解了虚拟机中内存是如何划分的,以及哪部分区域、什么样的代码和操作可能导致内存溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。

java虚拟机运行时数据区 方法区,堆,程序计数器,本地方法栈,虚拟机栈 运行时常量池是方法区的一部分

关键字:nio 、mark word、oom 分析工具

思考:通过本章的学习,我们明白了虚拟机中的内存是如何划分的,哪部分区域、什么样的代码和操作可能导致内存溢出异常

# 第3章 分析了垃圾收集的算法和JDK 1.7中提供的几款垃圾收集器的特点及运作原理。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则。

那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节

在Java语言中,可作为GC Roots的对象包括下面几种: 虚拟机栈(栈帧中的本地变量表)中引用的对象。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI(即一般说的Native方法)引用的对象。

垃圾收集算法思想 标记-清除算法. 复制算法 标记-整理算法 分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据
对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的
收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量
存活对象的复制成本就可以完成收集。
而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”
或者“标记—整理”算法来进行回收

垃圾收集算法是方法论 垃圾收集器则是具体实现

垃圾收集器 Serial收集器:单线程,适用于client端程序 Serial Old收集器 ParNew收集器 Parallel收集器 Parallel Old收集器 Concurrent Mark Sweep(CMS) G1收集器