JVM Heap Memory和Native Memory
JVM管理的内存可以总体划分为两部分:
Heap Memory
和Native Memory
。前者我们比较熟悉,是供Java应用程序使用的;后者也称为C-Heap,是供JVM自身进程使用的。Heap Memory及其内部各组成的大小可以通过JVM的一系列命令行参数来控制,在此不赘述。Native Memory没有相应的参数来控制大小,其大小依赖于操作系统进程的最大值(对于32位系统就是3~4G,各种系统的实现并不一样),以及生成的Java字节码大小、创建的线程数量、维持java对象的状态信息大小(用于GC)以及一些第三方的包,比如JDBC驱动使用的native内存。
Native Memory里存些什么?
1.管理java heap的状态数据(用于GC);
2.JNI调用,也就是Native Stack;
3.JIT(即使编译器)编译时使用Native Memory,并且JIT的输入(Java字节码)和输出(可执行代码)也都是保存在Native Memory;
4.NIO direct buffer。对于IBM JVM和Hotspot,都可以通过-XX:MaxDirectMemorySize来设置nio直接缓冲区的最大值。默认是64M。超过这个时,会按照32M自动增大。
5.对于IBM的JVM某些版本实现,类加载器和类信息都是保存在Native Memory中的。
DirectBuffer的好处
DirectBuffer访问更快,避免了从HeapBuffer还需要从java堆拷贝到本地堆,操作系统直接访问的是DirectBuffer。DirectBuffer对象的数据实际是保存在native heap中,但是引用保存在HeapBuffer中。
另外,DirectBuffer的引用是直接分配在堆得Old区的,因此其回收时机是在FullGC时。因此,需要避免频繁的分配DirectBuffer,这样很容易导致Native Memory溢出。
为什么会内存溢出?
简单理解java process memory = java heap + native memory。因此内存溢出时,首先要区分是堆内存溢出还是本地内存溢出。Native Memory本质上就是因为耗尽了进程地址空间。对于HotSpot JVM来书,不断的分配直接内存,会导致如下错误信息:Allocated 1953546760 bytes of native memory before running out
参考资料:
http://www.ibm.com/developerworks/library/j-nativememory-linux/index.html
http://www.techpaste.com/2012/07/steps-debugdiagnose-memory-memory-leaks-jvm/
https://sourcevirtues.wordpress.com/2013/01/14/java-heap-space-and-native-heap-problems/
http://www.theotherian.com/2013/08/understanding-javas-native-heap-or-c-heap.html
http://www.ibm.com/developerworks/library/l-kernel-memory-access/
http://www.ibm.com/developerworks/library/j-zerocopy/
http://en.wikipedia.org/wiki/Direct_memory_access
JVM Heap Memory和Native Memory相关推荐
- JVM 系列一:Native memory allocation 导致JVM Crash
2019独角兽企业重金招聘Python工程师标准>>> JVM Crash抛出如下信息: # # There is insufficient memory for the Java ...
- Which one is faster: Java heap or native memory?
2019独角兽企业重金招聘Python工程师标准>>> Which one is faster: Java heap or native memory? 11-29-2012 by ...
- JVM中的本地内存追踪NMT(Native Memory Tracking)
JVM中的本地内存追踪NMT(Native Memory Tracking) 1 概述 每当想起为什么Java应用程序会消耗比设置-Xms和-Xmx多的内存的时候,心中总是会有个问号.因为一些理由和优 ...
- Native memory allocation (mmap) failed to map 142606336 bytes for committing reserved memory.
这里写链接内容 问题描述 Java程序运行过程中抛出java.lang.OutOfMemoryError: unable to create new native thread,如下所示: [java ...
- Linux下TomcatVM参数修改:Native memory allocation (mmap) failed to map 3221225472 bytes for committing res
不可行的方法 最初我直接修改catalina.sh, 将JAVA_OPTS变量加上了 -server -Xms1G -Xmx1G -XX:+UserG1GC 最初看起来没啥问题,但是当服务器运行几天后 ...
- java native堆_Java Native Memory比堆更快吗?
执行IO时,直接内存更快,因为它可以避免一个数据副本.但是,对于95%的申请,您不会注意到差异. 您可以将数据存储在直接内存中,但是它不会比存储数据POJO快. (或安全,可读或可维护)如果您担心GC ...
- Android 系统(30)---如何用DDMS分析native memory leak
native程序如果发生内存问题,一般都比较难查,幸好DDMS有集成native memory leak(仅仅针对app,无法分析mediaserver等非app的进程)功能,通过DDMS可以观察na ...
- Native memory allocation (mmap) failed to map 6215958528 bytes for committing reserved memory
今天突然发现es报错,无法正常启动,报错信息如下: Exception in thread "main" java.lang.RuntimeException: starting ...
- Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory
遇到问题 在服务器上运行 nexus 出现Native memory allocation (mmap) failed to map 838860800 bytes for committing re ...
最新文章
- linux下查看vnc端口_怎样查vnc端口,Linux下根据进程名怎样查端口
- java中utilities类_Java PHUtilities类代码示例
- Dataset之BDD100K:BDD100K数据集的简介、下载、使用方法之详细攻略
- python max和min函数的高级用法
- 在ABAP XSLT中调用ABAP类的方法
- 这个网盘下载60MB/s!PanDownload复活了!
- jwt与token+redis,哪种方案更好用?
- CSS3之Transform
- yytextview多种格式_iOS YYText的使用笔记一(YYTextView图文编辑器)
- matlab 价格统计,matlab中的金融数据统计
- 计算机应用技术爱岗敬业,高职专业人才培养方案(计算机应用技术).doc
- springboot+aop切点记录请求和响应信息
- Openstack Swift 原理、架构与 API 介绍
- 微信公众号开发自动回复的Python库——werobot
- 【Prufer Sequence +简单排列组合】bzoj 1005: [HNOI2008]明明的烦恼
- 松下plc安装序列号afpsgr7_《松下PLC 编程软件 FPWINGR7 操作手册 中文高清版》.pdf...
- 数学分析典型方法pdf下载_硬质合金刀具常识及使用方法 pdf下载 0700
- 人体颈椎神经分布图高清,颈椎部神经分布图高清
- 钓鱼比赛(百度笔试)
- 计算分辨率长宽比(等比例缩放)