Java内存区域划分

运行时数据区域:Jvm在执行javademo时将它管理的内存划分为不同的区域。

一、运行数据区域。

这里写图片描述

1.程序计数器。

      较小的内存空间。线程私有的。当前字节码所执行字节码的行号指示器。通过这个值,来选取下一条要执行的字节码。在多线程中,每一个线程都有一个计数器,这样才能胡不影响。

2.Java虚拟机栈。

       线程私有。生命周期同线程。为jvm执行java方法。它是java方法的内存模型。栈帧来存放方法的局部变量,操作数栈,返回地址等,当方法执行完成的时候就释放该栈帧。常说的栈内存,就是指虚拟机栈。

        两种异常:①StackOverflowError  线程请求的栈深度>jvm允许。

                          ②OutOfMemoryError  内存动态扩展,无法申请到足够的内存。

3.本地方法栈

       线程私有。针对的Native方法,即本地方法。其他的和Java虚拟机栈完全相同。有的虚拟机,就不区分这俩部分。hotStop就是。

4.java堆

          线程共享。最大的区域。不需要连续内存。可扩展。

        存放所有的对象实例数组。 java堆的对象是垃圾回收器主要管理区域,故称GC堆。从回收角度看分 :新生代;老生代。更细分为:Eden空间,from Survivor空间,to Surviror空间。

Eden区的对象都是朝生夕死,发生minor gc的时候会清除eden区和survival区的,把存活的对象移到另一个Survival区,该survial区由老年代保证。当在年轻代中对象经过多次minor gc以后还存活,达到老年代的年纪,就会移动到老年代,还有就是大对象在年轻代无法存储,直接转到老年代,还有可能因为担保而进入老年代的

java堆也可以分配出多个线程私有的缓冲区,方便管理对象。

          OutOfmMemoryError:堆无法进行扩展。

5.方法区

          线程共享。存放被jvm加载的类信息,常量,静态变量。

        OutofMemeortyError:无法满足内存要求。

6.运行时常量池

        他是方法区的一部分,但是和方法区的常量池有区别,他存放的常量是在运行时产生的,而不是编译时产生的。注意与普通方法区的区别。jvm没有对这块区域的格式进行要求,这是唯一的没要求的区域。

异常同上。

二、直接内存。

         不属于jvm不受jvm的管理,而是直接受 用户机子  的管理。也有可能出现OUtofMemoryError异常。

三、异常。

    OutOfMemoryError:除了程序计数器不会之外,其他的内存空间都可能出现。

          比如:java堆:对象的数量太多、堆空间被设定的太小。

                   栈空间:申请的栈深度大于允许的深度、栈空间在扩展是无法申请到空间

                   方法区:

猜你喜欢

转载自blog.csdn.net/qq_35758236/article/details/81121634