垃圾回收机制
分代收集理论
复制算法(Copying)
实现简单、运行高效
内存复制、没有内存碎片
利用率只有一半
标记-清除算法(Mark-Sweep)
执行效率不稳定
内存碎片导致提前GC
标记-整理算法(Mark-Compact)
对象移动
引用更新
用户线程暂停
没有内存碎片
JVM中常见的垃圾收集器
-XX:+UseSerialGC:使用串行垃圾回收器
-XX:+UseParallelGC:使用并行垃圾回收器
-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器
-XX:+UseG1GC:使用 G1 垃圾回收器
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC (Java 11+)
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC (Java 12+)
JVM 启动参数
以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容。<br>
以 -D 设置系统属性。<br>
以 -X 开头为非标准参数, 基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 <br>JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数。<br>
以 –XX:开头为非稳定参数, 专门用于控制 JVM的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消。<br>
-XX:+-Flags 形式, +- 是对布尔值进行开关。<br>
-XX:key=value 形式, 指定某个选项的值。<br>
JVM 启动参数 -- 堆
-Xms:初始堆大小
-Xmx:最大堆大小<br>
-Xmn:新生代大小<br>
-XX:NewRatio:设置新生代和老年代的比值。<br>如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。<br>注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,<br>一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。<br>如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)<br>
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)<br>
JVM 启动参数 -- GC相关
-XX:+UseSerialGC:使用串行垃圾回收器
-XX:+UseParallelGC:使用并行垃圾回收器
-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器
-XX:+UseG1GC:使用 G1 垃圾回收器
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC (Java 11+)
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC (Java 12+)
JVM 启动参数 -- 运行模式
-server:设置 JVM 使用 server 模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,<br>适用于生产环境。在具有 64 位能力的 JDK 环境下将默认启用该模式,而忽略 -client 参数。
-client :JDK1.7 之前在32位的 x86 机器上的默认值是 -client 选项。设置 JVM 使用 client 模式,<br>特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者 PC<br> 应用开发和调试。此外,我们知道 JVM 加载字节码后,可以解释执行,也可以编译成本地代码再执行,<br>所以可以配置 JVM 对字节码的处理模式。
-Xint:在解释模式(interpreted mode)下运行,-Xint 标记会强制 JVM 解释执行所有的字节码,<br>这当然会降低运行速度,通常低10倍或更多。
-Xcomp:-Xcomp 参数与-Xint 正好相反,JVM 在第一次使用时会把所有的字节码编译成本地代码,<br>从而带来最大程度的优化。【注意预热】<br>
-Xmixed:-Xmixed 是混合模式,将解释模式和编译模式进行混合使用,有 JVM 自己决定,<br>这是 JVM 的默认模式,也是推荐模式。 我们使用 java -version 可以看到 mixed mode 等信息。<br>
JVM 启动参数 -- 分析诊断
-XX:+-HeapDumpOnOutOfMemoryError 选项,当 OutOfMemoryError 产生,即内存溢出(堆内存或持久代) 时,自动 Dump 堆内存。
(示例用法: java -XX:+HeapDumpOnOutOfMemoryError -Xmx256m ConsumeHeap)
-XX:HeapDumpPath 选项,与 HeapDumpOnOutOfMemoryError 搭配使用,指定内存溢出时 Dump 文件的目录。<br>如果没有指定则默认为启动 Java 程序的工作目录。<br> (示例用法: java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/ ConsumeHeap <br>自动 Dump 的 hprof 文件会存储到 /usr/local/ 目录下。)
-XX:OnError 选项,发生致命错误时(fatal error)执行的脚本。例如, 写一个脚本来记录出错时间, 执行一些命令,<br>或者 curl 一下某个在线报警的 url。<br>(示例用法:java -XX:OnError="gdb - %p" MyApp 可以发现有一个 %p 的格式化字符串,表示进程 PID。 <br>-XX:OnOutOfMemoryError 选项,抛出 OutOfMemoryError 错误时执行的脚本。)
-XX:ErrorFile=filename 选项,致命错误的日志文件名,绝对路径或者相对路径。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1506,远程调试。
对象的创建
虚拟机中对象的创建过程
检查加载
分配内存
内存空间初始化
设置
对象初始化
判断对象的存活
引用计数算法
可达性分析
Finalize方法
四大引用
强引用
软引用 SoftReference
弱引用 WeakReference
虚引用 PhantomReference