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…

中南大学计算机博士读几年,法学院2019年上半年毕业博士生须知

为保证2019年上半年博士生毕业工作顺利开展&#xff0c;根据我校博士生答辩管理的相关文件&#xff0c;现将有关事项通知如下&#xff0c;请遵照执行。1.毕业申请:拟毕业研究生于3月15日前登录“中南大学研究生教育管理信息系统”(以下简称管理系统)&#xff0c;在管理系统个人…

1.0jpa 2.0_JPA 2.1:不同步的持久性上下文

1.0jpa 2.0JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步。 术语资源管理器来自Java事务处理API &#xff0c;它表示操纵一个资源的组件&#xff08;例如&#xff0c;使用其JDBC驱动程序操纵的具体数据库&#xff09;。 默认情况下&…

vue 保存时清空iuput_vue清空input file

Coding源码学习第四部分&lpar;Masonry介绍与使用&lpar;三&rpar;&rpar;接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...python 线性回归示例说明:此文的第一部分参考了这里 用python进…

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级的玩…

@namedqueries_在@NamedQueries中枚举@NamedQuery

namedqueries介绍 如果您是使用JPA的Java开发人员&#xff0c;则很可能在实体上声明了一个或多个NamedQuery对象。 要在类上声明NamedQuery &#xff0c;必须在类中简单地用查询名称及其JPQL进行注释&#xff0c;例如&#xff1a; Entity NamedQuery(name "findAllProj…

ue4 设置intellisence_UE4.22编辑器界面操控设置(4)

视频课程地址&#xff1a;https://i.youku.com/i/UMzE2NDk2OTIw/custom?spma2hzp.8244740.0.0&id32318-在场景中按住鼠标左键上下移动鼠标&#xff0c;摄像机可以在场景中前后移动&#xff0c;左右移动鼠标&#xff0c;在场景中视角会左右旋转。-在场景中按住鼠标右键&…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#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是理解为解释型语言执…

天刀服务器维护时间,6月3日服务器例行维护公告(已完成)

一、重要更新天地风云联赛1、摧毁敌方天芒之塔后除了给本方少侠增加一层士气之外&#xff0c;还会给本方少侠增加一层攻击增益和防御增益。2、击败敌方护卫弓箭手不会给本方少侠增加士气。3、无双之影登场时间提前&#xff1a;比赛还剩15分钟无双之影第一次登场&#xff0c;比赛…

python中可迭代对象拆包时、怎么赋值给占位符_python3-数据结构和算法 » 1.2 解压可迭代对象赋值给多个变量...

1.2 解压可迭代对象赋值给多个变量问题如果一个可迭代对象的元素个数超过变量个数时&#xff0c;会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出 N 个元素出来&#xff1f;解决方案Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程…

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

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

香辣弹簧:不同的自动接线方式

我想展示使用Spring的Autowired批注的不同方式&#xff1a; Constructor &#xff0c; Method和Field自动装配。 我展示的示例都是byType自动装配模式的一种形式&#xff08; constructor自动装配模式类似于byType &#xff09;。 请参阅Spring参考指南 &#xff0c;以获取有关…

windows服务器系统免登录,Mac系统登录Windows服务器

#### 操作场景下载地址&#xff1a;[Microsoft Remote Desktop for Mac](https://soft.wnana.com/Microsoft_Remote_Desktop_10.3.12_installer.pkg)本节操作以“Windows Server 2012 R2 数据中心版 64位”操作系统为例&#xff0c;介绍如何通过Microsoft Remote Desktop for M…

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;我们可以创建自定义图表…

永恒之塔修改服务器,[搬运工]永恒之塔单机版7.8 德国最新服务端

有高手整整吗&#xff01;搞了一天服务器启动不了啊…安装教程&#xff1a;1&#xff0c;安装【jdk-14】&#xff0c;切记&#xff0c;默认安装&#xff0c;不要修改路径等不出意外默认路径应该是【C:\Program Files\Java\jdk-14】2&#xff0c;注意&#xff1a;安装好【JDK】之…