JVM
2022-03-16 23:29:40 0 举报
AI智能生成
JVM
作者其他创作
大纲/内容
对象的分配策略
栈中分配对象
逃逸分析
对象优先在Eden分配
大对象直接进入老年代
长期存活的对象进入老年代
对象年龄动态判定
空间分配担保
垃圾回收机制
分代收集理论
复制算法(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+)
常量池
Class 文件常量池
字面量
符号引用
运行时常量池
字符串常量池
intern方法
JVM 启动参数
以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容。
以 -D 设置系统属性。
以 -X 开头为非标准参数, 基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有
JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数。
JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数。
以 –XX:开头为非稳定参数, 专门用于控制 JVM的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消。
-XX:+-Flags 形式, +- 是对布尔值进行开关。
-XX:key=value 形式, 指定某个选项的值。
JVM 启动参数 -- 堆
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:NewRatio:设置新生代和老年代的比值。
如:为3,表示年轻代与老年代比值为1:3
如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。
注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,
一个Survivor区占整个新生代的1/5
注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,
一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。
如果是0,则直接跳过新生代进入老年代
如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
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 模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,
适用于生产环境。在具有 64 位能力的 JDK 环境下将默认启用该模式,而忽略 -client 参数。
适用于生产环境。在具有 64 位能力的 JDK 环境下将默认启用该模式,而忽略 -client 参数。
-client :JDK1.7 之前在32位的 x86 机器上的默认值是 -client 选项。设置 JVM 使用 client 模式,
特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者 PC
应用开发和调试。此外,我们知道 JVM 加载字节码后,可以解释执行,也可以编译成本地代码再执行,
所以可以配置 JVM 对字节码的处理模式。
特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者 PC
应用开发和调试。此外,我们知道 JVM 加载字节码后,可以解释执行,也可以编译成本地代码再执行,
所以可以配置 JVM 对字节码的处理模式。
-Xint:在解释模式(interpreted mode)下运行,-Xint 标记会强制 JVM 解释执行所有的字节码,
这当然会降低运行速度,通常低10倍或更多。
这当然会降低运行速度,通常低10倍或更多。
-Xcomp:-Xcomp 参数与-Xint 正好相反,JVM 在第一次使用时会把所有的字节码编译成本地代码,
从而带来最大程度的优化。【注意预热】
从而带来最大程度的优化。【注意预热】
-Xmixed:-Xmixed 是混合模式,将解释模式和编译模式进行混合使用,有 JVM 自己决定,
这是 JVM 的默认模式,也是推荐模式。 我们使用 java -version 可以看到 mixed mode 等信息。
这是 JVM 的默认模式,也是推荐模式。 我们使用 java -version 可以看到 mixed mode 等信息。
JVM 启动参数 -- 分析诊断
-XX:+-HeapDumpOnOutOfMemoryError 选项,当 OutOfMemoryError 产生,即内存溢出(堆内存或持久代) 时,自动 Dump 堆内存。
(示例用法: java -XX:+HeapDumpOnOutOfMemoryError -Xmx256m ConsumeHeap)
-XX:HeapDumpPath 选项,与 HeapDumpOnOutOfMemoryError 搭配使用,指定内存溢出时 Dump 文件的目录。
如果没有指定则默认为启动 Java 程序的工作目录。
(示例用法: java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/ ConsumeHeap
自动 Dump 的 hprof 文件会存储到 /usr/local/ 目录下。)
如果没有指定则默认为启动 Java 程序的工作目录。
(示例用法: java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/ ConsumeHeap
自动 Dump 的 hprof 文件会存储到 /usr/local/ 目录下。)
-XX:OnError 选项,发生致命错误时(fatal error)执行的脚本。例如, 写一个脚本来记录出错时间, 执行一些命令,
或者 curl 一下某个在线报警的 url。
(示例用法:java -XX:OnError="gdb - %p" MyApp 可以发现有一个 %p 的格式化字符串,表示进程 PID。
-XX:OnOutOfMemoryError 选项,抛出 OutOfMemoryError 错误时执行的脚本。)
或者 curl 一下某个在线报警的 url。
(示例用法:java -XX:OnError="gdb - %p" MyApp 可以发现有一个 %p 的格式化字符串,表示进程 PID。
-XX:OnOutOfMemoryError 选项,抛出 OutOfMemoryError 错误时执行的脚本。)
-XX:ErrorFile=filename 选项,致命错误的日志文件名,绝对路径或者相对路径。
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1506,远程调试。
JVM 概述
JVM的跨平台与语言无关性
Java程序从编译到执行的过程
Java SE体系架构
JVM 的大致运行过程
运行时数据区域
Java 方法运行的内存区域
虚拟机栈
栈帧
局部变量表
操作数据栈
动态连接
返回地址
栈帧执行对内存区域的影响
程序计数器
本地方法(Native)运行的内存区域
本地方法栈
线程共享的区域
方法区
类信息
常量
静态变量
即时编译期编译后的代码
方法区/永久代
Java 堆
对象实例(几乎所有)
数组
Java 堆的大小参数设置
深入辨析堆和栈
线程独享还是共享
空间大小
内存溢出
栈溢出
堆溢出
方法区溢出
本机直接内存溢出
直接内存
虚拟机优化技术
编译优化技术——方法内联
栈的优化技术——栈帧之间数据的共享
对象的创建
虚拟机中对象的创建过程
检查加载
分配内存
并发安全
CAS机制
本地线程分配缓冲 TLAB
内存空间初始化
设置
对象初始化
对象的内存布局
对象头
实例数据
对其填充
对象的访问定位
使用句柄
直接指针
判断对象的存活
引用计数算法
可达性分析
Finalize方法
四大引用
强引用
软引用 SoftReference
弱引用 WeakReference
虚引用 PhantomReference
0 条评论
下一页