JAVA
2019-04-19 14:39:06 121 举报
AI智能生成
JAVA虚拟机思维导图
作者其他创作
大纲/内容
JVM运行时数据区
方法区(永久代)
线程共享
Class信息
常量(1.7后,字符串常量被移出)
静态变量
即时编译后的代码
虚拟机栈
线程独享
栈帧
局部变量表
操作数栈
动态链接
方法出口
堆
线程共享
-Xmx
最大堆大小
-Xms
初始堆大小
-Xmn
设置新生代大小
-Xss
设置栈大小
本地方法栈
native method stack
程序计数器
线程独享
小内存,存储执行字节码号
监控工具
cli
jps
JVM Process Status Tool
-v:显示启动时jvm参数
-m 显示main函数参数
jstat
JVM Statistics Monitoring Tool
-class:类装载,卸载相关信息
-gc:监视java堆使用情况
jinfo
Configuration Info for Java
-flags 查看所有flag
-flag 查看/设置 flag
jmap
Memory Map for Java
-heap 显示java堆详细信息
-dump 生成堆快照 jmap -dump:format=b,file=test.bin 13940
jhat
JVM Heap Dump Browser
很少使用
jstack
Stack Trace for Java
-F 强制输出堆栈
-l 出堆栈信息外,附加锁信息
图形化工具
jconsole
VisualVM
类加载
加载
从网络,文件中加载外部的二进制流按照格式存储在方法区中,内存中实例化一个Class对象
验证
验证魔数 0xCAFEBABE
版本号
元数据验证
字节码是否安全
符号引用验证
准备
初始化类变量static,赋值初始值
解析
将符号引用转为直接引用,相当于告诉引用内存地址是什么
invokedynamic每次都会重新引用,其他执行会缓存
初始化
不是调用类的构造函数,而是执行static赋值及语句
使用
卸载
类型卸载,需要很多判断,无此Class的引用,全部实例被回收,启动类加载器加载的不会被回收
类加载机制
双亲委派模型 Parents Delegation Model
启动类加载器Bootstrap,C++,加载系统类 lib/
ExtensionClassLoad lib/ext
ApplicationClassLoad classpath 类库
分双亲委派模型
tomcat
CatalinaLoader 加载的class对webapp不可见
CommonLoader 加载的class对Tomcat及各应用可见
SharedLoader 加载的class对所有webapp可见,对tomcat不可见
WepappLoader 每个应用单独,对其他不可见
每一个jsp文件对应一个JSP类加载器
多线程
多线程安全
互斥同步
synchronized
monitorenter 指令
monitorexit 指令
非阻塞同步
CAS Compare and Swap
无同步方案
不依赖堆及公共系统资源
线程本地存储
锁优化
自旋锁
有多个处理器时,让等待线程忙循环
锁消除
编译器对不存在共享数据竞争的锁进行消除
锁粗化
对同一个对象反复加锁时,会放大锁的范围
轻量级锁
偏向锁
锁会偏向第一个获得它的线程,如果没有被其他线程获取,则不需要重新获取锁
GC
对象死亡判断
引用计数算法
对象拥有引用计数器,引用加一,引用失效减一
循环引用
可达性分析算法
通过"GC Roots"作为起点,从起点往下搜索。
GC Roots
虚拟机栈
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(即一般说的Native方法)引用的对象
引用
强引用:普遍存在,Object object= new Object()
软引用
弱引用
虚引用
垃圾收集算法
标记-清除算法
概念:分“标记”“清除”两个阶段,
缺点
效率问题,标记,清除两个阶段效率都不高
产生大量不连续内存碎片
复制算法
概念:将内存划分为大小相等的两块,每次使用一块,内存用完时,将存活对象移至另一块上
缺点
内存只能使用一半
实际:将内存划分为Eden与两块survivor区,比例为8:1:1,相当于只浪费1%的空间,老年代担保
标记-整理算法
概念:类似标记-清楚算法,但后续只是将存活对象移至一边。
分代收集算法
概念:根据存活周期将内存划分为几块,一般分为新生代与老年代,各自采用不同的收集算法
垃圾收集器
serial
复制算法
单线程
Stop The World
无线程交互开销
Client下是较好选择
新生代
parnew
复制算法
serial多线程版
server端首选新生代收集器
参数
-XX:SurvivorRatio
-XX:PretenureSizeThreshold
-XX:HandlePromotionFailure
-XX:ParallelGCThreads
配合CMS
parallel scavenge
复制算法
并行多线程处理器
控制吞吐量 = 运行用户代码的时间 / (运行用户代码时间+垃圾收集时间)
参数
-XX:MaxGCPauseMillis
-XX:GCTimeRatio
-XX:UseAdaptiveSizePolicy
serial old
标记整理
单线程
Client模式下
Server模式下:1.5前配合Parallel scavenge,Concurrent Mode Failure时使用
parallel old
标记整理
多线程
parallel scavenge老年代
cms
标记清除
初始标记
并发标记
重新标记
并发清除
g1收集器
划分多个Region
初始标记
并发标记
最终标记
筛选回收
参数
-XX:UseSerialGC
Client端默认开启,Serial + Serial Old
-XX:UseParNewGC
默认关闭,打开后使用ParNew + Serial Old
-XX:UseConcMarkSweepGC
默认关闭,打开使用 Parnew + CMS + Serial Old
-XX:UseParallelGC
Server端默认开启,Parallel Scavenge + Serial old
-XX:UseParallelOldGC
默认关闭,打开使用Parallel Scavenge + Parallel Old
-XX:+PrintGC
-XX:+PrintGCDetails
内存模型
主内存
工作内存
操作
lock
unlock
read
load
use
assign
store
write
volatile
变量值被修改后,所有线程可见
0 条评论
下一页