Java程序拥有16GB虚拟内存并且不断增长:这是一个问题吗?

2023-12-14

在 Mac OSX 5.8 上,我有一个 Java 程序,它以 100% CPU 运行很长一段时间——几天或更长时间(它是一个分析并发程序的模型检查器,所以这或多或少是预期的)。然而,它的虚拟内存大小(如 OSX 的活动监视器中所示)在一天左右后变得巨大:现在为 16GB,并且还在不断增长。物理内存使用量大致稳定在1.1GB左右。

我想知道:16GB(并且不断增长)是否是可能导致我的程序变慢的问题的迹象?

I start the program with "java -Xmx1024m -ea"

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-9M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

感谢大家的建议。我将尝试一些答案中给出的分析建议,然后回来(由于多天的运行时间,可能需要一段时间)。

为了回答下面的一些问题,模型检查器几乎不执行 I/O(仅打印语句,具体取决于调试设置)。在我使用的模式下,它没有 GUI。我不是模型检查器的主要作者(尽管我已经研究过它的一些内部结构),但我不相信它使用了 JNI。[

额外的虚拟内存并没有导致模型检查器死掉,但是根据打印输出的频率,随着虚拟内存使用量的增加,它的运行速度逐渐变得越来越慢。 (不过,也许这只是因为垃圾收集越来越多。)我计划周一在 Windows 机器上尝试一下,看看是否会出现同样的问题。

一点额外的解释:我正在运行的模型检查器 (JPF) 本身就是一个几乎完整的 JVM(完全用 Java 编写),在 Oracle/Sun 的 JVM 下运行。当然,作为一个虚拟机,JPF对于支持模型检查是高度专业化的。

这有点违反直觉,但这意味着即使我正在模型检查的程序被设计为多线程,但就 Sun 的 JVM 而言,只有一个线程:运行 JPF 的线程。 JPF 模拟我的程序所需的线程,作为其模型检查过程的一部分。


我相信Stephen C已经指出了问题所在; Roland Illig 给了我验证它的工具。我对JNI的使用是错误的。 JPF 本身不使用 JNI,但它允许插件,并且 JNI 由配置的插件之一使用。幸运的是,我可以使用纯 Java 的等效插件。其中之一的初步使用表明,在过去几个小时内虚拟内存没有增长。感谢大家的帮助。


我也怀疑是漏水了。但这不可能是“正常”内存泄漏,因为 -Xmx1024m 选项限制了正常堆。同样,它不会是“permgen”堆的泄漏,因为 permgen 的默认最大大小很小。

所以我怀疑它是以下之一:

  • 你正在泄漏线程;即线程正在被创建但没有终止。它们可能不处于活动状态,但每个线程都有一个未在常规堆中分配的堆栈段(默认情况下为 256k 到 1Mb ...取决于平台)。

  • 您正在泄漏直接映射文件。这些映射到操作系统在常规堆之外分配的内存段。 (@bestsss 建议您查找泄露的 ZIP 文件句柄,我认为这是这种情况的一个子案例。)

  • 您正在使用一些 JNI / JNA 代码,这些代码会泄漏 malloc 内存或类似的内存。

无论哪种方式,内存分析器都可能隔离问题,或者至少消除一些可能性。


JVM 内存泄漏也是一种可能,但在您明确消除自己的代码和正在使用的库/应用程序中可能的原因之前,开始怀疑 JVM 是不明智的。

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

Java程序拥有16GB虚拟内存并且不断增长:这是一个问题吗? 的相关文章

  • 向 JList 添加滚动条? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 JList 添加到 JScrollPane 把你的JList in a JScrollPane JScrollPane scrol
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 在 SWT 中单击鼠标触发事件?

    在SWT中 对于MouseListener接口 可用的方法有mouseUp mouseDown and mouseDoubleClick 如何根据用户点击触发事件 我们可以通过结合来做到这一点mouseUp and mouseDown 但没
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 在 R 中,为什么 sum 与其他方法(例如 cumsum)相比如此慢?

    我正在尝试实现一个需要非常快的函数 主要是因为它一遍又一遍地处理巨大的数据帧 R 总是让我感到困惑 为什么它有时有点慢 而有时又慢得离谱 不幸的是 它从来都不快 不管怎样 我一直认为 如果可能的话 当以某种方式推入 apply sapply
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • 文档过滤器在 Java 中不起作用?

    在超过 10 个字符的文本字段中 它必须显示错误 为此 我使用了文档过滤器 JTextField field JTextField txtFld AbstractDocument document AbstractDocument fiel
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • 如何将字符串转换为ArrayList?

    在我的字符串中 我可以有任意数量的以逗号分隔的单词 我希望将每个单词添加到 ArrayList 中 例如 String s a b c d e 尝试类似的东西 List
  • 在 LINQ 查询中使用内置 sql 函数?

    是否可以在 LINQ 查询中使用内置 sql 函数 例如 user name 如果没有 我可以使用其他东西吗 这取决于提供商 例如 在针对 SQL Server 的 LINQ to Entities 中 您可以使用SqlFunctions
  • 单击鼠标即可获取 MS 图表中的标记位置

    我正在使用 MS Charts 制作图表 现在图表有我想要获取坐标的标记点 如果用户单击标记点 我希望图表中具有交互性 以便单击标记点时我可以检索标记点的坐标 x 轴和 y 轴 例如对于图表 单击橙色点或蓝色点时 我想获取该点的坐标 例如第
  • 空手道针对SocketTimeoutException的重试机制

    我们有一个系统 用于在测试期间发出一些 PUT 请求 问题是 目前该系统的资源存在一些问题 有时无法及时响应 我们无法将读取超时值增加到大于 60 秒的值 原因有两个 如果系统响应速度不快 则很可能根本不会响应 其次 我们使用的代理在 60
  • Django:在中间件中用 request.urlconf 覆盖 ROOT_URLCONF

    当请求包含 api 子域时 我试图用另一个 url 覆盖 ROOT URLCONF 这就是我到目前为止所拥有的 from django utils cache import patch vary headers class Subdomai
  • 在 Excel 中显示一段时间的弹出窗口

    我正在尝试生成一个在给定时间后关闭的弹出窗口WaitTime很快 我咨询过this链接和this link 我尝试应用 VBA Excel宏消息框自动关闭 我的代码如下 Sub TestSubroutine Dim TemporalBox
  • android 支持 PTRACE_SINGLESTEP 吗?

    好的 这是一个简单的问题 当我使用 ptrace 系统调用时 android 支持 PTRACE SINGLESTEP 吗 当我想ptrace一个android apk程序时 我发现我无法处理SINGLESTEP跟踪 但是当我使用PTRAC
  • 在 Weblogic 10.3 上调用 WebService 时未实现方法

    我开发了一个 Web 服务客户端来连接部署在 Weblogic 10 3 上的 Web 服务 尝试实例化客户端对象时总是得到相同的异常 java lang UnsupportedOperationException Method not i
  • 将年/周转换为日期对象

    字符串包含 YEAR WEEK 我想将其转换为parse date time 到日期对象 但我无法使代码工作 parse date time c 201510 YW 我不必使用润滑 也可以是其他包 在将年周转换为日期之前 您必须指定一周中的
  • iptables:复制/转发端口

    我正在尝试从阻止此端口的网络连接到 MySQL 端口 3306 但还有另一个端口 110 开放 我可以将其用于本例 我正在将 MySQL 用于其他应用程序 因此我不能简单地更改端口 我现在正在尝试通过 iptables 设置端口转发 确切地
  • NextJS 中 :global() css 模块选择器不纯的问题

    因此 我正在将应用程序从 CRA 迁移到 NextJS 并且我遇到了某些组件和页面的 module scss 文件的错误 Syntax error Selector global label primary is not pure pure
  • ssis xml 配置 - 配置覆盖包 - ssis 是否会在您不通知的情况下更改配置?

    昨天我工作了一整天 试图消除 XML 配置文件中错误连接字符串的影响 我检查了每个包 删除了有问题的连接管理器并使用正确的服务器名称重新添加它 每次我这样做时 我都会通过删除它来显式更新配置 然后使用覆盖选项重新添加它 但后来我犯了一个可怕
  • MongoDB:管理员无权执行命令

    当我使用时 我的 mongo shell 给了我这个错误show dbs命令 没有管理员权限执行命令 我尝试使用创建用户 db createUser user siteUserAdmin pwd password roles role us
  • 从环境中获取 xts 对象

    我已将 xts 对象存储在环境中 当这些对象存储在环境中时 我可以对它们进行子集化 即 就地 对它们进行操作吗 我可以通过引用这些对象来提取它们吗colname 下面是我要表达的内容的示例 environment in which to s
  • JavaScript 中的 numpy.random.choice?

    Numpy random choice 是一个很好的简单函数 它允许您根据某种概率分布对整数数组进行采样 gt gt gt np random choice 5 3 p 0 1 0 0 3 0 6 0 array 3 3 0 javascr
  • 如何在Spring Security中使用具有authentication-success-handler-ref等效功能的自定义过滤器

    我想将一些带有登录详细信息的参数传递给 spring security 例如某些项目 ID 然后我想根据用户类型重定向到页面 为此我正在使用自定义过滤器发送附加参数 我正在使用重定向身份验证成功处理程序参考 我的问题是 我在使用时遇到位置冲
  • 参数和局部变量有什么区别?

    为看起来一定像的事情道歉very愚蠢的问题 我目前正在通过 codecadamy 工作 这让我很失望 var greeting function name name sausage console log name greeting nam
  • 模式验证器对于 IP 地址正则表达式无效

    我正在使用以下正则表达式来验证IP 地址模式 b 25 0 5 2 0 4 0 9 01 0 9 0 9 3 25 0 5 2 0 4 0 9 01 0 9 0 9 b 我也在a中检查过正则表达式测试器而且效果很好 但是 当我在模式验证器中
  • 在 yii2 中获取日期时间时时间错误

    当我在 yii2 项目中获取日期时间时遇到问题 当我得到日期时间时 日期是正确的 但时间是错误的 我执行我的代码 结果是 2016 05 02 12 30 28 而我笔记本电脑上的时间是 19 30 有什么问题 我利用在印度尼西亚的时间 这
  • Java程序拥有16GB虚拟内存并且不断增长:这是一个问题吗?

    在 Mac OSX 5 8 上 我有一个 Java 程序 它以 100 CPU 运行很长一段时间 几天或更长时间 它是一个分析并发程序的模型检查器 所以这或多或少是预期的 然而 它的虚拟内存大小 如 OSX 的活动监视器中所示 在一天左右后