- 浏览: 3049381 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
前几天有同事问起,我本来印象中是有啥别的办法的,但想不起来了。
再看了看NIO相关部分的源码觉得貌似就这个办法靠谱(在Oracle/Sun的JDK上):
StackOverflow: Looking up how much direct buffer memory is available to Java?
通过反射获取java.nio.Bits类里的maxMemory与reservedMemory字段来达到观察的目的。
用Groovy演示一下:
虽说HotSpot VM有个VM参数叫做MaxDirectMemorySize,但实际上HotSpot VM并没使用这个参数,而是直接把它交给Java层,由NIO的Java部分来使用它。NIO的direct memory的分配和释放过程也没啥JMX之类的监控,完全是裸的,除了反射去暴力获取数据我还真不知道有啥办法了。
但这种暴力做法未必能持续靠谱。
例如说这里就有个patch稍微改变过Bits类的字段:http://cr.openjdk.java.net/~alanb/4837564/jdk/jdk.patch
反正是private的,改了也不需要通知普通的Java用户。
这么重要的数据居然没有合适的API去监控,真不爽…
再看了看NIO相关部分的源码觉得貌似就这个办法靠谱(在Oracle/Sun的JDK上):
StackOverflow: Looking up how much direct buffer memory is available to Java?
通过反射获取java.nio.Bits类里的maxMemory与reservedMemory字段来达到观察的目的。
用Groovy演示一下:
D:\sdk\groovy-1.7.6\bin>groovysh Groovy Shell (1.7.6, JVM: 1.6.0_26) Type 'help' or '\h' for help. ------------------------------------------------------------------------------- groovy:000> import java.nio.* ===> [import java.nio.*] groovy:000> Bits.reservedMemory ===> 0 groovy:000> Bits.maxMemory ===> 67108864 groovy:000> buf = ByteBuffer.allocateDirect(4096) ===> java.nio.DirectByteBuffer[pos=0 lim=4096 cap=4096] groovy:000> Bits.reservedMemory ===> 4096 groovy:000> Bits.maxMemory ===> 129761280 groovy:000> buf.direct ===> true groovy:000> buf.hasArray() ===> false groovy:000> buf.cleaner().clean() ===> null groovy:000> Bits.reservedMemory ===> 0 groovy:000> Bits.maxMemory ===> 129761280 groovy:000> quit
虽说HotSpot VM有个VM参数叫做MaxDirectMemorySize,但实际上HotSpot VM并没使用这个参数,而是直接把它交给Java层,由NIO的Java部分来使用它。NIO的direct memory的分配和释放过程也没啥JMX之类的监控,完全是裸的,除了反射去暴力获取数据我还真不知道有啥办法了。
但这种暴力做法未必能持续靠谱。
例如说这里就有个patch稍微改变过Bits类的字段:http://cr.openjdk.java.net/~alanb/4837564/jdk/jdk.patch
反正是private的,改了也不需要通知普通的Java用户。
这么重要的数据居然没有合适的API去监控,真不爽…
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16278以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10453先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22396(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21874之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48367刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
在Java NIO中,零拷贝主要体现在通过DMA(Direct Memory Access,直接内存访问)和操作系统内核层面的优化来实现。 1. **NIO基础** - **通道(Channels)**:通道类似于流,但它是双向的,可以读也可以写。常见的...
Java NIO(非阻塞I/O)编程是Java平台中的一种高效I/O处理方式,相比传统的BIO(阻塞I/O),NIO提供了更灵活、性能更高的数据传输机制。本书《Java NIO Programming Cookbook》旨在深入浅出地介绍如何利用Java NIO...
4. **内存映射文件(Memory-Mapped File)**:NIO支持将文件直接映射到内存,通过直接缓冲区(Direct Buffer)进行访问,减少了磁盘I/O操作,加快了大数据的读写速度。 在导出千万级别的大数据时,我们可能需要考虑...
Java提供了一些系统属性来调整缓冲池的大小,例如`-Djava.nio.channels.FileChannel.mapMode=normal`可以设置文件映射模式,`-Djava.nio.directMemory.page.size=16k`可以设置直接内存页大小。合理配置这些参数可以...
1. **直接内存(Direct Memory)**:Java的NIO(New Input/Output)库支持直接内存分配,数据可以直接在物理内存中读写,减少了Java对象之间的内存拷贝,提升了性能。使用`java.nio.DirectByteBuffer`类可以创建直接...
堆外内存,也被称为直接内存(Direct Memory),是指不在JVM的堆内存中分配的内存,而是直接在操作系统的本地内存中进行分配。这样可以避免Java对象创建时的额外开销,例如垃圾收集的检查和内存分配的慢速。 1. **...
直接内存(Direct Memory)在Java虚拟机(JVM)中是一个重要的优化手段,它与Java堆内存和栈内存不同,不直接由Java对象引用。直接内存的使用主要涉及到Java的NIO(New Input/Output)库,特别是ByteBuffer类。这个...
堆外内存,也称为直接内存(DirectMemory),是指在JVM堆内存之外分配的内存区域。它并非JVM规范定义的标准内存区域,但因其在IO操作中的性能优势而被广泛应用于高效的NIO框架中,如Netty和RPC。 直接内存的优势...
6. 零拷贝技术:如直接缓冲区(Direct Buffers)和内存映射文件(Memory-Mapped Files),如何减少数据传输中的CPU和内存开销。 7. Socket通信:NIO中的SocketChannel和ServerSocketChannel,以及它们如何改进网络I/...
3. **优化代码**:减少不必要的对象创建,及时释放不再使用的资源,优化数据结构,避免大数据量一次性加载等。 4. **调整JVM参数**:根据应用需求合理配置JVM内存参数,避免内存分配不足或过大导致的浪费。 5. **...
3. **零拷贝**:通过Direct Memory和Zero-Copy机制,提升I/O性能,减少CPU上下文切换。 4. **协议支持**:支持多种高性能序列化协议,如Protobuf,加速数据交换。 Netty 的高可靠性体现在: 1. **链路检测**:保持...
在JVM的内存模型中,直接内存(Direct Memory)是一个特殊的区域,虽然它并不属于标准的JVM运行时数据区,但对高性能的应用程序设计有着重要的影响。本文将深入探讨直接内存的概念、用途、优缺点以及如何进行配置。 ...
通过直接内存(Direct Memory),Netty避免了Java堆内存的分配和释放带来的性能损失,尤其在处理大数据量时,直接内存的使用可以显著减少内存复制,进一步提高系统效率。在Java代码中,可以通过DirectByteBuffer来...
7. **直接内存(Direct Memory)**:不在JVM规范中定义,但现代JVM通常使用它来提高性能,尤其是在处理大容量数据时。通过NIO(New Input/Output)库,Java程序可以直接访问操作系统内存,避免了JVM堆的内存分配和...
Nogc的核心是使用堆外内存,通常通过直接内存(Direct Memory)实现。它利用了Java的`sun.misc.Unsafe`类或者`java.nio`包中的ByteBuffer,这些类可以直接操作非堆内存。此外,它采用高效的并发数据结构,如使用CAS...
Scruffy-Marshall库的核心在于其对堆外内存(Direct Memory)的高效利用。在Java中,堆内存是通过JVM进行管理的,但堆外内存则直接由操作系统分配,不受JVM垃圾回收机制的影响,因此在处理大量数据时,可以避免频繁...
7. **零拷贝(Zero-Copy)**:Netty 通过使用内存映射文件(Memory-Mapped Files)和直接缓冲区(Direct ByteBuffers)实现了零拷贝,提高了数据传输效率。 8. **线程安全**:Netty 的设计使得其在多线程环境下表现...