什么是垃圾回收?
使用过的数据留在了内存。无法回收
内存泄漏
对象使用完没回收 一直占着内存。没回收的一直占着内存的多了。就会造成溢出。
如何找到垃圾?
引用计数器 有一个使用就加一 当为0就回收。无法解决环形的垃圾
根 可达性算法。
如何清除?
mark-sweep 直接把垃圾更改为可用的。速度快,但是会把内存碎片化
copying 把内存分为两半。 速度快, 但是浪费内存
mark-compact 把垃圾压缩,碎片整理。效率低。
GC调优就是调整700多个参数
jvm最简单的调优重启...
十种垃圾回收器
新生代 ParNew Serial Parallel Scavenge
G1 ZGC Shenandoah
老年代 CMS Serial Old parallel Old
1.8 默认ps + po
Serial/Serial Old 单线程的。停止全部,进行垃圾回收
Parallel Scavenge 多线程处理。 对于空间大的无法处理。
CMS 初始标记:寻找根,并发标记 重新标记 并发清理。
G1 逻辑分代,物理不分代,
最好的垃圾回收 C4
分代模型
内存里分为两大代:新生代 老年代。
刚new出来的对象 在新生代。
新生代分为 eden survivor1 survivor2
对于有用的对象拷贝到 survivor,剩下的直接清除。
对于在新生代多次回收不掉的放入老年代。
当new出来一个对象 会分配到栈上 如果太大就会分配到 老年代。
实战!!!
新生代过大 调节 xmn
查找服务器上的垃圾回收器 java -XX:+PrintCommandLineFlags -version
具体参数 java -XX:+PrintFlagsFinal -version
jstack