当前位置: 首页 > 面试题库 >

Java内存泄漏故障排除:完成?

长孙翔
2023-03-14
问题内容

我有一个行为异常的应用程序,似乎在泄漏。经过简要的探查器调查后,大多数内存(80%)由java.lang.ref.Finalizer实例保留。我怀疑终结器无法运行。

造成这种情况的常见原因似乎是终结器抛出异常。但是,该类finalize方法的javadoc
Object(例如参见此处)似乎自相矛盾:它指出

如果finalize方法抛出未捕获的异常,则该异常将被忽略,并且该对象的终止将终止。

但后来,它也指出

由finalize方法引发的任何异常都会导致该对象的终止终止,但否则将被忽略。

我应该相信什么(即终结是否终止?),您对如何调查这种明显的泄漏有任何提示吗?

谢谢


问题答案:

我的第一步将是确定这是否是真正的内存泄漏。

先前答案中提出的观点都与收集对象的 速度 有关,而不是与是否收集对象有关。只有后者才是真正的内存泄漏。

我们的项目也遇到了类似的困境,并以“慢动作”模式运行该应用程序以判断是否存在真正的泄漏。我们能够通过减慢输入数据流的速度来做到这一点。

如果在“慢动作”模式下运行时问题消失了,那么该问题可能是先前答案中建议的问题之一,即,终结器线程无法足够快地处理终结器队列。

如果这是问题所在,听起来您可能需要执行一些非平凡的重构,如链接到的Bringer128
页面中所述,例如

现在,让我们看一下如何编写需要事后清除的类,以便其用户不会遇到前面概述的问题。最好的方法是将此类分为两类-
一种用于保存需要事后清除的数据,另一种用于保存其他所有内容-并仅在前者上定义终结器



 类似资料:
  • 本文向大家介绍Java 内存泄漏,包括了Java 内存泄漏的使用技巧和注意事项,需要的朋友参考一下 在Java中,垃圾回收(析构函数的工作)是使用垃圾回收自动完成的。但是,如果代码中有引用它们的对象怎么办?它无法取消分配,即无法清除其内存。如果这种情况一再发生,并且创建或引用的对象根本没有被使用,它们就会变得无用。这就是所谓的内存泄漏。 如果超过了内存限制,则程序将通过抛出错误(即“ OutOfM

  • 初始设置 在创建并启动新的 Serene 应用程序之后,不能显示登录页,而当你打开浏览器控制台,却得到一条错误消息:找不到 Template.LoginPanel: 你可能使用了无效的解决方案名称,如 MyProject.Something (包含点’.’)。 当项目以这种方式命名时,模板系统将不能定位模板。 请不要在解决方案名称中使用点符号(’.’),如果必须使用点符号,可在创建解决方案之后再重

  • 当使用 Gradle 时, 你肯定会碰到许多问题. 解决遇到的问题 如果你碰到了问题, 首先要确定你使用的是最新版本的 Gradle. 我们会经常发布新版本, 解决一些 bug 并加入新的功能. 所以你遇到的问题可能就在新版本里解决了. 如果你正在使用 Gradle Daemon, 先暂时关闭 daemon (你可以使用 switch —no-daemon 命令). 在第19章我们可以了解到更多关

  • 在Debian和Ubuntu上,当您安装标准的FreeRADIUS软件包时,FreeRADIUS服务器二进制文件称为freeradius而不是radiusd。 您可以创建将使用较慢服务器的ldap模块的命名实例。 然后,您可以使用冗余部分替换authorize部分中的ldap条目,该冗余部分首先使用快速LDAP服务器列出模块,然后使用较慢的部分使用ldap模块实例。 #ldap redundant

  • Mount 5 Error mount 5 错误通常是 MDS 服务器滞后或崩溃导致的。要确保至少有一个 MDS 是启动且运行的,集群也要处于 active+healthy 状态。 Mount 12 Error mount 12 错误显示 cannot allocate memory ,常见于 Ceph 客户端和 Ceph 存储集群版本不匹配。用以下命令检查版本: ceph -v 如果 Ceph

  • 从 Vert.x 3.4.0 开始,Vert.x 已经弃用 JGoups 实现,已经由 [infinispan]|(/clustering/Infinispan.md) 。不建议在生产或测试环境中使用 JGroups Cluster Manager 在构建工具中添加依赖即可: Maven(pom.xml) <dependency> <groupId>io.vertx</groupId> <