Java8后,内存分成如下几部分:
程序计数器PC Register,Metaspace,Stack,Heap,和本地方法栈。
- Metaspace用于存放类的元信息以及方法信息;而常量池和静态变量存在Heap中。
- Heap里面存储运行时产生的对象。
- Stack里面存放线程相关的数据,如局部变量,参数,对象引用等。
- PC Register存放的是当前线程执行的指令地址。本地方法栈是调用本地方法时用到的。
上图左边的Metaspace和Heap在JVM中是唯一的,全部线程都会共享这两片区域。右边的Stack/本地方法stack/程序计数器则是线程相关的。
从物理内存来讲,Metaspace不再使用虚拟机的内存,而是直接使用本地内存,由操作系统管理,仅受本地内存大小限制。
调整Metaspace内存大小的参数:
-
堆区Heap:
(1)存储的全部是对象。
(2)存放的这些对象是程序运行时动态创建的。
(3)jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
(4)常量池和静态变量存在Heap中。
栈区Stack:
(1)每个线程包含一个栈区,栈中只保存基础数据类型的对象和动态创建的对象的引用(对象本身都存放在堆区中)。
(2)每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
(3)由编译器自动分配释放,存放函数的参数值,局部变量的值等.
《JAVA面试机经基础篇》 郭屹老师著
欢迎关注我的其他专栏
什么是编程zhuanlan.zhihu.com