运行时数据区(java虚拟机所管理的内存)
- 程序计数器
将要执行字节码的行号指示器;线程私有 - java虚拟机栈
为虚拟机执行java方法服务;线程私有 - 本地方法栈
为虚拟机使用到的本地方法使用(hotspot 中合二为一) - java 堆
- 方法区
类信息,常量,静态变量,即时编译后的代码缓存数据
永久代(before jdk8,使用永久代实现方法区)
元空间(动态改变大小,垃圾回收) - 运行是常量池
方法区的一部分,类的版本,字段,方法,接口,等描述信息,编译产生的字面量和符号引用,运行期间的常量(String.intern())
直接内存(native数据库直接分配堆外内存)
======
对象创建
- 对象创建避免并发(CAS, TLAB(thread local allocation buffer)
- 分配方式(指针碰撞(Bump the pointer), 空闲列表(Free list))
- 对象设置(hash, age, class, bias)
- <init>()
对象访问
- 句柄访问(对象移动时只需要改变句柄中的地址,不改变ref)
- 直接指针访问(减少异常指针访问)
oom(outOfMemoryError)
- java 堆溢出
- 栈溢出
- 方法区运行时常量溢出
- 直接内存溢出