JVM内存模型
2017-03-13 14:38
127 查看
运行时数据区结构及其特点
一 程序计数器
功能:存储当前线程正在执行的字节码行号
如果当前线程执行的java方法:记录虚拟机字节码指令地址
如果当前线程执行的native方法:该计数器的值为空
特点:
- 不会抛出outOfMemoryError异常
- 线程私有的
二 java虚拟机栈
功能:描述(java)方法执行时的内存模型
方法调用的过程就是栈帧入栈到出栈的过程
特点:
- 线程私有的
- 请求栈深大于虚拟机所允许的栈深,抛出stackOverFlowError
- 虚拟机栈请求不到足够的内存来扩展空间,将会抛出outOfMemoryError
三 本地方法栈
功能:与虚拟机栈的功能类似,但虚拟机栈描述的java方法执行的内存模型本地方法则为虚拟机提供使用本地方法的服务
特点:
- 线程私有的
- 请求栈深大于虚拟机所允许的栈深,抛出stackOverFlowError
- 虚拟机栈请求不到足够的内存来扩展空间,将会抛出outOfMemoryError
四 java堆
功能:用于存放实例对象
特点:
- 线程共享的
- 虚拟机启动时创建,虚拟机关闭时结束
- 垃圾收集器管理的主要部分,也被称作GC堆(Garbage Collected Heap)
- 一般可扩展。但申请扩展内存失败的时候会抛出 outOfMemoryError
五 方法区
功能:存储 虚拟机加载的类信息 常量 静态变量 即时编译器编译后的代码
特点:
- 线程共享的
- outOfMemoryError
六 运行时常量池
功能:存放类在编译期生成的字面量 和 符号引用 和编译出来的直接引用
特点:
- 线程共享的
- outOfMemoryError
- 方法区的一部分
六 直接内存
功能:用于缓存i/o数据
特点:
- 不是虚拟机运行时数据区的一部分
- outOfMemoryError
补充:
什么是直接引用什么是符号引用?在java中,一个java类将会编译成一个class文件。在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类 的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址
什么是栈帧??
java在方法执行时会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出入口
什么是局部变量表
存放基本数据类型 引用(reference) returnAddress(字节码指令的地址) 局部变量表的大小在编译期间确定,运行期间局部变量表的大小是不会改变的
什么是JTT编译(即时编译器)??
解释与编译的区别: 解释:边执行边解释成机器语言,(吃火锅边吃边涮) 编译:先编译成机器语言在执行,(先做好一桌子菜,做好菜再吃) java编译语言还是解释语言? 第一步: 先利用javac命令解释成BYTECODE文件(字节码文件,.class文件) 第二步: 1) 使用jvm边解释边允许 2)使用JIT翻译(编译)成机器指令,直接执行 3)二次编译 生成静态的目标平台代码 将发现程序中的热点位置 将本部分代码编译成本地机器码直接执行,这样会加快代码执行的效率