java 堆外内存_Java堆外内存之二:堆外内存使用总结

目录:

有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache(给它包装了个酷一点的名字,叫BigMemory),以及现在项目中的Memcached等。

使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。

二、堆外内存的大小设置

可以通过设置-XX:MaxDirectMemorySize=10M控制堆外内存的大小,默认的情况下堆外内存大小是64M。

5e35c3b9e0a14e056200fea2086aba4b.png

二、堆外内存的回收

三、堆外内存的监控

通过查看Bits的maxMemory和reservedMemory属性来监控使用情况。

packagecom.dfs.util.base;importjava.lang.reflect.Field;public classCollectDirectMemoryInfo {/*** @VM args:-XX:MaxDirectMemorySize=10m*/

public static void main(String[] args) throwsNoSuchFieldException, SecurityException, ClassNotFoundException,

IllegalArgumentException, IllegalAccessException {//Class c = java.nio.Bits.class;//无法访问

Class c = Class.forName("java.nio.Bits");

Field maxMemory= c.getDeclaredField("maxMemory");

maxMemory.setAccessible(true);

Field reservedMemory= c.getDeclaredField("reservedMemory");

reservedMemory.setAccessible(true);synchronized(c) {

Long maxMemoryValue= (Long) maxMemory.get(null);

Long reservedMemoryValue= (Long) reservedMemory.get(null);

System.out.println("maxMemoryValue:" + maxMemoryValue / (1024 * 1024) + "m");

System.out.println("reservedMemoryValue:" + reservedMemoryValue / 1024 * 1024 + "m");

}

}

}

运行结果:

e4a3eeed7cb09b5f31fc3880e074adab.png

四、堆外内存操作类

4.1、Unsafe类

4.2、NIO的ByteBuffer来操作堆外内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值