开场白:java幕后的英雄-jvm(Java Virtual Machine)
1,why 优化
内存溢出:对象占用内存过多。最终会导致内存泄露。
内存泄露:GC失效。
什么对象会被GC?
算法:可达性算法。引用计数法:jvm弃用,不能解决循环依赖的问题。
在Java语言里,可作为GC Roots对象的包括如下几种:
a.虚拟机栈(栈桢中的本地变量表)中的引用的对象
b.方法区中的类静态属性引用的对象
c.方法区中的常量引用的对象
d.本地方法栈中JNI的引用的对象
GC-ROOT是否可达,判断对象是否会被GC。不可达会被GC,可达不会被GC。
2,java内存模型 JMM:
https://www.cnblogs.com/lewis0077/p/5143268.html
https://blog.youkuaiyun.com/lirenzuo/article/details/71710543
JMM
JVM运行时数据区
3,GC回收算法及回收器
JVM heap分区块:heap分代:新生代,老年代,永久代(>1.8 meta space)
-
YongGeneration/NewGeneration:新生代,在Eden/S0/S1的存活的对象。
-
OldGeneration:老年代,在Tenured区存活的对象。
-
PermanentGeneration:永久代。
Space 区:8:1:1
-
Eden:伊甸园区,是新生代的一个区。- Survivor:幸存区,属于新生代,为了复制算法的需要。一般分成大小相等的两个区(S0/S1或者From/To)。
-
Tenured:存放老年代的区域。
-
Permanent:永久代。
垃圾回收算法:3种
- 标记清除:效率低,空间不连续。后面两种算法都是对标记清除算法的优化。适合老年代。
- 标记整理:效率低,空间连续。适合老年代。
- 复制算法:效率高,单空间浪费大。适合新生代。
垃圾回收器(分代回收):7种。
新生代(复制算法):Serial、ParNew、ParallelScavenge
老年代(标记清除、标记整理):CMS(Concurrent Mark Sweep)、Serial Old(MSC)、Parallel Old
G1(Garbge first):
名词解释: 串行与并行,指垃圾回收线程之间的关系。并发,指工作线程与垃圾回收线程的关系。
https://www.cnblogs.com/chengxuyuanzhilu/p/7088316.html
4,jvm优化经验
如何将新对象预留在年轻代
何让大对象进入年老代
如何设置对象进入年老代的年龄
稳定的 Java 堆 VS 动荡的 Java 堆
增大吞吐量提升系统性能
尝试使用大的内存分页
使用非占有的垃圾回收器
http://www.importnew.com/16327.html
5,jvm优化流程及工具介绍
https://www.cnblogs.com/lishijia/p/5897236.html
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat
https://blog.youkuaiyun.com/jiyiqinlovexx/article/details/51171452
步骤:
1,打印日志
2,日志分析,定位问题
3,设置调优参数