jvm
-
类加载器:加载通过编译的字节码文件对象,把这个字节码文件加载到内存中
-
字节码执行引擎:解析字节码文件,以及执行命令
-
本地方法栈:管理本地方法,可以通过本地方法来访问虚拟机的运行时数据区
-
程序计数器:记录程序运行的状态
-
元空间:永生代;存放生命周期较长的变量和类信息
-
栈:先进后出的一种线性存储空间,由系统自动分配
-
堆:由用户自己申请的动态内存空间;
-
年轻代1/3:eden初生区8 minor gc,幸存区2,survivor
-
老年代2/3 对象按生命周期从初生代往老年代转移,在使用结束后从堆中释放内存
-
GC垃圾回收:
-
Cms:垃圾回收机制 采用标记整理回收机制
-
Gc:通过三色标记算法,对目标的可达性进行标记,对不可达目标进行回收在任务开始时,所有对象都是白色,先将根下所有访问过的对象标记为黑色,将所有引用对象标记为灰色。在任务结束后,所有已经完全访问的黑色标记对象,和所有完全不被访问的白色对象将被回收释放空间。
在年轻代中发生的垃圾回收称作minor GC / young GC,回收非常频繁并且回收速度快
在老年代中发生的垃圾回收称作full GC / Major GC,速度非常慢且占内存
(占用大内存的大对象和长期存在的对象会直接进入老年代)
GC 执行垃圾回收的阶段?
-
1.显式调用回收方法
-
2.老年代空间不足,发生full gc
-
3对象长期存在,在计数器达到一定次数后;新生代空间不足,发生 minor gc
-
4.存放大对象,内存不足会直接放进老年代,触发full gc
-
5.元空间空间不足
动态回收:
触发对象动态判断的条件时机?
在经过minor gc后,存放在survivor中的对象年龄会逐渐增长,当内存相加后大于survivor的50%后,survivor中会进行年龄判断,年龄从小到大(1-n)的对象的个数大于50%,其他年龄大于n的对象就会被直接转移到老年代。该方法实质上是为了将长期存活的对象尽早释放内存。
jvm调优
一般是通过显式增加新生代的内存空间,以提高minor GC的次数来减少full GC的次数。 Full GC会占用较大的内存和性能
-Xmx7168m 堆最大空间
-Xms7168m 堆最小空间
-Xmn3584m 年轻代空间
-Xss512k 每个线程的栈堆大小
-XX:+UseG1GC cms垃圾回收机制
-XX:NewRatio=1
-XX:SurvivorRatio=6
-XX:TargetSurvivorRatio=60
-XX:MetaspaceSize=2048m 元空间内存
-XX:MaxMetaspaceSize=2048m 元空间最大内存
-XX:ReservedCodeCacheSize=2048m
-XX:SoftRefLRUPolicyMSPerMB=200
-XX:CICompilerCount=6