JVM 内存使用失控

2024-01-03

我有一个 Tomcat Web 应用程序,它代表客户端执行一些内存和 CPU 密集型任务。这是正常现象,也是所需的功能。然而,当我运行 Tomcat 时,内存使用量会随着时间的推移飙升至 4.0GB 以上,此时我通常会终止该进程,因为它会扰乱我的开发计算机上运行的所有其他内容:

我以为我无意中在代码中引入了内存泄漏,但在使用 VisualVM 检查后,我看到了不同的情况:

VisualVM 显示堆占用了大约 1 GB 的 RAM,这就是我设置它的目的CATALINA_OPTS="-Xms256m -Xmx1024".

为什么我的系统认为这个进程占用了大量内存,而根据 VisualVM,它几乎不占用任何内存?


经过进一步的嗅探后,我注意到如果应用程序中同时运行多个作业,则内存不会被释放。但是,如果我等待每项工作完成后再将另一项工作提交给我的BlockingQueue由一个提供服务的ExecutorService,那么内存就被有效地回收了。我该如何调试这个?为什么垃圾收集/内存重用会有所不同?


你无法控制你想控制的, -Xmx只控制Java堆,不控制消耗本机记忆由 JVM 执行,根据实现的不同,其消耗方式完全不同。 VisualVM 仅向您显示堆正在消耗什么,它不会显示整个 JVM 正在消耗什么本机记忆作为操作系统进程。您必须使用操作系统级别的工具才能看到这一点,它们将报告完全不同的数字,通常比 VisualVM 报告的任何数字都要大得多,因为 JVM 耗尽了本机记忆以完全不同的方式。

来自下面的文章感谢您的内存(了解 JVM 如何在 Windows 和 Linux 上使用本机内存) https://web.archive.org/web/20210314194158/http://www.ibm.com/developerworks/java/library/j-nativememory-linux/

维护堆和垃圾收集器使用您无法控制的本机内存。

需要更多本机内存来维持状态 维护 Java 堆的内存管理系统。数据结构 必须分配以跟踪可用存储并记录进度 收集垃圾。这些数据结构的确切大小和性质 随实施情况的不同而变化,但许多都与规模成正比 堆。

JIT 编译器使用本机内存,就像javac would

字节码编译使用本机内存(与静态 像 gcc 这样的编译器需要内存来运行),但是输入( 字节码)和 JIT 的输出(可执行代码)也必须 存储在本机内存中。 Java 应用程序包含许多 JIT 编译的方法比小型应用程序使用更多的本机内存。

然后你就有了使用本机内存的类加载器

Java 应用程序由定义对象结构的类组成 和方法逻辑。他们还使用 Java 运行时类中的类 库(例如 java.lang.String)并且可以使用第三方 图书馆。这些类需要在内存中存储尽可能长的时间 它们正在被使用。类的存储方式因实现而异。

我什至不会开始引用有关线程的部分,我想您已经明白了-Xmx不控制你认为它控制的东西,它控制 JVM 堆,而不是一切 进入 JVM 堆,堆占用的本机内存比您指定的要多得多 管理和簿记。

简单明了,JVM 使用的内存比提供的内存多-Xms and -Xmx以及其他命令行参数。 https://stackoverflow.com/a/9146775/177800

这里有一个关于 JVM 如何分配和管理内存的非常详细的文章 https://web.archive.org/web/20210314194158/http://www.ibm.com/developerworks/java/library/j-nativememory-linux/,它并不像您根据问题中的假设所期望的那么简单,它非常值得全面阅读。

许多实现中的 ThreadStack 大小都有最小限制,该限制因操作系统(有时甚至是 JVM 版本)而异;如果您将限制设置为低于 JVM 或操作系统的本机操作系统限制(有时必须设置 *nix 上的 ulimit),则线程堆栈设置将被忽略。其他命令行选项的工作方式相同,当提供的值太小时,默认为更高的值。不要假设传入的所有值都代表实际使用的值。

类加载器(Tomcat 有多个类加载器)会占用大量不易记录的内存。 JIT 消耗了大量内存,以空间换取时间,这在大多数情况下是一个很好的权衡。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 内存使用失控 的相关文章

  • HttpSession 内的同步是否可行?

    UPDATE 问题后立即解决 问题 通常 同步是在 JVM 内序列化并行请求 例如 private static final Object LOCK new Object public void doSomething synchroniz
  • Spring @Validated 在服务层

    Hej 我想使用 Validated group Foo class 在执行方法之前验证参数的注释 如下所示 public void doFoo Foo Validated groups Foo class foo 当我将此方法放入 Spr
  • 探索java图像处理的好资源[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是图像处理领域的新手 请推荐一些好的资源 书籍和网络链接 来学习 Java 中的图像处理 最适合隐写术分析 适合初学者和高级水平 我看过
  • Java:无安全管理器:RMI 类加载器已禁用

    您好 我有 RMI 应用程序 现在我尝试从客户端调用服务器上的一些方法 我有以下代码 public static void main final String args try Setting the security manager Sy
  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 我应该使用 JDBC getNString() 而不是 getString() 吗?

    我们正在构建一个由 Oracle 数据库支持的 Java 应用程序 我们使用 JDBC 驱动程序 访问该数据库ojdbc6 jar and orai18n jar 数据库模式主要使用以下方式存储文本列NVARCHAR2数据类型 The JD
  • 如何添加 Java 正则表达式实现中缺少的功能?

    我是 Java 新手 作为一名 Net 开发人员 我非常习惯Regex Net 中的类 Java 实现Regex 正则表达式 还不错 但它缺少一些关键功能 我想为 Java 创建自己的帮助器类 但我想也许已经有一个可用的了 那么 是否有任何
  • Apache Commons VFS - 无法解析文件

    VFS 方法无法处理此 URI jboss server temp dir local outgoing配置在jboss beans xml这是决心 C Download jboss eap 5 1 1 server default tmp
  • 为什么我的 @OneToMany 属性出现主键违规?

    我有一个实体 Entity public class Student GeneratedValue strategy GenerationType AUTO Id private long id OneToMany private Set
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • 在 Java 中的 JFrame/JPanel/JComponent 中添加 Web 浏览器

    我正在开发一个 Java 应用程序 需要在应用程序中使用 Web 浏览器 我见过一些应用程序这样做 例如在同一应用程序中单击左侧面板中的提要并打开右侧面板中的链接时的 RSS 阅读器 我想实现类似的功能 在java中可以做到这一点吗 Jav
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • java中的第三个布尔状态是什么?

    虽然我知道根据定义 布尔值仅包含两种状态 真或假 我想知道布尔值在用这些状态之一初始化之前有什么值 它默认为 false http java sun com docs books tutorial java nutsandbolts dat
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 内部类的访问修饰符[重复]

    这个问题在这里已经有答案了 可能的重复 受保护 公共内部类 https stackoverflow com questions 595179 protected public inner classes 我确信这个问题已经被问过 但我找不到
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i

随机推荐

  • 如何登录win32 c++到Visual Studio输出窗口?

    我的 log4net 正在记录到 Visual Studio 输出窗口 但是我可以在 C win32 代码中使用什么代码来执行与我需要调试 C 相同的操作 并且似乎根本无法单步执行它 并且日志记录在生产中很有用无论如何也是如此 我添加了 w
  • 更改现有数据框的架构

    我想更改现有数据框的架构 在更改架构时遇到错误 我是否可以更改数据框的现有架构 val customSchema StructType Array StructField data typ StringType nullable false
  • 在 g++ 4.4.3 上得到负 NaN,这是标准吗?

    我在带有 Ubuntu Lucid Lynx 的 Linux 上安装了 g 4 4 3 并且得到了 nan 因此 在带有 g 4 3 1 的 Hardy Heron 上 我得到了所有 nan 这导致我的文本差异回归失败 因为我使用 cout
  • Solr、Sunspot、SQlite 和 Rails

    我想为我的使用 SQlite3 作为数据库的项目实现全文搜索 分面 听说Solr真的很强大 有 Sunspot 和 Solr 教程可用 但仅适用于 MySQL 我找不到任何有关如何为 SQLite3 设置它的文档 有人知道如何使用 SQLi
  • 使用数据表运行 100,000 次 Fisher 精确检验比应用慢

    早上好 我正在尝试使用 R 非常快速地对模拟遗传数据运行 100 000 次 Fisher 精确测试 最好在 30 秒内完成 因为我需要排列病例对照标签并迭代该过程 1 000 次 因此它会运行一夜 我尝试使用融化 整齐的数据上的数据表 其
  • 一个项目可以有多个起源吗?

    一个项目在 Git 中可以有两个 或多个 起源 吗 我想将一个项目推向两者github https github com and a Heroku https www heroku com server 具体来说 添加github仓库时出现
  • beginReceivingRemoteControlEvents 不触发 Apple Music 事件

    我正在从我的应用程序播放 Apple Music Apple Music 播放器代码如下 void submitAppleMusicTrackWithProductID NSString productID productID in US
  • 这个语法在 Javascript 中的含义是什么

    我正在 javascript 中寻找 TWILIO 的 API 我发现了类似的东西 const connect createLocalTracks Twilio Video navigator mediaDevices enumerateD
  • 没有异常处理的力量?

    在 Eclipse 中进行 Java 编程 我习惯于处理异常 在使用 VisualStudio 的 C 中 似乎我不能在方法上说 抛出异常 经过大量编码后 我发现了很多异常 并且必须在测试过程中发现它们时捕获它们 我想被迫处理它们 以便 V
  • 如何对 foreach 循环中迭代的元素进行分段

    我需要循环遍历整个用户列表 但需要一次获取 20 个 foreach var student in Class Students Take 20 Console WriteLine You belong to Group groupNumb
  • 无法自动装配方法

    我收到这个错误 org springframework beans factory BeanCreationException Could not autowire method 这是我的spring的xml配置
  • UIPickerView Swift 上奇怪的自定义背景颜色

    将自定义 UIColor 分配给 UIPickerViews 的背景时 我得到了奇怪的颜色 我为 textViews 和 pickerViews 创建了颜色 如下所示 let myTextViewBackgroundColor UIColo
  • 当node.js宕机时,如何让它自动恢复?

    由于节点基本上是一个进程 因此当出现严重错误时 整个应用程序就会崩溃 我现在有几个基于 Express 构建的应用程序 并且我正在使用一些手动方法来防止延长停机时间 process on uncaughtException 和自定义心跳监视
  • Mysql find_in_set 斜杠( / ) 分隔符

    我的值为 1 2 3 4 5 2 3 6 我想找到值 2 所以结果必须是 1 2 2 3 6 我不想使用 LIKE 运算符 有没有办法在FIND IN SET函数中设置分隔符 您可以使用like or find in set 这是一种方法
  • 如何编写 javascript 来重新排序 pdf 文档的页面?

    我有一个双面文档作为两个单独的 pdf 文件 一个文档的正面页面和第二个文档的背面页面 front pdf rear pdf 我还将它们合并为一个包含所有页面的文档 但所有正面页面都在背面页面之前 页面排序的形式为 1 3 5 7 n 2
  • Spring 启动和 SQLite

    我正在尝试将 SQLite 与 Spring Boot 应用程序一起使用 我知道 Spring Boot 对 MongoDB 等提供了出色的支持 但我找不到将 Spring Boot 与 SQLite 结合使用的方法 有什么建议从哪里或如何
  • android中的sqlite示例程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是数据库概念的新手 特别是我需要相关的数据库概念 我想要一个在 android 上使用 sqlite 数据库的示例 我浏览了 andro
  • 替换php数组中的所有键

    这是我的数组 apple some code beta other code cat other code 2 如何将所有 e 字母替换为 在键名称中并保留值 这样我就会得到类似的东西 appl some code b ta other c
  • 当我尝试添加文本剪辑时,出现有关 ImageMagick With Python/MoviePy 的错误

    我正在使用 python 3 8 5 以及最新版本的 imagemagick 和 moviepy 错误 与代码 Traceback most recent call last File C Users edgib102 AppData Lo
  • JVM 内存使用失控

    我有一个 Tomcat Web 应用程序 它代表客户端执行一些内存和 CPU 密集型任务 这是正常现象 也是所需的功能 然而 当我运行 Tomcat 时 内存使用量会随着时间的推移飙升至 4 0GB 以上 此时我通常会终止该进程 因为它会扰