直接内存溢出

一、什么是直接内存

  • 直接捏成是一块由操作系统直接管理的内存,也叫堆外内存
  • 可以使用Unsafe或ByteBuffer分配直接内存
  • 可用-XX:MaxDirectMemorySize控制,默认是0,表示不限制

二、为什么使用直接内存

直接内存 vs 堆内存  io效率高

推荐参考:Java直接内存与非直接内存性能测试-阿里云开发者社区

三、什么场景使用直接内存

  • 1 有很大的数据需要存储,它的生命周期又很长
  • 2 适合频繁的IO操作,比如网络并发场景

四、分配直接内存

可以使用Unsafe或ByteBuffer类分配直接内存

  • Unsafe.allocateMemory(size)
  • ByteBuffer.allocateDirect(size)

两个类的区别:

1、Unsafe:

  • 溢出时报:java.lang.OutOfMemoryError(没有任何小尾巴)
  • -XX:MaxDirectMemorySize 不起作用

2、ByteBuffer:

  • 溢出时报: java.lang.OutOfMemoryError: Direct buffer memory
  • -XX:MaxDirectMemorySize  起作用
  • ByteBuffer底层也是用Unsafe去分配内存的

你可能感兴趣的:(JVM,jvm)