java内存划分

程序计数器(线程私有):

        特点:线程创建时创建,执行本地方法时其值为undefined。

虚拟机栈(线程私有):

        特点:(栈内存)为虚拟机执行java方法服务:方法调用时创建栈帧-->局部变量表-->局部变量,对象引用

                    如果线程请求的栈深度超出了虚拟机锁允许的深度,就会出现StackOverFlowError。-Xss规定了栈的最大空间

                    虚拟机栈可以动态扩展,如果扩展到无法申请到足够的内存,会出现OOM。

本地方法栈(线程私有):

        特点:java虚拟机栈是为虚拟机执行java方法服务的。而本地方法栈则为虚拟机执行使用到的Native方法服务。

                java虚拟机没有对本地方法栈的使用和数据结构做轻质规定。SunHotSpot 把java虚拟机栈和本地方法栈合二为一。

                会抛出StackOverFlowError和OutOfMemoryError

java堆,即内存堆(线程共享):

        特点:被所有线程共享,在java虚拟机启动时创建,几乎所有的对象实例都放到堆中

                    GC的管理的主要区域

                    物理不连续。逻辑上连续,并可以动态扩展。无法扩展时抛出OutOfMemoryError

方法区(线程共享):

        特点:用于存储已被虚拟机加载的类信息,常量。静态变量,即编译器编译后的代码的数据

                SunHotSpot虚拟机把方法区叫做永久带

运行时常量池(方法区的一部分):

        特点:受到方法区的限制,抛出OutOfMemoryError

你可能感兴趣的:(java内存)