JVM

来源:互联网 发布:天猫跟淘宝有什么区别 编辑:程序博客网 时间:2024/06/06 15:54

jvm的内存自动管理机制 -- 内存划分

运行java程序时 jvm将其管理的内存划分为5块

1.本地方法栈 Native Method Stack

与VM Stack类型 服务于本地方法而非字节码文件 ∴ 一样有StackOverflowError和OOM

2.虚拟机栈 VM Stack

Java方法的内存模型:执行时创建 Stack Frame 存储变量 操作数 出口等

局部变量表中存的有 编译器可知类型(基本类型),对象引用reference,和returnAddress

when 请求栈深度大于VM允许深度 StackOverflowError  如果栈可以动态扩展 which most VM can

当无法请求到更多内存 OOM

3.Java堆 Heap

VM启动时创建 所有线程共享。基本用于存放实例对象

也有可能在其中划分出TLAB Thread Local Allocation Buffer 本地线程缓冲区用于线程私有

在物理上可以不连续,逻辑上是连续的

抛OOM。

4.方法区 Method Area

JVM规范中 是属于Heap的一个逻辑部分 但是要和Heap区分开。

存放被VM加载的类的信息,静态变量,常量,即时编译器编译后的代码 抛OOM

运行时常量池 Runtime Constant Pool 方法区的一部分

5.程序计数器 Program Counting Register

可以视为当前线程的字节码行号计数器

6. 直接内存

和VM直接管理的内存不同,但jdk1.4以后引入NIO 基于Channel操作堆外内存 用DirectByteBuffer对象。

只有程序计数器不会报OOM 其他都会有堆栈溢出。


第一部分Q&A

Q:jvm内存分块

A:..

Q:每一块的生命周期

A:Java Heap寿与天齐 方法区既然作为Heap的逻辑部分 应该也随着VM启动创建

而VM栈 本地方法栈 Programe Counting Register则是服务与线程 随着线程生灭

Q:每一块对应的异常

A:...

Q:每一块存什么

堆:对象实例 方法区:静态 即时编译 常量 栈:引用 局部变量表 计数器:类似行号计数器

Q:如何给每一块指定大小

堆: -Xms -Xmx 方法区(其实是永久代):-XX:MaxPermSize  栈:方法压栈确定大小 也可以动态扩展


0 0
原创粉丝点击