JVM-运行时内存模型
1.什么是JVM运行时的内存? (摘取自 【深入理解java虚拟机】)
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
2.运行时内存都有那些?
线程共享:
1.堆:
java堆是java虚拟机所管理的内存中最大的一块,在java虚拟机启动的时候创建,此区域的唯一目的就是创建对象实 例,几乎所有对象实例都在这里分配内存。因此这里也经常发生GC
2.方法区
存放已被虚拟机加载的类的信息,常量,静态变量,即时编译器编译后的代码等数据,这里很少发生gc,这里gc主要针 对是类的卸载,方法区的常量池 。
常量池:方法区里的运行时常量池,存放静态编译器间产生字面量和符合引用,动态编译期间产生的的常量也有可能放在这里例如String.intern();
线程独有:
3.java栈(虚拟机栈)
为方法服务,每次方法的调用都会产生一个新的栈振,用户存放局部变量,操作数栈,动态链接,方法返回地址,生命 周期和线程一样,
帧栈: 每个帧栈都包括一个指向运行时的所属方法的引用,持有这个引用,是因为要支持方法调用过程中的动态链接,动态 链接是将常量池中的符号引用在运行期间转换为直接引用。
局部变量: 局部变量表里面存储的是基本数据类型,方法返回地址和对象的引用(对象指针,这个对象的引用可能是个句柄(当 一个对象引用例如数据库或者操作系统内存块或对象会使用句柄))
操作数栈: 操作数栈的作用是用来存储运算结果以及运算操作数,它不同于局部变量表通过索引来访问, 而是通过入栈和出栈的方式来访问
4.本地方法栈
类似java虚拟机栈,不过是为本地方法服务的
5.程序计算器
当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改变这个计算器的值来选取下一条需要执行的字节码指令{分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计算器来完成}(仅仅是概念模型,各种虚拟机可能通过更高效的方式去实现)
一个对象在内存中怎么存放的?
对象的引用是放在栈,对象实例以及成员变量【非静态的】放在堆,元数据放在方法区(元数据:(描述这个类的信息(Class实例)
3.栈-详细认识
4.方法区-详细认识