复制算法
标记清除
标记整理
gc root
jvm参数类型
1.标配参数
2.x参数
3.xx参数
Boolean类型
公式:-XX+或者-某个属性值(+表示开启-表示关闭)
jps
jinfo:查看java正在运行java程序后台信息
例查看属性是否开启:jinfo -flag PrintGCDetails {进程号}
例是否串行垃圾回收器: -XX+ UseSerialGC
KV设值类型
公式:-XX:属性key=属性值value
例:-XX:MetaspaceSize=128m
-XX:MaxTenuringThreshold=15 (多少次交换升老年区)
jinfo举例,如何查询当前运行程序的配置
jinfo -flag 配置项 进程编号
jinfo -flags 进程编号 (模糊查询当前进程编号的所有参数)
坑题
查看初始默认
java -XX:+PrintFlagsInitial
查看修改和更新的内容
java -XX:+PrintFlagsFinal (有:被修改过的)
打印命令行参数
java -XX:+PrintCommandLineFlags -version
最后一个参数看本次运行使用的垃圾回收器
基本调优
-Xms 初始大小内存,默认为物理内存1/64,等价于-XX:initialHeapSize
-Xmx 最大分配内存,默认为物理内存1/4,等价于-XX:MaxHeapSIze
-Xss 设置单个线程栈的大小,一般默认为512k-1024k,等价于-XX:ThreadStackSize
-Xmn 设置年轻代大小,一般不用调
-XX:MetaspaceSize 设置元空间大小,元空间的本质和永久代类似,都是对jvm规范中方法区的实现。
不过元空间与永久代之间最大区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。
-XX:+PringGCDetails 打印垃圾回收日志,如下图
-XX:SurvivorRatio
-XX:NewRatio
-XX:MaxTenuringThreshold 设置垃圾最大年龄
强引用
例:object2 是强引用,不会被垃圾回收
软引用
内存不足:
弱引用gc后没有引用被回收。
WeakHashMap key被滞空后对应的map键值对就会被垃圾回收器回收掉
虚引用
类似后置通知的虚引用
StackOverflowError 栈空间被撑爆,最简单的例子是写一个递归方法。方法区在栈
Java heap space 堆空间被撑爆
GC overheadLimit exceeded 频繁的GC但是没有什么效果,回收不了多少就会报错。
Direct buffer memory
unable to create new native thread
Metaspace