JVM的参数类型
1. 标配参数:
在JDK各个版本之间稳定,很少有大的变化
-version
-help
java -showversion
2. X参数:
-Xint 解释执行
-Xcomp 第一次使用就编译成本地代码
-Xmixed 混合模式(默认)
3. XX参数:(重点)
Boolean类型:
公式:
-XX:+或者- 某个属性值
+表示开启,-表示关闭
示例:
是否打印GC收集细节
开启: -XX:+PrintGCDetails
关闭: -XX:-PrintGCDetails
是否使用串行垃圾回收器
-XX:-UseSerialGC
-XX:+UseSerialGC
KV设值类型:
公式:
-XX:属性key=属性值value
示例:
设值元空间为128m
-XX:MetaspaceSize=128m
默认:接近21M
设值后:
示例:
设值老年代晋升年龄
-XX:MaxTenuringThreshold=15
jinfo举例,如何查看当前运行程序的配置:
jinfo -flags id
两个经典参数:-Xms和-Xmx:
-Xms 等价于 -XX:InitialHeapSize 初始堆内存
-Xmx 等价于 -XX:MaxHeapSize 最大堆内存
一般配置大小一致,防止堆扩展
-Xms 1024m (默认系统内存1/64)
-Xmx 1024m (默认系统内存1/4)
查看JVM参数
-XX:+PrintFlagsInitial
查看默认初始值:
java -XX:+PrintFlagsInitial -version
-XX:+PrintFlagsFinal
查看修改更新
java -XX:+PrintFlagsFinal -version
=
为默认值:=
为修改后的值
运行时修改参数:
java XX:+PrintFlagsFinal -XX:MetaspaceSize=512m class文件名
-XX:PrintCommandLineFlags
打印命令行参数
java -XX:+PrintCommandLineFlags -version
常用JVM基本配置参数
-Xms 初始堆内存大小,默认为物理内存1/64
等价于 -XX:InitialHapSize
-Xmx 最大堆内存,默认为物理内存的1/4
等价于 -XX:MaxHeapSize
-Xss 初始栈内存,一般默认为512k~1024K
等价于 -XX:ThreadStackSize
如果为0,则使用的是系统默认值
JDK9默认值:
-Xmn 新生带大小
-XX:MetaspaceSize 元空间大小,使用本地内存,受本地内存限制
默认21807104,不到21M
-XX:+PrintGCDetails 打印GC细节
-XX:SurvivorRatio 设置新生代中eden和s0/s1的空间比例
默认:-XX:SurvivorRatio=8 ,Eden:s0:s1=8:1:1
假如:-XX:SurvivorRatio=4 ,Eden:s0:s1=4:1:1
-XX:NewRatio 配置年轻带与老年代在堆的结构比例
默认 -XX:newRatio=2 ,新生代占1,老年代占2,新生代占堆的1/3
假如 -XX:newRatio=4 ,新生代占1,老年代占4,新生代占堆的1/5
-XX:MaxTenuringThreshold 设置垃圾的最大年龄
默认为15
如果为0,则新生代GC后不经过Survivor,直接到老年代
强引用、软引用、弱引用、虚引用分别是什么?
整体架构:
强引用:
当内存不足,JM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收
。
强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。
对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,一般认为就是可以被垃圾收集的了(当然具体回收时机还是要看垃圾收集策略)。
软引用:
软引用是一种相对强引用弱化了一些的引用,需要用java.lang.ref. SoftReference
类来实现,可以让对象豁免一些垃圾收集。
对于只有软引用的对象来说,
- 当系统内存充足时它不会 被回收
- 当系统内存不足时它 会被回收。
软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收!
弱引用:
弱引用需要用java.lang.ref.WeakReference
类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行, 不管JVM的内存空间是否足够,都会回收该对象占用的内存。
WeakHashMap:
虚引用:
虚引用需要java.lang.ref. PhantomReference
类来实现。
顾名思义,就是形同虚设,与其他几种引用都不同,虛引用并不会决定对象的生命周期。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。
虚引用的主要作用是跟踪对象被垃圾回收的状态。仅仅是提供了一种确保对象被finalize以后,做某些事情的机制。
PhantomReference的get方法总是返回null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。
换句话说,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。
Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
总结:
OOM
java.lang.StackOverflowerError:
栈深度溢出,属于Error。
java.lang.OutOfMemoryError:java heap space
堆溢出,属于Error。
java.lang.OutOfMemoryError:GC overhead limit exceeded:
java.lang.OutOfMemoryError:Direct buffer memory:
java.lang.OutOfMemoryError:unable to create new native thread
java.lang.OutOfMemoryError:Metaspace