深入理解java虚拟机之jvm内存模型

2018-10-22  本文已影响0人  个子太高的程序媛

深入理解JVM—JVM内存模型

java的内存模型包括:本地方法区,java堆,Java虚拟机栈,本地方法栈,程序计数器

1.程序计数器(线程私有)

内存很小,用做当前线程所执行的字节码的行号指示器,也就是说当前线程接下来要执行的操作是计数器的值所决定的。每个线程有自己独立的计数器(线程私有)相互操作互不影响

2.java虚拟机栈也就是java栈(线程私有)

它也是线程私有的,每个方法被执行的时候都会同时创建一个栈,存放了编译期可知的各种基本数据类型,也可能存放指向对象起始地址的引用指针,所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果虚拟机栈可以动态扩展(当前大部分的Java 虚拟机都可动态扩展,只不过Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。

3.本地方法栈(线程私有)

本地方法栈与虚拟机栈的区别不过是虚拟机栈为虚拟机执行Java 方法服务,而本地方法栈则是为虚拟机使用到的Native 方法服务(其余基本与虚拟机栈一样)

4.Java 堆(线程共享)

此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”,可通过-Xmx和-Xms 扩展大小

5.方法区(又称静态区 包含所有的class和static变量 线程共享)

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

上一篇下一篇

猜你喜欢

热点阅读