java虚拟机内存划分

java虚拟机内存区域

参照官方文档 1.8版本

Oracle虚拟机内存划分文档 : https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

The Java Virtual Machine defines various run-time data 
areas that are used during execution of a program. 
Some of these data areas are created on Java Virtual 
Machine start-up and are destroyed only when the Java 
Virtual Machine exits. Other data areas are per thread. 
Per-thread data areas are created when a thread is created
and destroyed when the thread exits.

大概意思就是:Java虚拟机定义了在程序执行期间使用的各种运行
时数据区域。其中一些数据区域是在Java虚拟机启动时创建的(例如堆、方法区),仅
在Java虚拟机退出时销毁。其他数据区域是每个线程。线程数据区
域是在线程退出时创建和销毁线程时创建的(虚拟机栈、本地方法栈、程序计数器)。

The pc Register(程序计数器或者pc寄存器):
    程序计数器是线程私有的,如果线程执行的不是native 
    方法,则它保存的是当前虚拟机执行的java指令地址。
    如果是native方法,则它的值未定义
Java Virtual Machine Stacks(虚拟机栈或者“C stacks(C 栈)”):
    它随线程的创建而创建,它主要用来保存栈帧,
    栈帧主要用来保存局部变量、并在方法调用和返回结果中起作用,栈帧可以被分配在堆上,它的内存空间是不需要连续的。
    
    栈的大小可以人为设定。
    当计算的栈空间大于实际的栈空间的时候
    会抛出StackOverflowError。
    当栈需要进行扩容的时候,所剩的内存空间不满足扩容所需的大小的时候,
    或者内存不足以为新线程创建栈,会抛出OutOfMemoryError。
Heap(堆):
    堆是线程共享的数据区域、它是运行时数据区、分配所有实
    例对象内存和数组的内存。
    堆在虚拟机启动的时候创建、堆的内存空间有垃圾收集器管理
    (垃圾收集器类型可以有程序员来指定、选择合适的收集器)
    。堆的内存也可以不连续。堆上的对象永远不会显示的释放、
    即使调用了System.gc()方法也不一定会进行垃圾回收。
    程序员可以指定堆的初始大小、最大值和最小值。
    
    如果计算所需要的堆内存+已用堆内存超过堆的最大内存、则
    会抛出OutOfMemoryError。
Method Area(方法区):
    方法区属于线程共享的区域,它用来存储虚拟机加载的类信息、常量等。虚拟机规范认为它在逻辑上面是堆的一部分。但是可以不在方法区上面进行垃圾收集。它上面的对象属于永远不会被回收的。
    
    它的大小同样可以由伟大的程序员来指定。
    当需要加载的类信息的内存大于可用的方法区的内存时候,
    他会抛出OutOfMemoryError。
Run-Time Constant Pool(运行时常量池):
    运行时常量池是从方法区中分配的。当虚拟机构建类和接口时
    将为类和接口创建运行时常量池。
    在创建类或接口时,如果运行时常量池的构造需要的内存比Java虚拟机的方法区域中可用的内存多,则会抛出一个OutOfMemoryError。
Native Method Stacks(本地方法栈):
    本地方法栈和虚拟机栈作用差不多、只不过一个用来执行native方法、一个用来执行外部方法。
    
以上就是虚拟机的内存区划分及其大致作用。

下一篇将总结一下内存 区域中常用的一些名词,例如栈帧、局部变量等。

猜你喜欢

转载自www.cnblogs.com/evildoerdb/p/10415942.html