JAVA内存管理

时间:2022-04-02 01:02:10

  java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙。墙外面的人想进去,墙里面的人想出去。

1.java内存分布

  程序计数器

  栈(局部变量、操作数、动态链接、方法出口)

每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。局部变量所需的内存空间在编译时完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的。在方法运行期间不会改变局部变量表的大小。

堆(存放对象实例及数组,也叫作GC堆)

方法区

  存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。

2.堆分配方式

  指针碰撞(Bump the Pointer)适用于使用Compact策略的垃圾回收

  空闲列表(Free List)

3.对象内存分配同步策略

  同步内存分配

  TLAB(本地线程分配缓冲,每个线程都有自己的缓冲区,只有在缓冲区用完重新分配的时候才同步)

4.对象空间

  对象头(对象自身的运行时数据:hashcode、gc分代年龄、锁状态...类元数据)

  实例数据

  对齐填充

5.对象的访问定位

  使用句柄

  直接指针

6.垃圾收集策略

  标记-清除策略

  复制算法

  标记-整理算法

7.垃圾收集器

JAVA内存管理

  • 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”是多线程、使用压缩算法的收集器。

http://ifeve.com/our_collectors/