2.内存管理
JVM规范中指定运行时数据去分为以下几块,方法区、堆、程序计数器、虚拟机栈、本地方法栈。其中方法区、堆是所有线程共享的,而程序计数器、虚拟机栈、本地方法栈是线程私有的。
2.1 内存分配
线程共享? | jvm规范 | hotspot实现 | 存放内容 | 可能异常 | hotspot选项控制 |
共享 | 方法区 | 永久代 | 存放加载的类 类信息包含常量池、静态变量 |
OutOfMemoryError: PermGen space |
-XX:MaxPermSize=64m |
堆 | 堆-年轻代 堆-老年代 |
对象&数组, 最大的一块内存 gc管理的主要区域 |
OutOfMemoryError: Java heap space |
-Xms128m -Xmx700m -XX:NewRatio=2 |
|
私有 | PC程序计数器 | PC程序计数器 | 下一条字节码指令地址 | 不会发生内存溢出 | |
虚拟机栈 | 栈 | 执行java字节码的栈 | StackOverflowError | -Xss | |
本地方法栈 | JNI调用的执行机器码栈帧 |
永久代包含类信息和常量池,运行时常量池是每个类或者接口的类文件中的常量池的运行时内存存储区域,常量池保存代码中的字面量、类名等,如一行String str = "123";"123"和"java.lang.String"等等常量。
堆
HotSpot虚拟机为了把GC分代收集扩展至方法区,堆进一步划分为
2.2 创建一个对象涉及的内存
1.堆中部分
对象内存透视,一个对象包含对象头和实例实属,对象头又包含Mark Word和元数据指针。
Mark Word 是个位图,每一位都标识
未锁定的状态