1. jvm内存模型
2. 与内存分配相关的jvm参数
3. 垃圾回收器种类和使用方法
3.1 java垃圾回收器需要处理的基本问题是:
(1)哪些对象需要回收?
(2)何时回收这些对象?
(3)如何回收这些对象?
3.2 常见的垃圾回收算法
(1)引用计数法
对于一个对象a,只要有任何对象引用了a,那么a的引用计数器加1,当引用失效时,计数器减1.只要对象a的引用计数器的值为0,则对象a就不可能再被使用。该算法没有在java垃圾回收器中使用。
优点:简单
缺点:无法处理循环依赖问题,会引起内存泄漏
(2)标记-清理算法
将垃圾回收分成两个阶段,即标记阶段和清理阶段。在标记阶段,从GC Root出发,标记所有从根节点开始的可达对象。未被标记的对象就被认为是需要进行垃圾回收的对象。
缺点:可能产生大量的空间碎片,由于回收空间的不连续,在对象的分配过程中,尤其是大对象的内存分配,不连续的内存空间的工作效率要低于连续的空间
引发问题:
GC root有几下种:
(a) Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,他们可以以静态字段的方式保存持有其它对象。我们需要注意的一点就是,通过用户自定义的类加载器加载的类,除非相应的java.lang.Class实例以其它的某种(或多种)方式成为roots,否则它们并不是roots,
(b) Thread - 活着的线程
(c) Stack Local - Java方法的local变量或参数
(d) JNI Local - JNI方法的local变量或参数
(e) JNI Global - 全局JNI引用
(f) Monitor Used - 用于同步的监控对象
(g) Held by JVM - 用于JVM特殊目的由GC保留的对象,但实际上这个与JVM的实现是有关的。可能已知的一些类型是:系统类加载器、一些JVM知道的重要的异常类、一些用于处理异常的预分配对象以及一些自定义的类加载器等。然而,JVM并没有为这些对象提供其它的信息,因此就只有留给分析分员去确定哪些是属于"JVM持有"的了。
(3)复制算法
(4)标记-压缩算法
(5)增量算法
(6)分代
4. 一些常用的jvm调优参数及其使用效果
5. jvm调优实例