Java 桌面应用程序的内存分析

2023-12-01

我的应用程序加载了大约的数据集。每次 85bm 至 100mb。应用程序的内存限制设置为 512mb,理论上来说,这已经足够了。

然而,我发现,如果在应用程序的单次运行中,我打开和关闭数据集 5 次,总内存消耗会稳步增加,直到出现内存不足错误:

 PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+   COMMAND
6882 bguiz 20 0 679m 206m 19m S 30   13.7 0:30.22 java
6882 bguiz 20 0 679m 259m 19m S 9    17.2 0:55.53 java
6882 bguiz 20 0 679m 301m 19m S 9    20.0 1:20.04 java
6882 bguiz 20 0 679m 357m 19m S 33   23.7 1:44.74 java
6882 bguiz 20 0 679m 395m 19m S 80   26.2 2:10.31 java

内存从约 14% 增长到约 26%。看起来像是内存泄漏。

发生的情况是,正在加载的顶级数据用于填充地图和列表等集合,然后使用更详细的数据创建这些顶级对象的子对象,然后它们依次创建子对象- 子对象。

当数据集关闭时,当前应用程序确实尝试通过取消填充各种对象集合来清除其轨迹,然后显式调用System.gc();


无论如何,这就是我收到应用程序时的状态(在我之前已经制作了几年),并且我被分配了这项任务。

我需要做的是找到一种方法来找到数据集卸载后哪些子对象和子子对象仍在相互引用,并纠正它们。
显然,这可以手动完成,但会非常非常繁琐,但我觉得通过内存分析来完成此操作会是一个更好的选择,这是我以前没有做过的事情。

我读过一些其他 SO 问题,询问要使用哪种内存分析工具,我选择使用 Netbeans IDE 中内置的工具,因为它似乎有很好的评论,而且无论如何我都在 Netbeans 中工作。

有没有人之前执行过类似的 Java 内存分析任务,事后看来:

  • 您会给我什么具体建议?
  • 您发现哪些技术对解决这个问题有用?
  • 您发现哪些资源对解决这个问题有用?

编辑: 该应用程序是标准桌面应用程序 - 不是 Web 应用程序。


编辑:已实施的解决方案

基本上对我有用的是将 Netbeans 的分析器与 JHAT 结合使用。

我发现 Netbeans IDE 中内置的 Profiler 在创建内存转储方面做得非常好分析点,然后该工具能够按类进行过滤和排序,并深入了解每个实例的引用。这一切都非常好。

但是,它没有为我提供比较两个堆转储的方法。我问了一个跟进问题,看起来 JHAT(作为 JDK 的一部分)很好地完成了这项工作。

Thorbjørn Ravn Andersen、Dmitry 和 Jason Gritman:你们的意见非常有帮助,不幸的是我只能将 1 标记为正确答案,无论如何你们都从我这里得到了 +1。


我在另一个关于查找内存泄漏的技术的问题上写了答案https://stackoverflow.com/questions/1716597/java-memory-leak-detection-tools/1717260#1717260

如果你听从我的建议,像这样的工具JProfiler可以让您遍历对象的参考图并查看这些对象的深度大小。这可以帮助您找到仍然保留数据的任何对象。

我没有使用过 Netbeans,因此我无法告诉您它与我使用过的其他分析器相比如何。如果它看起来没有该功能,您可以轻松获得 JProfiler 的试用版,该试用版应该可以持续使用,直到您发现泄漏为止。

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

Java 桌面应用程序的内存分析 的相关文章

  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Objective C UIImagePNGRepresentation内存问题(使用ARC)

    我有一个基于 ARC 的应用程序 它从 Web 服务加载大约 2 000 个相当大 1 4MB 的 Base64 编码图像 它将 Base64 解码后的字符串转换为 png图像文件并将其保存到磁盘 这一切都是在一个循环中完成的 我不应该有任
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 底部弹出UIPicker?

    调用action时从屏幕底部弹出的UIPicker是否只是一个以某种方式协调的基本UIPickerView 就像 UIActionSheet 一样 我将如何实现它 这是我使用的动画代码 void animateDatePicker BOOL
  • 如何用日期范围填充表格?

    我需要一个 MySQL 表来保存 2011 01 01 和 2011 12 31 之间的所有日期 我创建了一个表 其中一个列名为 date 类型为 DATE 通过什么查询 我可以在表中填充所有所需的日期 而不必手动输入它们 尝试这个 DRO
  • 有没有办法用 C# 为 iphone 制作应用程序

    我想知道你们是否可以为 iPhone 制作 C NET 应用程序 我该如何开始 单点触控将是要走的路 附注我真的建议你在任何平台上使用原生版本
  • git/jenkins TLS 问题

    当 Jenkins 尝试克隆存储库时 我收到以下错误 无法连接到存储库 命令 usr bin git ls remote h https github com chkp lebowits protego examples HEAD 返回状态
  • 多级块方法正在产生问题

    我有课 class DataListBuilder include ActionView Helpers TagHelper include ActionView Helpers CaptureHelper include ActionVi
  • ModuleNotFoundError:没有名为“加密”的模块

    这些是我在运行任何项目模块时收到的错误消息 Traceback most recent call last File C Users hsnl BlockchainCodesTutor Wallet py line 3 in
  • System.Web.Services.Protocols.SoapHttpClientProtocol 使用什么版本的 SSL/TLS?

    现在 SSL 3 已被发现容易受到POODLE attack 连接到任何 https Uri 时 System Web Services Protocols SoapHttpClientProtocol 使用什么版本的 SSL TLS 我使
  • mysql/php:显示帖子以及每个帖子的所有评论

    我知道这个问题已经被问过多次 但是 我仍然找不到解决方案 PHP MYSQL 显示带评论的帖子 mysql 查询 有限制的博客文章和评论 帖子和评论的 mysql 结构 基本问题 有桌子posts comments user 您可以使用一个
  • 如何去除 R 中的异常值?

    我目前正在尝试以一种非常简单的方式删除 R 中的异常值 我知道您可以为此自行创建一些函数 但我想对这个简单的代码进行一些输入 以及为什么它似乎不起作用 outliers lt boxplot okt pris out okt no out
  • Windows 7 下 GTK 中 gtk_widget_queue_draw 中的内存泄漏

    以下GTK程序 include
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证失败 MAC

    我正在尝试使用 SoundCloud SDK 进行用户身份验证 用户单击 登录 后我的第一条路线 get login do client Soundcloud new client id gt MY ID client secret gt
  • gfortran 将 c 库与 conda 连接

    我正在尝试在 Ubuntu 18 04 服务器上使用 conda 编译 C Fortran 程序 但我没有超级用户权限 我能够在我的 Ubuntu 18 04 PC 上使用相同的源代码正确编译程序 也使用 conda 但在服务器上我收到一堆
  • swagger ui 中的隐藏字段

    我正在使用 swagger UI 2 0 23 版本 并使用 json 文件提供 api 我需要使用 swagger ui 将特定标头值发送到我的 api 但该字段不应在 ui 中可见 因为该值不应该被更改 因此 如何隐藏该字段以使其不显示
  • 正则表达式 - 在每个单词之前/之后添加一个字符

    Using 记事本 and replace函数 我尝试添加一个符号 or 在我列表中的每个单词之前 列表示例 blue car 红色汽车大 红色小车 绿色汽车大 绿色小车 我正在寻找以下结果 蓝色 汽车 红色 汽车 小 红色 汽车 大 et
  • PHP 的 MCRYPT_RIJNDAEL_256 CBC 的 Python 等效项

    我需要这个函数的 Python 实现 我想在 appengine 上使用它 我不太擅长Python 所以请帮忙 function encrypt data return base64 encode mcrypt encrypt MCRYPT
  • 如何通过改变CSS来实现这样的滚动div?

    This site左侧有一个滚动 div 当您滚动页面时 div 也会有节奏地滚动 并且图像的颜色也会发生变化 position fixed还不是全部都能做到 那什么是技术呢 EDIT position fixed我可以用它来将 div 固
  • 为什么 Spring Security 中永远不会触发事件 AbstractAuthenticationFailureEvent ?

    我使用 spring 4 0 2 RELEASE 和 spring security 3 2 5 RELEASE 我使用它是因为当我开始我的项目 spring security 4 0 0 时它位于快照中 我尝试过 spring 4 2 0
  • 如何按空格分割字符串

    我需要用空格分割字符串 为此我尝试过 str Hello I m your String String splited str split 但这似乎不起作用 你所拥有的应该有效 但是 如果提供的空间默认为 其他内容 您可以使用空白正则表达式
  • R:4D 绘图、x、y、z、颜色

    你能给我一个关于如何使用 rgl 在 x y 和 z 轴上绘制 3 个变量以及使用不同颜色绘制第四个变量的示例吗 thanks 您使用以下组合persp和颜色根据单独的功能 这是一些示例代码 Create a simple surface
  • Java 桌面应用程序的内存分析

    我的应用程序加载了大约的数据集 每次 85bm 至 100mb 应用程序的内存限制设置为 512mb 理论上来说 这已经足够了 然而 我发现 如果在应用程序的单次运行中 我打开和关闭数据集 5 次 总内存消耗会稳步增加 直到出现内存不足错误