JVM堆(1.6、1.7、1.8)
一、jdk1.6
在jdk1.6里,堆的具体划分如下:
栈:包含本地方法栈、虚拟机栈、程序计数器
堆
方法区(永久代):包含运行时常量池、字符串池
二、jdk1.7
栈:包含本地方法栈、虚拟机栈、程序计数器
堆:字符串池
方法区(永久代):包含运行时常量池
和1.6相比字符串常量池从方法区挪到了堆上
三、jdk1.8
栈:包含本地方法栈、虚拟机栈、程序计数器
堆:字符串池
元空间(堆外直接内存):运行时常量池
和1.7相比,直接取消了方法区(永久代),新增元空间。元空间放在直接内存里,不再占用堆内存。
四、各个区域解释
程序计数器
一个只读的存储器,用来记录虚拟机执行的字节码指令地址,线程私有。确保时间片轮转之后程序还能继续执行。
Java虚拟机栈
线程私有存储器,程序运行时,每个方法都会打包成一个栈帧,存储了局部变量表、操作数栈、方法出口等信息,然后放入栈,每个时刻在执行的方法就是当前栈顶的栈帧。方法的执行对应着虚拟机栈的出栈入栈过程。
本地方法栈
调用本地native方法
堆
存储对象的运行时数据区。在虚拟机运行时内存总体最大的一块。几乎所有对象都要在堆上分配(JIT优化,逃逸分析,无逃逸的会进行锁消除、栈上分配内存,参数逃逸-不会被外部访问会进行锁消除),也是垃圾回收发生的主要区域
方法区(永久代)或者元空间
存储被加载的类信息、常量、静态变量、即时编译后的代码等数据。没加载一个类,方法区就分配一定的内存空间
运行时常量池
方法区的一部分。存储编译阶段生产的信息,包括字面量和符号引用常量两类。符号引用常量包括累的全限定名称、字段名称和描述符、方法名称和描述符。
原文地址:https://blog.csdn.net/qq_34374058/article/details/143771421
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!