JVM
2018-01-09 14:01:19 70 举报
AI智能生成
jvm 学习资料
作者其他创作
大纲/内容
类加载
bootstrap 类加载
本地方法
加载rt.jar
Extension 类加载
system(application)类加载
自定义加载器
class for name
classload
class 文件内容
版本,magic 数,minor,major版本
常量池,其他都引用这个池
描述符 访问权限,父类,接口,属性,方法
方法
行代码表,用于调试
本地变量表,栈帧中所有的局部变量
工具
jstat
字段含义
引用
软引用
弱引用
线程
系统线程
vm thread
timer thread
gc thread
编译器 thread
信号分发线程
线程内部组成
程序计数器(pc)
指向方法区的一个内存地址,每次递增
栈(stack)
固定大小的LIFO后进先出的数据结构
每次方法调用产生一个栈帧,总是在栈顶部
栈帧分配内存在堆中
native stack
一般等于c栈
stack frame
局部变量数组
执行过程中所有变量,包括this引用
包括 基本类型引用,reference 引用,returnAddress
除了 long 和 double 64位双精度类型,其他占一个位置(slot)
String 类型在jdk移到堆中实现,原来在方法区
类的静态变量,jdk7后移到heap中
操作数栈
类似与寄存器,频繁的出入栈,复制,交换,产生和消费变量
过程
新方法调用入栈到顶,返回或异常出栈
优化
通过共享变量表实现
链接
方法区/永久区
内容
classloader引用
运行时常量池
因为数据太大不存储在字节码中,而存在常量池中,字节码中保持引用
数值型常量,字段,方法,属性引用
字段数据
字段名,类型,修饰符,属性
方法数据
每个方法的方法名,返回值类型,参数,修饰符,属性
方法代码
字节码,操作数栈大小,局部变量大小
局部变量表
异常表
从栈帧中一层一层往上抛,除非有异常处理器
finally 异常处理器处理所有异常,来实现最后执行
记录异常起始点,结束点,pc偏移量,异常常量池索引
多个异常处理器
没有特定制定什么地方存储
oracle 中会当做非堆内存
open jdk 中codecache 当做heap中独立域
对所有线程共享,保证线程安全
堆(heap)
组成
新生代/new
eden 区
survivor
from survlvor
to survlvor
GC算法
分成三个区,eden区和另外2个分别执行复制清理
达到制定的的XX:MaxTenuringThreshold 默认0,一般设置为7 后移到old区
或者大对象和数组等
三个区默认比例 8:1:1,一般通过XX:SurvivorRatio设置为4
即三个区比例为:4:1:1
新生代产生的gc 叫做 Minor gc 或 Young Gc
老年代/old
一般设置为-XX:NewRatio=4,即新生代:年老代=1:4
优先级 -XX:NewSize/-XX:MaxNewSize 》-Xmn(推荐)》-XX:NewRatio
老年代的gc称之为 Major GC
Full Gc 是清理新生代和老年代以及部分永久区
对象存储内容
GC root
class 系统加载器加载的对象
Thread 活的线程
stack local 方法的局部变量
monitor used 同步对象
垃圾回事(GC)
分代收集,新生代复制算法,老年代标记清理算法
选择
UseSerialGC 串行,1.5以前默认,以后智能判断
UseParallelGC 并行
吞吐量优先
XX:ParallelGCThreads=20,建议与cpu相等
XX:+UseParallelOldGC 老年代
XX:MaxGCPauseMillis 年轻代gc最长时间,否则调整年轻代大小
XX:+UseAdaptiveSizePolicy,自动调整eden区和survivor区比例
UseConcMarkSweepGC 并发
响应时间优先
XX:+UseConcMarkSweepGC
XX:CMSFullGCsBeforeCompaction=0 设置fullgc后进行压缩和整理
其他参数
XX:+UseThreadPriorities
启用本地线程优先级API。即使 java.lang.Thread.setPriority() 生效,不启用则无效。
GC日志
结构
jstat
什么情况会出现Full GC
gc被调用
old区空间不足
minor gc后 进入old区但old区空间不够
cms gc
promotion failed
minor gc 时 surivor 放不下,进入old区old区也放不下
concurrent mode failure
cms gc 后放到old区,但old区空间不够
分配大对象
直接进入old区,但old区连续空间不足
考虑增加 内存整理 相关的参数 UseCMSCompactAtFullCollection
永久代不足
非堆内存
永久区/perm
驻留字符串
符号表
Hashtable
引用计数,为零的时候删除
代码缓存(code cache)
JIT
热代码编译的机器码,存储在非堆内存中cache code中
方法区
0 条评论
下一页