JVM Learn

堆内与堆外

  • 常说的堆,指的是堆内内存,由JVM「托管」的内存区域。对应的英文是:on-heap Memory。所有的对象都是放在堆中。

  • 堆的特点:

    • 由GC管理,一旦堆大小大于1GB会出现比较明显的暂停。
    • 对象存储到GC中无需进行序列化、反序列化的。

堆外

  • 堆外就是JVM开辟出来的,堆以外的一块「非托管」内存区域。对应的英文是:off-heap Memory。堆外内存也是 JVM 进程开辟的一块内存空间。只不过,GC不会「光顾」这里。

  • 堆外的特点:

    • 由操作系统直接管理。别的进程能够直接访问。
    • 特别适合分配次数少,读写非常频繁的场景。
    • 可以避免在分配GB级别的内存而造成GC开销。
  • 堆外的缺点:

    • 容易出现内存泄漏,难以排查。
    • 对象的存储需要序列化、和反序列化。

因为堆外内存由此特点,很多高性能的应用组件基于off-heap来提高性能。