1. 运行时数据区
JVM体系结构中第二大块----运行时数据区Runtime Data Area
不同的JVM对于内存的划分方式和管理机制存在着部分差异,JRockit和 IBM-J9无方法区空间,本文主要探讨HotSpot
运行时数据区内存划分
JVM运行时数据区的内存划分分为五大区域:
-
程序计数器(PC计数器)
-
本地方法栈
-
虚拟机栈
-
堆区
-
方法区
JIT编译缓存可以独立划分或者放到方法区中
-
堆和方法区是线程共享的,它们是依托于进程而创建存在的;
-
程序计数器、虚拟机栈、本地方法栈是线程私有的,每个线程独占一份
JIT编译缓存属于线程共享数据
执行引擎中 的垃圾回收机制是针对共享数据区的,主要是针对堆区
2. 对象的实例化
创建对象new
的操作并不是原子性的:
Object obj = new Object();
对应的字节码指令:
0 new #2 <java/lang/Object>
3 dup
4 invokespecial #1 <java/lang/Object.<init>>
7 astore_1
这里,联想到了volatile关键字和DCL单例