1、jvm的内存结构
![在这里插入图片描述](https://img-blog.csdnimg.cn/09743b27fd4f4b7ca8ea5396195ea84b.png)
方法区和堆是所有线程共享的内存区域,而java栈、本地方法栈和程序计数器是运行时线程私有的内存区域。
1、Java堆(Heap):是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
2、方法区(Method Area):方法区与Java对一样,是所有线程共享的内存区域。
-
它用于存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。
-
有时候会成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载。
-
方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。
3、程序计数器(Program Counter Register):是一块较小的内存空间,线程私有的,它的作用可以看做是当前线程所执行的字节码的信号指示器。就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,就是即将执行的指令代码)。
4、JVM栈(JVM Stacks):与程序计数器一样,是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表,操作栈,动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。
局部变量表里存储的是基本数据类型、returnAdress类型(指向一条字节码指令的地址)和对象引用, 这个对象引用有可能是指向对象起始地址的指针,也有可能是代表对象的句柄或者是与对象相关联的位置。局部变量所需的内存空间是在编译器编译期间确定。
5、**本地方法栈(Native Method Stacks)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)