jvm内存 大于 xmx_为什么我的JVM访问的内存少于通过-Xmx指定的内存?

jvm内存 大于 xmx

“嘿,你能来看看奇怪的东西吗?” 这就是我开始研究支持案例的方式,将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。

简而言之,一位工程师正在研究特定应用程序的过多内存使用情况,据他所知,该应用程序可以使用2G的堆。 但是无论出于什么原因,JVM工具本身似乎都没有决定该进程真正拥有多少内存。 例如, jconsole猜测总可用堆等于1,963M,而jvisualvm声称其等于2,048M。 那么哪个工具是正确的,为什么另一个却显示不同的信息呢?

确实确实很奇怪,尤其是看到通常的可疑对象都被淘汰了– JVM并没有采取任何明显的技巧,例如:

  • -Xmx-Xms相等,因此在运行时堆增加期间报告的数字不会更改
  • 通过关闭自适应大小调整策略( -XX:-UseAdaptiveSizePolicy ),防止JVM动态调整内存池的大小

重现差异

理解问题的第一步是放大工具实现。 通过标准API访问可用的内存信息非常简单,如下所示:

System.out.println("Runtime.getRuntime().maxMemory()="+Runtime.getRuntime().maxMemory());

确实,这就是手头工具似乎正在使用的工具。 回答此类问题的第一步是拥有可重现的测试用例。 为此,我编写了以下代码段:

package eu.plumbr.test;
//imports skipped for brevitypublic class HeapSizeDifferences {static Collection<Object> objects = new ArrayList<Object>();static long lastMaxMemory = 0;public static void main(String[] args) {try {List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments();System.out.println("Running with: " + inputArguments);while (true) {printMaxMemory();consumeSpace();}} catch (OutOfMemoryError e) {freeSpace();printMaxMemory();}}static void printMaxMemory() {long currentMaxMemory = Runtime.getRuntime().maxMemory();if (currentMaxMemory != lastMaxMemory) {lastMaxMemory = currentMaxMemory;System.out.format("Runtime.getRuntime().maxMemory(): %,dK.%n", currentMaxMemory / 1024);}}static void consumeSpace() {objects.add(new int[1_000_000]);}static void freeSpace() {objects.clear();}
}

该代码通过循环中的新int [1_000_000]分配内存块,并检查当前已知可用于JVM运行时的内存。 每当发现最后一个已知的内存大小发生变化时,它都会通过打印Runtime.getRuntime()。maxMemory()的输出来报告该变化,类似于以下内容:

Running with: [-Xms2048M, -Xmx2048M]
Runtime.getRuntime().maxMemory(): 2,010,112K.

确实- 即使我已指定JVM使用2G堆,运行时也无法以某种方式找到其中的85M 。 您可以通过将Runtime.getRuntime()。maxMemory()的输出转换为MB(用2,010,112K除以1024 来仔细检查我的数学运算。结果将等于1,963M,与2048M相差85M。

寻找根本原因

在能够重现案例之后,我记下了以下笔记–使用不同的GC算法运行似乎也会产生不同的结果:

GC算法 Runtime.getRuntime()。maxMemory()
-XX:+ UseSerialGC 2,027,264千
-XX:+ UseParallelGC 2,010,112千
-XX:+ UseConcMarkSweepGC 2,063,104千
-XX:+ UseG1GC 2,097,152千

除了G1完全消耗了我给该进程分配的2G内存外,其他所有GC算法似乎都始终丢失半随机的内存。

现在是时候深入研究JVM 的源代码了,在CollectedHeap的源代码中,我发现了以下内容:

// Support for java.lang.Runtime.maxMemory():  return the maximum amount of
// memory that the vm could make available for storing 'normal' java objects.
// This is based on the reserved address space, but should not include space
// that the vm uses internally for bookkeeping or temporary storage
// (e.g., in the case of the young gen, one of the survivor
// spaces).
virtual size_t max_capacity() const = 0;

我不得不承认答案是非常隐蔽的。 但是,仍然有一些真正的好奇心可以找到的提示–指的是在某些情况下,堆大小计算中可能会排除一个幸存空间

java-heap-permgen-不同的内存池

从这里一直是顺风顺水–打开GC日志记录发现,实际上,使用2G堆,串行,并行和CMS算法都将幸存空间的大小恰好设置为缺少的差值。 例如,在上面的ParallelGC示例中,GC日志记录演示了以下内容:

Running with: [-Xms2g, -Xmx2g, -XX:+UseParallelGC, -XX:+PrintGCDetails]
Runtime.getRuntime().maxMemory(): 2,010,112K.... rest of the GC log skipped for brevity ...PSYoungGen      total 611840K, used 524800K [0x0000000795580000, 0x00000007c0000000, 0x00000007c0000000)eden space 524800K, 100% used [0x0000000795580000,0x00000007b5600000,0x00000007b5600000)from space 87040K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007c0000000)to   space 87040K, 0% used [0x00000007b5600000,0x00000007b5600000,0x00000007bab00000)ParOldGen       total 1398272K, used 1394966K [0x0000000740000000, 0x0000000795580000, 0x0000000795580000)

从中您可以看到Eden空间设置为524,800K,两个幸存者空间(从和到)都设置为87,040K,旧空间的大小为1,398,272K。 将Eden,Old和一个幸存者空间加在一起总计为2,010,112K,这证实丢失的85M或87,040K确实是剩余的幸存者空间

摘要

阅读该文章后,您现在对Java API实现细节有了新的认识。 下次某些工具将总可用堆大小可视化为略小于Xmx指定的堆大小时,您会知道差值等于其中一个Survivor空间的大小。

我必须承认,这一事实在日常编程活动中并不是特别有用,但这不是该帖子的重点。 取而代之的是,我写了一篇文章,描述了我一直在优秀工程师中寻找的一个特殊特性- 好奇心 。 优秀的工程师一直在寻找理解某件事如何以及为什么以它的方式起作用的方法。 有时答案仍然是隐藏的,但我仍然建议您尝试寻求答案。 最终,沿途积累的知识将开始带来红利。

翻译自: https://www.javacodegeeks.com/2015/02/jvm-access-less-memory-specified-via-xmx.html

jvm内存 大于 xmx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么说PHP是很糟糕的,也是很好的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很糟糕”时&#xff0c;他们并没有说错。这门语言确实有很多不好的地方。搁在以前&#xff0c;这门语言还有更多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的糟糕设计》(PHP…

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容&#xff0c;Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集&#xff0c;许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启&#xff0c;通过“老带新”模式&#xff0c;助力萌新玩家快乐成长的同时&#xff0c;也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题&#xff0c;用织梦搭建好的网站&#xff0c;在本地上测试没问题但是上传到正式服务器上就出问题了&#xff0c;在后台登陆的时候&#xff0c;验证码的图片老是显示不出来&#xff0c;后来查阅了相关资料才终于找到问题的根本原因&#xff0c;下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我&#xff0c;了解更多咨询Python与C语言的区别是什么?Python是由C语言实现&#xff0c;C语言是编译型语言&#xff0c;经过编译后生成机器码再运行&#xff0c;执行速度快不能跨平台&#xff0c;一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

C语言数据类型从计算机原理的角度是怎样看待的?

点击上方蓝字关注我&#xff0c;了解更多咨询初学C语言&#xff0c;首先要接触的就是数据类型了&#xff0c;这也是学习任何一门语言所必须经历的阶段。很多同学在学习的时候不理解数据类型&#xff0c;因为对计算机及原理知之甚少。所以&#xff0c;在学习数据类型之前&#x…

android module中获取 app_Android组件化架构 - 4. 动态创建

Android 组件化中使用动态创建的作用是解耦&#xff1b;1. 反射机制反射有两个作用&#xff1a;1.反编译&#xff1a;.class->.java;2.通过反射机制访问java对象中的属性&#xff0c;方法&#xff0c;构造器等&#xff1b;实现反射&#xff0c;实际上是得到Class对象2. 动态…

小白适用的C语言数据类型转换及转换规则

点击上方蓝字关注我&#xff0c;了解更多咨询1.不同类型数据间的混合运算与类型转换&#xff1a;①若参与运算量的类型不同&#xff0c;则先转换成同一类型&#xff0c;然后进行运算②转换按数据长度增加的方向进行&#xff0c;以保证精度不降低。如int型和long型运算时&#x…

jax-ws和jax-rs_带有JAX-RS和PrimeFaces的RESTful图表

jax-ws和jax-rs通常&#xff0c;利用图表提供数据的直观表示很有用。 PrimeFaces提供制图解决方案&#xff0c;可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果我们将PrimeFaces图表组件的使用与RESTful Web服务数据结合在一起&#xff0c;我们可以创建自定义图表…

udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

udp不是面向连接的协议&#xff0c;所以使用上会比tcp简单&#xff0c;他和tcp一样&#xff0c;使用四元组来标记通信的双方&#xff08;单播的情况下&#xff09;。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程&#xff08;伪代码&#xff0…

C语言与Java的对比,你想好选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询很多同学纠结自己应该学C语言还是学Java&#xff0c;本篇文章带你细致了解C语言与Java的各方面的不同之处&#xff0c;让你能够更全面的把握编程语言&#xff01;1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率…

C语言:初始C语言

点击上方蓝字关注我&#xff0c;了解更多咨询什么是C语言为什么学习C语言&#xff1f;第一个C语言程序什么是C语言说到语言&#xff0c;可能会想到汉语&#xff0c;英语这些人与人之间交流的语言&#xff0c;语言是人与人之间沟通的桥梁&#xff0c;通过语言&#xff0c;我们得…

apache camel_带有调试器的Apache Camel Eclipse工具

apache camel大约2个月前&#xff0c; Lars Heineman在 JBoss工具堆栈中写了关于改进的Apache Camel Eclipse工具的博客。 在即将发布的版本中&#xff0c;他们将Camel调试器与本机Eclipse调试器集成在一起&#xff0c;因此当您使用断点时&#xff0c;您将获得Eclipse调试体验…

服务器皮肤在哪个文件里,服务器怎么使用皮肤

服务器怎么使用皮肤 内容精选换一换在使用云服务器备份制作的整机镜像创建弹性云服务器时&#xff0c;创建速度很慢&#xff0c;或者界面提示用户&#xff1a;该镜像不支持快速创建云服务器功能。CSBS服务早期提供的老备份格式无法支持快速创建云服务器&#xff0c;因此&#x…

c语言中?:的用法

点击上方蓝字关注我&#xff0c;了解更多咨询?:是C语言中的三目运算符&#xff0c;可以用来替代 if—else 语句。?:的使用方法为&#xff1a;<表达式1>?<表达式2>:<表达式3>它是对第一个表达式作真/假检测&#xff0c;然后根据结果返回另外两个表达式中的…

字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗

我们先来看个例子&#xff1a;public class StringTest { public static void main(String[] args) { String a "A"; String b new String("A"); System.out.println(a b); // false String c b.intern(); Syst…

http协议下需要服务器推送吗,HTTP/2.0 服务器推送实现

前言HTTP/2.0发布于2015年&#xff0c;作为新一代HTTP协议&#xff0c;其由于推进互联网加密技术的使用&#xff0c;所以只能作用于https连接当中。HTTP/2.0提供HTTP语义的有效序列化&#xff0c;是一个二进制协议&#xff0c;所有的框架开始一个8字节的头&#xff0c;紧跟着的…

C语言最常用的编译器

点击上方蓝字关注我&#xff0c;了解更多咨询对于大部分工科类专业的学生来说&#xff0c;如果说是需要学习c语言的话&#xff0c;那选择编译器就是我们第一个遇到的问题了&#xff0c;这一类软件有很多&#xff0c;每一个软件都有他各自的优点&#xff0c;当然了也有他各自的缺…

word一键生成ppt 分页_如何一键把Word转换为PPT?

看到评论区有人问可以一键转换吗&#xff1f;当然可以&#xff0c;比如简单好用的【迅捷PDF转换器】迅捷PDF转换器 - 多功能的PDF转换成Word|JPG|PPT转换器安装打开软件之后&#xff0c;在PDF转换栏目下&#xff0c;点击PDF转换其它&#xff0c;就可以看到文件格式转PPT&#x…