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方法、一个用来执行外部方法。
以上就是虚拟机的内存区划分及其大致作用。
下一篇将总结一下内存 区域中常用的一些名词,例如栈帧、局部变量等。
原文地址:https://www.cnblogs.com/evildoerdb/p/10415942.html
时间: 2024-10-10 15:48:26