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;这些地面站主要实…

ElasticSearch初学者教程

1.简介 在此示例中&#xff0c;我们将演示如何使用Elasticsearch &#xff0c; Elasticsearch是一个基于Apache Lucene的分布式自由文本搜索和分析数据库引擎&#xff0c;具有一个基于maven的简单Java客户端。 在撰写本文时&#xff0c;我们将使用最新版本的Elasticsearch&…

博弈论与纳什均衡

三十分钟理解博弈论“纳什均衡” – Nash Equilibrium https://blog.csdn.net/xbinworld/article/details/50932559 纳什均衡(Nash equilibrium)及经典案例 https://blog.csdn.net/u010420283/article/details/83927742 论文&#xff1a; [1] 刘帅军. 卫星通信系统中动态资源…

Opnet入门

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

JSON的JUnit Hamcrest Matcher

这篇文章展示了如何编写JUnit测试来检查对象是否与JSON字符串匹配。 如果您要实现REST服务并想测试您的服务是否产生了预期的JSON响应&#xff0c;那么这一点很重要。 JSONassert是比较JSON对象的有用库。 首先&#xff0c;您必须将Java对象转换为JSON字符串&#xff08;例如&…

Python列表推导式

列表推导式 是Python构建列表&#xff08;list&#xff09;的一种快捷方式,可以使用简洁的代码就创建出一个列表&#xff0c;即循环创建列表. for可以用来创建列表&#xff0c;列表推导式就相当于是for循环的简化版 1. 最简单的情况 values [10, 21, 5, 7, 12] squares [] …

一些python函数及其用法

1.np.ravel&#xff08;&#xff09;方法 ravel是将数组维度拉成一维数组&#xff0c;也就是将矩阵向量化 x np.array{ [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] } print(np.ravel(x))输出 [ 1 2 3 4 5 6 ]2.b a[np.newaxis,:] import numpy as np a np.arange(0, 10) print(a…

使用Spring WebFlux进行操作

Spring Boot 2.0最近在GA上线了&#xff0c;所以我决定在相当长一段时间内写我的第一篇有关Spring的文章。 自发布以来&#xff0c;我已经看到越来越多的提到Spring WebFlux以​​及有关如何使用它的教程。 但是&#xff0c;在阅读完它们并尝试使它们自己工作之后&#xff0c;我…

【强化学习】Policy Gradient原理

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

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

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

【强化学习】Policy Gradients代码注释版本

import gym # import tensorflow as tf import numpy as np# Hyper Parameters GAMMA 0.95 # discount factor 折扣因子 LEARNING_RATE 0.01 # 学习率class Policy_Gradient():# 咱们来搞一下大头&#xff01;def __init__(self, env): # 初始化# 先初始化一些参量sel…

c语言构建栈_选择技术栈构建通用平台

c语言构建栈Java社区中有许多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时&#xff0c;我不禁要想为什么我们不能同时使用它们呢&#xff1f; 实际上&#xff0c;我认为有效地使用它们将为建立基础架构创建一个伟大的技术堆…

【强化学习】Actor Critic原理

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

Java 9:对Process API的增强

Java 9对Process API进行了各种改进&#xff0c;用于控制和管理操作系统进程。 获取有关流程的信息 有一个新的ProcessHandle类&#xff0c;提供了进程的pid&#xff0c;父级和后代&#xff0c;以及有关开始时间和累积CPU时间的信息。 jshell> Process p new ProcessBui…

【强化学习】AC注释版本

## 强化学习 Actor-critic # 和PG比起来主要的变化&#xff1a; # 评估点由状态价值变成了TD_error,网络形式变了 # learn函数长得不一样 # action有一个优化函数&#xff0c;优化的是价值函数&#xff0c;希望最大化期望的reward&#xff0c;Critic网络也有一个reward&#xf…

python中sorted的用法append_Python中高阶函数sorted()用法

在Python中&#xff0c;有内置的排序方法&#xff1a;sorted(iterable, key, reverse)。Sorted()函数也是一个高阶函数&#xff0c;它还可以接收一个key函数来实现自定义的排序。key指定的函数将作用于list的每一个元素上&#xff0c;并根据key函数返回的结果进行排序。print(s…

【强化学习】A3C原理

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

天玑机器人颈椎_天玑骨科手术机器人亮相机器人大会 误差不到1毫米

千龙网北京8月22日讯(记者 詹婷婷)8月23日-27日&#xff0c;年度科技盛典--2017年世界机器人大会将登陆北京亦创国际会展中心。100多家国内外机器人顶尖企业将携手机器人亮相。大会期间将秀出人工智能系统、特种机器人、服务机器人、工业机器人以及智慧家居机器人等先进产品。参…

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

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

cdn简单理解_简单地聊聊CDN原理作用及实现方法

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;相信只要会网上冲浪的都会接触到CDN吧&#xff0c;今天我们来聊聊对CDN的理解&#xff0c;给大家作为参考&#xff0c;本文将会以简单的描述来解释相关原理&#xff0c;供大家理解&#xff0c;希望相关专业同学进行…