xmx java_为什么我的Java进程比Xmx消耗更多的内存?

xmx java

你们有些人去过那里。 您已经在启动脚本中添加了-Xmx选项,并放松了下来,因为您知道Java进程将不会消耗比经过微调的选项所允许的更多的内存。 然后,您感到非常讨厌。 要么自己检查开发/测试框中的过程表,要么事情真的变坏了,然后由操作人员在半夜打电话给您,告诉您您要生产的4G内存已用完。 而且该应用程序刚刚终止。 RAM内存
那么幕后到底发生了什么呢? 为什么进程消耗的内存比分配的更多? 是bug还是完全正常的东西? 忍受我,我将指导您进行到底。

首先,它的一部分肯定可以是内存泄漏的恶意本机代码。 但是在99%的情况下,这完全是JVM的正常行为。 通过-Xmx开关指定的内容是限制应用程序堆消耗的内存。

除了堆以外,您的应用程序还使用内存中的其他区域,即permgen和堆栈大小。 因此,为了限制这些值,还应该分别指定-XX:MaxPermSize-Xss选项。 简而言之,您可以使用以下公式预测应用程序的内存使用情况

Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

但是,除了您的应用程序占用的内存外,JVM本身还需要一些空间 。 对它的需求来自几个不同的原因:

  • 垃圾收集。 您可能还记得,Java是一种垃圾收集语言。 为了使垃圾收集器知道哪些对象适合进行收集,它需要跟踪对象图。 因此,这是内部簿记丢失的部分内存。 特别是G1以其对额外内存的过度需求而闻名,因此请注意这一点。
  • JIT优化。 Java虚拟机在运行时优化代码。 同样,要知道要优化的部分,需要跟踪某些代码部分的执行情况。 同样,您将失去记忆。
  • 堆外分配。 如果您碰巧使用了堆外内存,例如,在自己使用直接或映射的ByteBuffer或通过一些聪明的第三方API时,那就瞧瞧-您正在将堆扩展到实际上无法通过JVM配置控制的范围。
  • JNI代码。 例如,当您以2类数据库驱动程序的格式使用本机代码时,您将再次在本机内存中加载代码。
  • 元空间。 如果您是Java 8的较早采用者,那么您将使用元空间而不是旧的permgen来存储类声明。 这是无限的,并且在JVM的本机部分中。

除了上面列出的原因之外,您最终可能还会由于其他原因而使用内存,但是我希望我能说服您JVM内部消耗了大量内存。 但是,有没有一种方法可以预测实际需要多少内存呢? 或者至少了解它消失的位置以便进行优化?

正如我们从痛苦的经历中发现的那样-无法以合理的精度进行预测。 JVM开销的范围从几个百分点到几百个百分点。 您最好的朋友还是古老的尝试和错误。 因此,您需要以类似于生产环境和度量的负载运行应用程序。

衡量额外的开销是微不足道的–只需使用OS内置工具(在Linux上排名靠前 ,在OS X上使用Activity Monitor ,在Windows上使用Task Manager )监视进程即可找出实际的内存消耗。 从实际消耗中减去堆大小和permgen大小,您将看到开销。

现在,如果需要减少开销,您想了解它实际消失的位置。 在这种情况下,我们发现Mac OS X上的vmmap和Linux上的pmap是真正有用的工具。 我们自己没有使用vmmap端口连接Windows,但似乎也有Windows迷的工具。

以下示例说明了这种情况。 我使用以下启动参数启动了Jetty:

-Xmx168m -Xms168m -XX:PermSize=32m -XX:MaxPermSize=32m -Xss1m

知道我的应用程序中启动了30个线程后,我可能会希望无论如何我的内存使用量都不会超过230M。 但是现在当我在Mac OS X上查看“ 活动监视器”时,会看到一些不同的东西。

实际内存使用量已超过320M。 现在,在vmmap <pid>输出的帮助下, 深入了解该过程,我们开始了解内存在哪里消失。 让我们看一些示例:

下面说我们丢失了将近2MB丢失到内存映射的rt.jar库。

mapped file            00000001178b9000-0000000117a88000 [ 1852K] r--/r-x SM=ALI  /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/lib/rt.jar

下一节说明,对于加载的特定动态库,我们正在使用〜6MB

__TEXT                 0000000104573000-0000000104c00000 [ 6708K] r-x/rwx SM=COW  /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/lib/server/libjvm.dylib

在这里,我们没有线程25-30,每个线程为其堆栈和堆栈防护分配1MB

Stack 000000011a5f1000-000000011a6f0000 [ 1020K] rw-/rwx SM=ZER thread 25 Stack 000000011aa8c000-000000011ab8b000 [ 1020K] rw-/rwx SM=ZER thread 27 Stack 000000011ab8f000-000000011ac8e000 [ 1020K] rw-/rwx SM=ZER thread 28 Stack 000000011ac92000-000000011ad91000 [ 1020K] rw-/rwx SM=ZER thread 29 Stack 000000011af0f000-000000011b00e000 [ 1020K] rw-/rwx SM=ZER thread 30
STACK GUARD 000000011a5ed000-000000011a5ee000 [ 4K] ---/rwx SM=NUL stack guard for thread 25 STACK GUARD 000000011aa88000-000000011aa89000 [ 4K] ---/rwx SM=NUL stack guard for thread 27 STACK GUARD 000000011ab8b000-000000011ab8c000 [ 4K] ---/rwx SM=NUL stack guard for thread 28 STACK GUARD 000000011ac8e000-000000011ac8f000 [ 4K] ---/rwx SM=NUL stack guard for thread 29 STACK GUARD 000000011af0b000-000000011af0c000 [ 4K] ---/rwx SM=NUL stack guard for thread 30

我希望我能对预测和测量实际内存消耗这一棘手的任务有所了解。

参考: 为什么我的Java进程比Xmx消耗更多的内存? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2013/06/why-does-my-java-process-consume-more-memory-than-xmx.html

xmx java

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

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

相关文章

卫星通信系统概述

卫星通信系统指通过在轨人造卫星作为中继站对无线电信号进行转发&#xff0c;实现地面及空间等用户之间信息传输的系统。卫星通信系统组成包括空间段及地面段&#xff0c;系统组成如图所示。其中空间段主要指在轨卫星、对在轨卫星进行操控的地面站&#xff0c;这些地面站主要实…

Opnet入门

一、opnet快速入门 1.系统界面&文件菜单说明 2.常用文件名后缀及描述 3.Opnet建模层次 用户只有一种节点域模型 三、 OPNET Modeler网络仿真机制 1.事件的属性 每次点击next会出现以下界面&#xff1a; 2.事件的执行 调度型&#xff1a;按照正常程序调度事件 强制性&…

【强化学习】Policy Gradient原理

1.Policy Gradient和DQN系列强化算法最大的区别在于&#xff1a; DQN系列基于Value&#xff0c;也就是说执行完所有的动作并保存所得到的价值&#xff0c;根据这些价值计算出最优价值函数&#xff0c;并以此选择动作&#xff0c;最终获得一个特定的策略。 Policy Gradient基于策…

ajax的url怎么将后缀补上_蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法

蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法蜂蜜杏仁是一种非常好吃的小零食&#xff0c;很多小可爱都喜欢吃蜂蜜杏仁。不过有些时候忘记补货&#xff0c;就会断粮&#xff0c;于是大家都想要在家里自制蜂蜜杏仁。不过你知道蜂蜜杏仁应该怎么做吗?蜂蜜杏仁的做法其实并不难&#xff0…

【强化学习】Actor Critic原理

PG算法是一种只基于policy的一种方法&#xff0c;存在的问题就是该算法需要完整的状态序列&#xff0c;且单独对策略函数进行迭代更新&#xff0c;不太容易收敛。 Actor-critic方法呢是一种将 策略(Policy Based)和价值(Value Based)相结合的方法。下面继续来理一下AC方法的思路…

【强化学习】A3C原理

先解释一下什么叫异步、什么叫并发&#xff1a; **异步&#xff1a;**和同步相对&#xff0c;同步是顺序执行&#xff0c;而异步是彼此独立&#xff0c;在等待某个事件的过程中继续做自己的事&#xff0c;不要等待这一事件完成后再工作。线程是实现异步的一个方式&#xff0c;异…

jboss eap 7.0_创建委托登录模块(用于JBoss EAP 6.1)

jboss eap 7.0[如果只想查看代码&#xff0c;请向下滚动] 动机 在RHQ中&#xff0c;我们需要一个安全域&#xff0c;该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去&#xff0c;我只是使用经典的DatabaseServerLoginModule对DatabaseServerLoginModule进…

【强化学习】可视化学习tensorboard

tensorflow定义了一个图结构&#xff1a; 代码&#xff1a; a tf.constant(3.0, name"a")b tf.constant(4.0, name"b")c tf.add(a, b, name"add")var tf.Variable(tf.random_normal([2, 3], mean0.0, stddev1.0), name"variable"…

面向初学者的JSF 2.0教程

1.什么是JSF&#xff1f; JSF是Java Server Faces的首字母缩写。 它是一种服务器端处理技术&#xff0c;它允许将服务器端代码嵌入到网页中。 由于可以将服务器端处理和呈现代码嵌入网页本身&#xff0c;因此使项目的整体编码更加简单。 减少总体数量以及文件大小。 JSF包含2个…

华为nova7保密柜_华为发布nova8系列新品 轻松拍出Vlog黄金脸占比

2020年12月23日&#xff0c;华为nova8系列手机正式发布。作为深受年轻人喜爱的手机品牌之一&#xff0c;华为nova8系列此次延续其强大的前置视觉实力、强悍的设计性能以及独特的设计美学&#xff0c;带来业内首款专为Vlog拍摄设计的5G手机。随着短视频和Vlog的崛起&#xff0c;…

26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史

26.0.0-alpha1自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中的…

单机最大负载_分布式高可靠之负载均衡,今天看了你肯定会

到目前为止&#xff0c;我已经为你介绍了分布式起源、分布式协调与同步、分布式资源管理与负载调度、分布式计算技术、分布式通信技术和分布式数据存储。可以说&#xff0c;掌握了这些内容&#xff0c;基本上就掌握了分布式的关键技术。然而&#xff0c;只有可靠的分布式系统才…

【强化学习】一文带你理清强化学习

整理不易&#xff0c;希望留个赞再走哦&#xff01;&#xff01; 学习路线 这个图描述的比较清晰&#xff0c;蓝框里是整个强化学习的一些概念基础了&#xff0c;橙色是一些学习方法&#xff0c;可以针对性的选择一些&#xff0c;废话不多说&#xff0c;接下来就按照这个路线图…

了解Java缓冲池

了解Java缓冲池 缓冲池空间位于垃圾收集器管理的内存之外。 这是分配本地堆外内存的一种方法。 使用缓冲池有什么好处&#xff1f; 为了回答这个问题&#xff0c;让我们首先了解什么是字节缓冲区。 字节缓冲区 非直接缓冲区 ByteBuffer类附带了java.nio包。 它允许我们分配直接…

java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

在为什么阿里巴巴不建议在for循环中使用””进行字符串拼接一文中&#xff0c;我们介绍了几种Java中字符串拼接的方式&#xff0c;以及优缺点。其中还有一个重要的拼接方式我没有介绍&#xff0c;那就是Java 8中提供的StringJoiner &#xff0c;本文就来介绍一下这个字符串拼接…

doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

在日常工作中我们经常会与数组打交道&#xff0c;因此需要熟练掌握数组操作的相关方法&#xff0c;ES6中关于数组的操作&#xff0c;又给我们带来了哪些惊喜呢&#xff0c;Array数组操作又添加了哪些新方法&#xff1f;本篇文章将从以下几个方面进行介绍&#xff1a;Array.from…

No module named ‘__main__.common‘; ‘__main__‘ is not a package

今天在调通代码时遇到一个难缠的bug,源代码如下&#xff1a; from .common import _FLOATX, _EPSILON结果报错&#xff1a; 问题原因&#xff1a; 也就是说&#xff0c;这是相对导入&#xff0c;只有在父模块在当前运行环境中被导入过才能用。 这揭示了报错的缘由&#xff0…

ValueError( Shape(4, ?, 1, 20) and () are incompatible

报错&#xff1a; 解决&#xff1a; 将文件中的return tf.concat(axis, tensors) 改为&#xff1a;return tf.concat(tensors, axis)问题完美解决

adadelta算法_对C++用户比较友好的机器学习算法库

由于疫情影响&#xff0c;这几天在家学习编程&#xff0c;整理了基于c语言的机器学习算法库。目前大部分机器学习库都是面向pyhton语言的&#xff0c;尽管很python包的底层语言是c&#xff0c;但c用户使用起来很麻烦&#xff0c;这里整理了一些对c比较优化的机器学习算法库&…

不解析,使用解析对象

将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 &#xff0c;这些对象在外出之前先序列化为JSON&#xff0c;然后在返回时反序列化。 这种方法很流行&#xff0c;而且是错误的。 序列化部分应该由打印机代替&#xff0c;我在前面已经解释过。 这是我对反序列化的…