java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙。墙外面的人想进去,墙里面的人想出去。
1.java内存分布
程序计数器
栈(局部变量、操作数、动态链接、方法出口)
每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。局部变量所需的内存空间在编译时完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的。在方法运行期间不会改变局部变量表的大小。
堆(存放对象实例及数组,也叫作GC堆)
方法区
存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。
2.堆分配方式
指针碰撞(Bump the Pointer)适用于使用Compact策略的垃圾回收
空闲列表(Free List)
3.对象内存分配同步策略
同步内存分配
TLAB(本地线程分配缓冲,每个线程都有自己的缓冲区,只有在缓冲区用完重新分配的时候才同步)
4.对象空间
对象头(对象自身的运行时数据:hashcode、gc分代年龄、锁状态...类元数据)
实例数据
对齐填充
5.对象的访问定位
使用句柄
直接指针
6.垃圾收集策略
标记-清除策略
复制算法
标记-整理算法
7.垃圾收集器
- Serial”是一个单线程、stop-the-world、使用复制算法的收集器。
- “ParNew” 是一个多线程、stop-the-world、使用复制算法的收集器。和”Parallel Scavenge”不同,它可以和”CMS”收集器一起使用。比如说,”ParNew”做了同步需要,以便它能在CMS的并发阶段继续运行。
- “Parallel Scavenge” 是一个多线程、stop-the-world、复制算法的收集器。
- “Serial Old”是一个单线程 、stop-the-world、使用标记-清除-压缩的收集器。
- “CMS”(Concurrent Mark Sweep)是一个并发、短暂停的收集器。
- “Parallel Old”是多线程、使用压缩算法的收集器。