1、虚拟机运行时数据区
抽象概念,内部实现依赖寄存器、主内存、高速缓存
计算器=指令+数据
指令相关:虚拟机栈、本地方法栈、程序计数器
数据相关:堆、方法区
2、线程私有区域(程序计数器、本地方法栈、虚拟机栈)
线程私有;随线程的启动而产生,线程的结束而消亡
程序计数器
是java虚拟机规范里面, 唯一 一个 没有规定任何 OutOfMemoryError 情况的区域
记录当前线程执行的字节码的行号指示器,各线程之间相互独立、互不影响。
作用:记录线程执行的字节码行号,线程切换时,线程能正常执行
本地方法栈
存放native方法
虚拟机栈
栈:一种数据结构,先进后出,和Java中调用方法的特性一致
设置栈大小:-Xss
查看字节码指令:1、javac xx.java文件转化为xx.class文件 2、javap -v xx.class > 1.txt 反编译class文件保存到txt文件中 3、查看txt文件中的字节码指令
虚拟机栈是线程私有的,线程执行时,每个方法对应一个栈帧,栈帧中存储了局部变量表、操作数栈、返回地址、动态连接、....,Java中方法的执行就是对应着栈帧在虚拟机栈中入栈和出栈过程
局部变量表:存储基本数据类型、局部的对象存储引用地址
操作数栈:存放方法执行的操作数,也是一个栈,可以操作任意数据类型,方法的执行就是操作这些数据入栈和出栈
动态连接:多态,存放类加载、运行时才能确定的方法
返回地址:正常返回,程序计数器中的地址作为返回,异常,异常处理器表确定
3、数据共享区域
堆
几乎所有对象都存储在该区域,也是垃圾回收的主要区域
参数调整:
-Xms:堆的最小值
-Xmx:堆的最大值
-Xmn:新生代的大小
-XX:NewSize 新生代最小值
-XX:MaxNewSIze 新生代最大值
方法区
静态变量、常量、类信息、即时编译期编译后的代码
4、虚拟机中对象的初始化
检查加载-内存分配(指针碰撞、空闲列表、并发安全、CAS机制)-内存空间初始化-设置-对象初始化
5、对象的访问定位
句柄
直接指针
6、逃逸分析
虚拟机提供的优化技术,对于线程私有的对象分配在栈上,而不分配在堆上。跟随着方法的调用创建或者销毁,不需要垃圾回收,提升性能。
逃逸分析的目的是判断对象的作用域是否会逃逸出方法体,不会逃出方法体时,将对象存储在栈中,提升性能。
-server JVM运行的模式之一, server模式才能进行逃逸分析,JVM运行的模式还有mix/client
-Xmx10m和-Xms10m:堆的大小
-XX:+DoEscapeAnalysis:启用逃逸分析(默认打开)
-XX:+PrintGC:打印GC日志
-XX:+EliminateAllocations:标量替换(默认打开)
-XX:-UseTLAB关闭本地线程分配缓冲
网友评论