`
aigo
  • 浏览: 2538236 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

JVM的DirectMemory设置

JVM 
阅读更多

原文:http://dongliu.net/post/504141

 

几台服务器的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的大小。

分享到:
评论

相关推荐

    一篇文章掌握整个JVM,JVM超详细解析!!!

    JVM先想想一些问题1 我们开发人员编写的Java代码是怎么让电脑认识的2 为什么说java是跨平台语言3 Jdk和Jre和JVM的区别4 为什么要学习JVM深入...Stack)3 Java内存结构3.1 直接内存(Direct Memory)3.2 JVM字节码执

    java-homework

    (必做)画一张图,展示Xmx,Xms,Xmn,Meta,DirectMemory,Xss这些内存参数的关系。 4。 (选做)检查一下自己维护的业务系统的JVM参数配置,用jstat和jstack,jmap查看一下详情,并且自己独立分析一下大概情况...

    超硬核!!!一篇文章搞定整个JVM运行时数据区

    JVM运行时数据区1 JVM运行时数据区2 解析JVM运行时数据区2.1 方法区(Method Area)2.2 Java堆(Java Heap)2.3 程序计数器(Program Counter ...3.1 JVM字节码执行引擎3.2 垃圾收集系统3.3 直接内存(Direct Memory)...

    java8源码-jvm-study:jvm-study

    Direct buffer memory : 直接内存太大(-XX:MaxDirectMemorySize=100m) Java heap space: 堆内存溢出 (-Xms30m -Xmx30m -XX:+PrintGCDetails) GC overhead limit exceeded: gc占用98%的资源回收效率不足2%的...

    Java版水果管理系统源码-java-advanced:java-高级

    Xmx、Xms、Xmn、Meta、DirectMemory、Xss 这些内存参数的关系。 进阶 从Classloader到模块化,动态加载的插件机制。 使用自定义Classloader机制,实现xlass的加载。 实现xlass打包的xar(类似class文件打包的jar)的...

    99乘法表java源码-roadmap:路线图

    DirectMemory OutOfMemory Stack OutOfMemory Stack OverFlow 1.1.6. 使用工具尝试解决以下问题,并写下总结 当一个Java程序响应很慢时如何查找问题 当一个Java程序频繁FullGC时如何解决问题,如何查看垃圾回收日志 ...

    并行深度学习系统SpeeDO.zip

    Direct Memory Access,全称远程直接数据存取,专用于解决网络传输中服务器端数据处理的延迟)等高性能技术, 而这些技术需要昂贵的硬件支持,大大增加了系统构建和维护的成本和难度,导致这些系统很难复制和普及到通用...

    Crafting a Compiler by Charles N. Fisher Richard J. LeBlanc 带目录版

    14.2.3 Direct Procedure Call Graphs 560 14.2.4 Depth-First Spanning Tree 560 14.2.5 Dominance 565 14.2.6 Simple Dominance Algorithm 567 14.2.7 Fast Dominance Algorithm 571 14.2.8 Dominance Frontiers ...

    Geoserver Beginner`s Guide

    JVM Version and fonts 58 JAI usage and configurations 58 Update Sequence 58 Resource Cache 59 Configuration and catalog 59 GeoServer Logs 59 Contact Information 59 About 60 Time for action – manually...

Global site tag (gtag.js) - Google Analytics