JVM的DirectMemory设置

转载 2015年07月07日 10:02:15

几台服务器的JVM占用内存总是持续增长,大大超过-Xmx设定的值,服务器物理内存几乎被耗尽。

使用jmap查看JVM的内存使用,发现jvm的堆大小完全在-Xmx参数设定的范围之内,那问题只能处在别的地方了。

JVM除了堆内存之外,就只有栈内存和DirectMemory了。栈空间每个线程是固定的,线程数也没可能多到可以占用这么多内存的程序,所以怀疑的目标就在DirectMemory上了。

DirectMemory是java nio引入的,直接以native的方式分配内存,不受jvm管理。这种方式是为了提高网络和文件IO的效率,避免多余的内存拷贝而出现的。DirectMemory占用的大小没有直接的工具或者API可以查看,不过这个在Bits类中是有两个字段存储了最大大小和已分配大小的,使用反射可以拿到这个数据:

Class<?> c = Class.forName("java.nio.Bits");
Field maxMemory = c.getDeclaredField("maxMemory");
maxMemory.setAccessible(true);
Field reservedMemory = c.getDeclaredField("reservedMemory");
reservedMemory.setAccessible(true);
Long maxMemoryValue = (Long)maxMemory.get(null);
Long reservedMemoryValue = (Long)reservedMemory.get(null);

结果证实了猜测,DirectMemory增长失控了。

原来,DirectMemory 的默认大小是64M,而JDK6之前和JDK6的某些版本的SUN JVM,存在一个BUG,在用-Xmx设定堆空间大小的时候,也设置了DirectMemory的大小。加入设置了-Xmx2048m,那么jvm最终可分配的内存大小为4G多一些,是预期的两倍。

解决方式是设置jvm参数-XX:MaxDirectMemorySize=128m,指定DirectMemory的大小。

从DirectMemory谈谈Java NIO

本机内存DirectMemory,属于C Heap,可以通过参数-XX:MaxDirectMemorySize指定。 如果不指定,该参数的默认值为Xmx的值减去1个Survior区的值。如设置启动参...

Java_JVM参数-XX:MaxDirectMemorySize 与 两种 ByteBuffer: heap,direct ByteBuffer

ByteBuffer有两种: heap ByteBuffer -> -XX:Xmx 1.一种是heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收,...

Java Max Direct Memory Size设置

注意Max Direct Memory Szie的默认设置。

《深入理解java虚拟机》学习笔记2——Java内存溢出实例

通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收...

Mycat性能调优指南

本篇内容来自于网络 JVM调优:  内存占用分两部分:java堆内存+直接内存映射(DirectBuffer占用),建议堆内存 适度大小,直接映射内存尽可能大,两种一起占据操作系统的1/...

JVM -XX:MaxDirectMemorySize

-XX:MaxDirectMemorySize

Direct Memory

1、不属于java堆内存、分配内存其实是调用操作系统的Os:malloc()函数。 2、容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆的最大值(-Xmx指...

聊聊JVM常用参数设置

整体考虑堆大小-Xms3550m, 初始化堆大小。通常情况和-Xmx大小设置一样,避免虚拟机频繁自动计算后调整堆大小。 -Xmx3550m,最大堆大小。考虑分代设置堆大小首先通过jstat等工具查看...

JAVA NIO之浅谈内存映射文件原理与DirectMemory

JAVA类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段。本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原...

DirectMemory(堆外(Off-Heap)缓存BigMemory的一个实现)

就Java 本地Cache(非分布式)而言,存在3个地方可以存放数据:Heap, OffHeap和Disk BigMemory非开源产品,所以其源码不能通过正常渠道拿到。同时...
  • philos3
  • philos3
  • 2016年04月09日 09:48
  • 1538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM的DirectMemory设置
举报原因:
原因补充:

(最多只允许输入30个字)