首页 > 代码库 > 深入理解java虚拟机二,内存管理机制
深入理解java虚拟机二,内存管理机制
java 虚拟机自动内存管理。
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同区域
1 程序计数器
每个线程都有一个独立的计数器,用来指示需要执行的字节码的位置。
2 虚拟机栈
虚拟机栈是用来描述java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于储存局部变量表,操作栈,动态链接,方法出口等信息。
每一个方法被调用直至执行完成的过程,就对应着一个栈帧从虚拟机栈中从入栈到出栈的过程。
虚拟机栈线程私有,声明周期和线程一样。
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,
在方法运行期间不会改变局部变量表的大小
当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
当虚拟机栈自动扩展时无法申请到足够内存时会抛出OutOfMemoryError异常
3 本地方法栈
与虚拟机栈作用类似,不过是作用在本地方法上
4 java堆
用途是存放对象实例,在虚拟机启动的时候创建,被所有线程共享。
根据分代收集算法,分为新生代和老年代。
java堆可以处于物理上不连续的内存空间中。
5 方法区
被所有线程共享。用于存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。
垃圾收集行为在这个区域是比较少出现的,这个区域的内存回收目标主要是针对常量池和对类型的卸载。
6 运行时常量池
方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池。
用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载之后存放到方法区的运行时常量池。
7 直接内存
本机的直接内存,不受JAVA堆大小限制。
深入理解java虚拟机二,内存管理机制