1、类的加载过程
.class->加载->验证->准备->解析->初始化
自定义加载继承classloader。
2、双亲委派
简单理解的话是先向上委派让父类去加载,父类没有加载不了最后自己加载。这样能够避免类的重复加载。
3、内存模型运行时数据区
堆、栈、本地方法栈、元空间(常量、静态变量、类信息)、程序计数器。
栈:局部变量、操作数栈、动态链接(程序运行时将符号引用转为直接引用)、方法出口、异常
4、年轻代minor. gc(eden、survior(from、to));
老年代full. GC(),可以通过jvisualvm工具查看占有情况。
5、调优参数
栈-xss、堆-xmx大、-xms小、-xmn新生代
-xx:metaspacesize、-xx:maxmetaspacesize
6、逃逸分析
分析对象动态作用域,当一个对象在方法中被定义后,可能被外部方法所引用,产生于即时编译模式下。
7、-xx:+PrintGCDetail显示gc详情。
8、引用计数器法
9、可达性分析算法 从gcroot查找找到标记为非垃圾,未找到全部标记为垃圾,gcroors:线程本地变量、静态变量、本地方法栈变量等。
10、常用的引用类型:
强引用,软引用(GC后看内存是否够用,不够清除,应用浏览器后退),弱引用,虚引用。
11、垃圾回收算法
标记清除:效率不是很高,标记清除后空间不连续,产生了大量碎片,适合老年代。
复制算法:内存分为大小相等两部分,把存活对象一次性复制到另外一部分连续存放,在把另外一部分全部清空。但是空间利用率算法,年轻代用复制算法。
标记整理:
标记出存活对象,同时挪动连续存放,适合老年代。
12、垃圾收集器
serial:串行收集,单线程。(新生代使用的是复制算法,老年代使用的是标记整理)
parnew:是serial的多线程版本(新生复制,老年标记整理),只适合年轻代。
parallel scavenge:类似parnew,关注的是吞吐量。(新生复制,老年标记整理)。
cms收集器:关注的是stop world 的时间短,提升用户的体验。使用的是标记清除算法,只能用在老年代使用。初始标记->并发标记->重新标记->并发清理->并发重置,抢系统资源,会产生浮动垃圾,产生大量碎片,可以通过标记清除后整理。
g1收集器:将内存分为等值大小区块,用户设定垃圾收集时间,可预估收集时间,然后排序,在设定时间内完成收集。采用的算法是复制算法。分为三种模式收集,
young GC
mixed GC
full GC
13、常用jvm内存分析工具
jmap查看堆内存,jps查看进程,jstack检查死锁,JVisualVM综合工具(好用),jstat查看,GCEasy 对内存的使用量
14、内存泄露
老旧的数据一直占内存资源,一直没有被gc清除,最终导致泄露,甚至导致内存溢出OOM。
15、大内存用G1,尽量让垃圾对象在年前代回收掉,减少full GC。
JVM原理透析
最新推荐文章于 2023-02-11 18:17:23 发布