总是记不住这几个运行时数据区,还是再捋一遍吧。
常见分类,一共5个区域,分为2种类型:
- 线程共享
- 方法区 Method Area
- 堆内存 Heap
- 线程独享
- 虚拟机栈 VM Stack
- 本地方法栈 Native Method Stack
- 程序计数器 Program Counter Register
1.方法区
存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码缓存等数据。
JDK6时,计划放弃永久代,逐步改为本地内存来实现方法区的计划;
JDK7,把原本放在永久代的字符串常量池、静态变量等移出;
JDK8,完全废弃永久代的概念,改用在本地内存中实现的元空间Meta-space来代替,把JDK7遗留的(主要是类型信息)全部移到元空间中。
2.堆内存
G1收集器出现为分界,之前,业界绝对主流的Hotspot虚拟机,内部垃圾收集器全部都基于“经典分代”来设计,需要新生代、老年代收集器搭配才能工作;之后,Hotspot虚拟机里也出现了不采用分代设计的新垃圾收集器。
所有线程共享的Java堆中,可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB),以提升对象分配时的效率。