您的位置:首页 > 其它

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)二次编译 生成静态的目标平台代码

将发现程序中的热点位置 将本部分代码编译成本地机器码直接执行,这样会加快代码执行的效率
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息