1. 方法区
关注类的信息,如何被回收,3个条件:
- 1 类的所有实例,及子类实例被回收
 - 2 类的加载器被回收
 - 3 Class对象没有被任何数据引用
 
每个jsp文件都有一个唯一的类加载器
2. 堆
- 1 JVM堆是Java堆内存,它是Java堆中对象分配的空间。
 - 2 JVM堆的大小由最大堆大小(-Xmx)和初始堆大小(-Xms)参数控制。
 - 3 JVM堆的默认大小取决于JDK版本和操作系统。在某些JDK版本中,
 - 4 JVM堆的默认最大堆大小为1GB,初始堆大小为物理内存的1/64。
 
2.1. 引用计数与可达性分析
- 引用计数在循环引用时,会出现无法回收的情况
 
2.1.1. 可达性分析
根对象与普通对象,与根对象没有关联时,就被回收
- 线程Thread对象,引用栈帧中方法参数、局部变量等
 - 系统类加载器的java.lang.Class对象(某个类的元信息)
 - 监视器对象,synchronized持有的对象
 - 本地方法调用时使用的全局对象
 
3. 引用
- 软引用:常用于缓存中,当内存不足时,使用软引用 SoftReference,回收可以放在一个软引用队列中,ReferenceQueue
 - 虚引用:不能通过引用去获取使用的对象,唯一用途是内存释放时,可以收到一个通知。PhantomReference
 - 弱引用:不管GC时内存够不够,都会被回收,WeakReference,一般用于ThreadLocal中
 - 终结引用:对象需要被回收时,会将关联的对象放在一个finalize队列中,第二次回收时,才会真正回收,但是真正回收前 ,可以关联对象再关联对一个强引用,又不会回收。
 
4. 垃圾回收算法
垃圾回收主要做两件事:标识是否被回收; 回收内存,释放空间。
GC线程进行垃圾回收,会影响到用户线程,会存在 STW(Stop The World) 时间。
可以从最大暂停时间、吞吐量、堆使用效率等方面考查垃圾回收算法的优劣。
4.1. 标记-清除 Mark-Sweep GC
标记阶段:用可达性分析找到存在对象 清除阶段:将不可达的对象回收
- 优点:实现简单
 - 缺点: 
- 内存碎片多
 - 分配速度慢,因为碎片多,在分配新内存时,要遍历所有碎片,找出合适的空闲内存
 
 
4.2. 复制 Copy GC
将堆分为From和To空间 GC开始,将GC root对象复制到To空间 把GC root关联的对象复制到To空间 From中剩下的数据,就是要被清除的
- 优点:吞吐量高,没有过大的碎片
 - 缺点:内存使用率不高,只有一半的空间可以用来创建新对象
 
4.3. 标记-整理 Mark-Compact GC
标记阶段:用可达性分析找到存在对象 整理阶段:将存活对象整理到堆的一端,清理出存在对象原来的空间。
- 优点:内存使用率高,没有碎片
 - 缺点:对堆中的对象搜索2次,效率不高
 
4.4. 分代GC Generate GC
将堆分为老年代与年轻化,年轻化分布Eden区和Survivor1、Survivor2区,年轻代比例8:1:1。
年轻代存放使用时间短的对象,比如每次创建订单的订单明细数据
老年代存入使用时间长的对象。比如Spring中的Bean
- YGC 将年轻代的数据,GC次数达到15次,会被移入老年代
 - FGC 整个堆回收
 
5. 垃圾回收器

5.1. 年轻代-Serial

5.2. 年轻代-ParNew

5.3. 老年代-CMS

- 初始标记
 - 并发标记
 - 重新标记:并发标记后漏标、误标、,查漏补缺
 - 并发清理
 
5.4. Parallel Scavenge

5.5. G1
- 分为Eden, Survivor, old
 - 默认分为2048个区域
 
6. jvm GC 配置
-server -Xmx13G -Xms13G -Xss4M -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+UseStringDeduplication -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/logs/dump.bin -XX:ErrorFile=/root/logs/dump-error.log -Xloggc:/root/logs/gc.log -XX:-OmitStackTraceInFastThrow -Dproject.name=xsyx-repeater-datasyn -DappName=xsyx-repeater-datasyn -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-DinsightConsoleUrl=http://insight-console.cs-test.xsyxsc.cn
- server
 - Xmx13G
 - Xms13G
 - Xss4M
 - XX:+UseG1GC
 - XX:MaxGCPauseMillis=100
 - XX:+UseStringDeduplication
 - XX:+DisableExplicitGC
 - XX:+ScavengeBeforeFullGC
 - XX:+ExplicitGCInvokesConcurrent
 - XX:+PrintGCDetails
 - XX:+PrintGCDateStamps
 - XX:+PrintGCApplicationConcurrentTime
 - XX:+PrintHeapAtGC
 - XX:+HeapDumpOnOutOfMemoryError
 - XX:HeapDumpPath=/root/logs/dump.bin
 - XX:ErrorFile=/root/logs/dump-error.log
 - Xloggc:/root/logs/gc.log
 - XX:-OmitStackTraceInFastThrow
 - Dproject.name=good-test-man
 - DappName=good-test-man
 - agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005