美文网首页
直接内存(堆外内存)(gold_axe)

直接内存(堆外内存)(gold_axe)

作者: 胖达_4b7e | 来源:发表于2020-09-30 10:23 被阅读0次

怎么样会用到直接内存?

1.Unsafe类

比较危险 不推荐使用的
但是强行要用的话 可以反射来用

public class UnsafeDemo {
    public static final int _1MB = 1024 * 1024;

    public static void main(String[] args) throws Exception {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        long addr = unsafe.allocateMemory(100*_1MB);
    }
}

危险 ! 非正常用法!
加上直接内存的限制参数 -XX:MaxDirectMemorySize=10m
完全没生效! 法外之地!

2. ByteBuffer类

Netty 的直接内存,ByteBuffer
底层会调用操作系统的 malloc 函数。
正常用户
ByteBuffer.allocateDirect(128*1024*1024);
这种是可以被 -XX:MaxDirectMemorySize=10m 这样限制的

3.Native方法

JNI 或者 JNA 程序,直接操纵了本地内存,比如一些加密库
记得close, 就可以避免内存泄漏

直接内存优缺点

优点

  • 不在堆里面, 当然不用垃圾回收了
  • 本来要刷到写缓存也要先到直接内存, 省了这步从堆到直接内存的复制
  • 可以用直接内存 ,做jvm进程间的共享
  • 更大!

缺点

  • 内存泄漏难查了
  • 只能 存byte[], 存复杂对象比较麻烦

内存泄漏了, 几乎根本查不出来

故意不close

 public static String decompress(byte[] input) throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(input));
        try {
            copy(gzip, out);
            return new String(out.toByteArray());
        }finally {
            try{ 
              //gzip.close();
            }catch (Exception ex){
            }
            try{
                out.close();
            }catch (Exception ex){
            }
        }
    }

top 命令查看

看看是不是堆太大了

jmap –heap


只有300多M 明细不的堆占用的 1.5G 这么大

jmap -histo 进程| head -20 看看 占最多的对象


最多也就20M

那再看看是不是栈 占用的

jstack 进程号


也就十来个线程
每个1M , 一共十几M

只能反省,哪里没close

直接内存的大小限制

可以用-XX:MaxDirectMemorySize 限制 正常分配的直接内存大小
如果不设 默认是 等于
新生代的最大值 = 新生代的最大值 - 一个 survivor

就是

-Xmx 减去 一个survivor

相关文章

  • 直接内存(堆外内存)(gold_axe)

    怎么样会用到直接内存? 1.Unsafe类 比较危险 不推荐使用的但是强行要用的话 可以反射来用 危险 ! 非正常...

  • 直接内存与 JVM 源码分析

    直接内存(堆外内存) 直接内存有一种叫法,堆外内存。 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从...

  • Netty-内存管理

    但是内存拷贝对性能有可能影响比较大,所以Java中可以绕开堆内存直接操作堆外内存,问题是创建堆外内存的速度比堆内存...

  • java直接内存

    直接内存 很多一说起直接内存,就会想到堆外内存。但是从概念上说,两者确实不是一回事。堆外内存,就是堆以外的内存,我...

  • java直接内存

    直接内存 很多一说起直接内存,就会想到堆外内存。但是从概念上说,两者确实不是一回事。堆外内存,就是堆以外的内存,我...

  • Java内存结构和垃圾回收

    内存结构 java内存结构主要有三大区块:栈内存,堆内存,堆外内存(直接内存)。其中: 1.栈内存主要是存放线程的...

  • Netty理论五:内存池

    DirectBuffer和HeapBuffer(堆外直接内存和堆内存) DirectBuffer顾名思义是分配在直...

  • 堆外内存-堆内内存-零拷贝

    1. 直接内存(堆外内存) DirectByteBuffer points: 分配在jvm heap外面,但是也是...

  • JVM如何分配和回收堆外内存

    JVM内存模型 在JVM中内存被分成两大块,分别是堆内存和堆外内存,堆内存就是JVM使用的内存,而堆外内存就是非J...

  • 堆外内存 之 DirectByteBuffer 详解

    堆外内存 堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建...

网友评论

      本文标题:直接内存(堆外内存)(gold_axe)

      本文链接:https://www.haomeiwen.com/subject/bfluuktx.html