JVM
2022-03-16 23:29:40 0 举报
AI智能生成
登录查看完整内容
JVM
作者其他创作
大纲/内容
逃逸分析
栈中分配对象
对象优先在Eden分配
大对象直接进入老年代
长期存活的对象进入老年代
对象年龄动态判定
空间分配担保
对象的分配策略
分代收集理论
实现简单、运行高效
内存复制、没有内存碎片
利用率只有一半
复制算法(Copying)
执行效率不稳定
内存碎片导致提前GC
标记-清除算法(Mark-Sweep)
对象移动
引用更新
用户线程暂停
没有内存碎片
标记-整理算法(Mark-Compact)
-XX:+UseSerialGC:使用串行垃圾回收器
-XX:+UseParallelGC:使用并行垃圾回收器
-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器
-XX:+UseG1GC:使用 G1 垃圾回收器
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC (Java 11+)
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC (Java 12+)
JVM中常见的垃圾收集器
垃圾回收机制
字面量
符号引用
Class 文件常量池
运行时常量池
intern方法
字符串常量池
常量池
以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容。
以 -D 设置系统属性。
以 -X 开头为非标准参数, 基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数。
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
JVM 启动参数 -- 堆
JVM 启动参数 -- GC相关
-server:设置 JVM 使用 server 模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有 64 位能力的 JDK 环境下将默认启用该模式,而忽略 -client 参数。
-client :JDK1.7 之前在32位的 x86 机器上的默认值是 -client 选项。设置 JVM 使用 client 模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者 PC 应用开发和调试。此外,我们知道 JVM 加载字节码后,可以解释执行,也可以编译成本地代码再执行,所以可以配置 JVM 对字节码的处理模式。
-Xint:在解释模式(interpreted mode)下运行,-Xint 标记会强制 JVM 解释执行所有的字节码,这当然会降低运行速度,通常低10倍或更多。
-Xcomp:-Xcomp 参数与-Xint 正好相反,JVM 在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。【注意预热】
-Xmixed:-Xmixed 是混合模式,将解释模式和编译模式进行混合使用,有 JVM 自己决定,这是 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/ 目录下。)
JVM 启动参数 -- 分析诊断
JVM 启动参数
JVM的跨平台与语言无关性
Java程序从编译到执行的过程
Java SE体系架构
JVM 的大致运行过程
JVM 概述
虚拟机栈
局部变量表
操作数据栈
动态连接
返回地址
栈帧执行对内存区域的影响
栈帧
程序计数器
Java 方法运行的内存区域
本地方法栈
本地方法(Native)运行的内存区域
类信息
常量
静态变量
即时编译期编译后的代码
方法区/永久代
方法区
对象实例(几乎所有)
数组
Java 堆的大小参数设置
Java 堆
线程共享的区域
线程独享还是共享
空间大小
栈溢出
堆溢出
方法区溢出
本机直接内存溢出
内存溢出
深入辨析堆和栈
运行时数据区域
直接内存
编译优化技术——方法内联
栈的优化技术——栈帧之间数据的共享
虚拟机优化技术
检查加载
分配内存
CAS机制
本地线程分配缓冲 TLAB
并发安全
内存空间初始化
设置
对象初始化
虚拟机中对象的创建过程
对象头
实例数据
对其填充
对象的内存布局
使用句柄
直接指针
对象的访问定位
引用计数算法
可达性分析
Finalize方法
判断对象的存活
强引用
软引用 SoftReference
弱引用 WeakReference
虚引用 PhantomReference
四大引用
对象的创建
JVM
0 条评论
回复 删除
下一页