使用ByteBuffer.allocateDirect分配的off heap内存大小本机进程
在Jvisualvm中安装 Mbeans插件,然后查看java.nio/BufferPool/direct 进程内使用代码获取
MBeanServer mbs = ManagementFactory. getPlatformMBeanServer() ;
ObjectName objectName = ne...
分类:
编程语言 时间:
2015-07-21 17:06:15
阅读次数:
339
背景知识
在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
显然...
分类:
其他好文 时间:
2015-05-27 15:55:07
阅读次数:
150
个人认为,学TI的OMAP也好,学Samsung的arm也好,学MIPS也好。最好的上手的方法就是忘了他是什么。(对于应用开发人员用操作系统下的驱动开发人员适用)
只要有操作系统, 不管他是什么处理器,其本质都只是处理器的核 + 一堆外设
那么对于做应用的人来说,没有任何本质的区别。
对于做驱动的人来说,只是在不同的器件上pinmux设置等东西有所不同。但本质都是为某一个操作系统写驱动。
...
分类:
其他好文 时间:
2015-05-15 13:41:05
阅读次数:
96
堆外内存导致的溢出除了java堆和永生代之外,西面这些区域还会占用较多的内存,这里所有内存总和受到操作系统进程最大内存的限制。
Direct Memory
线程堆栈
Socket缓存区:每个socket连接都receive和send两个缓存区,分别占大约37k和25k内存,连接多的话这块内存也很客观,如果无法分配则绘抛出IOException:Too many open files异常。
JNI代码...
分类:
其他好文 时间:
2015-02-09 16:08:49
阅读次数:
127
题意:有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作 每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件 谁没有石子可移时输掉游戏。问先手是否必胜。这个题是一个阶梯博弈的问题。一开始没有接触过,各种度娘然后搞懂了,赶快记下来。何为阶梯博弈?简单...
分类:
其他好文 时间:
2015-01-27 00:11:45
阅读次数:
319
Netty的“零拷贝”主要体现在如下三个方面:1) Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝...
分类:
Web程序 时间:
2014-11-05 06:58:50
阅读次数:
239
1115: [POI2009]石子游戏KamTime Limit:10 SecMemory Limit:162 MBSubmit:500Solved:308[Submit][Status]Description有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从...
分类:
其他好文 时间:
2014-10-04 11:35:06
阅读次数:
220
随着JVM虚拟机和JIT即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制。性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。
在4.x版本中,UnpooledB...
分类:
Web程序 时间:
2014-09-23 20:56:15
阅读次数:
425
在讨论如何回收堆外内存的时候,提到“NIO中direct memory的释放并不是通过finalize(),因为finalize不安全而且影响能”。Effective Java一书中也提到:Avoid Finalizers。人都有潜在的叛逆意识,别人给的结论或者制定的规范,除非有足够的理由说服你,除非懂得这么做背后的原因,否则只能是死记硬背,没有形象深入的理解,不能学到真正的东西。本文通过自己的理解和一些实际的例子,和大家一起更形象的理解finalize。还是那句经典的话“talking is cheap,...
分类:
编程语言 时间:
2014-09-21 18:46:11
阅读次数:
322
我们知道java代码无法强制JVM何时进行垃圾回收,也就是说垃圾回收这个动作的触发,完全由JVM自己控制,它会挑选合适的时机回收堆内存中的无用java对象。代码中显示调用System.gc(),只是建议JVM进行垃圾回收,但是到底会不会执行垃圾回收是不确定的,可能会进行垃圾回收,也可能不会。什么时候才是合适的时机呢?一般来说是,系统比较空闲的时候(比如JVM中活动的线程很少的时候),还有就是内存不足,不得不进行垃圾回收。我们例子中的根本矛盾在于:堆内存由JVM自己管理,堆外内存必须要由我们自己释放;堆内存的...
分类:
其他好文 时间:
2014-09-19 22:32:26
阅读次数:
492