查找 Java 中的内存泄漏
本文将教我们如何查找Java内存泄漏。
未使用的项目占用额外的内存空间称为内存泄漏。 内存泄漏是有问题的,因为它们会堵塞内存资源并随着时间的推移降低系统性能。
如果这个问题不解决,程序最终将耗尽资源并崩溃,并出现致命的 java.lang.OutOfMemoryError。
它的主要优点之一是 Java 内置垃圾收集器提供的自动内存管理。 垃圾收集器可以解决大量内存泄漏问题,因为它隐式处理内存分配和释放。
尽管垃圾收集器成功地管理了大量内存,但它无法提供针对内存泄漏的故障安全防御。 垃圾收集器很智能,但并不完美。
即使是由认真的开发人员创建的应用程序也容易出现内存泄漏。
Java内存泄漏的原因
当应用程序意外保留不再需要的对象引用时,经常会发生 Java 内存泄漏。 由于意外的对象引用,Java 垃圾收集过程无法释放这些对象使用的内存。
以下是内存泄漏的一些最常见原因。
- 缓存无限制。
- 大量的会话对象。
- 插入 Collection 对象而不删除。
- 未使用的侦听器方法。
- 操作系统中的页面切换过多。
- 写得不好的自定义数据结构。
查找 Java 中的内存泄漏
查找内存泄漏可能具有挑战性,因为没有绝对的方法来查找内存泄漏。 为了查找Java中的内存泄漏,我们有一些有效的方法,它们是:
使用内存分析器
Java 分析允许您跟踪许多 JVM 特征,例如方法执行、对象生成、线程执行和垃圾收集。 内存分析器可以跟踪正在使用的内存量并帮助查找应用程序中的内存泄漏。
分析器还可以帮助检查应用程序内部的资源分配方式,例如每个函数消耗多少内存和 CPU。 我们可以使用内存分析器来识别和发现任何问题。
Java 分析工具允许您发现以下指标。
- 方法调用的详细信息
- 内存使用情况
- 方法的CPU时间
- 创建的对象
- 被垃圾收集器删除的对象。
使用堆转储
这是 Java 中查找内存泄漏的另一种技术。 堆转储提供 Java 应用程序在特定时刻使用的堆内存的快照。
它们揭示了打开的对象实例的数量及其内存使用情况。 堆转储可以帮助确定应用程序中生成了多少对象以及其中是否有任何对象可能导致内存泄漏。
详细垃圾收集
可以启用详细垃圾收集来深入跟踪 Java 垃圾收集。 将以下参数添加到 JVM 配置以启用详细垃圾收集。
-verbose:gc
显示为默认错误报告的摘要可用于了解内存的处理方式并发现任何内存泄漏。
使用 Eclipse 内存泄漏警告
使用 Eclipse 的内存泄漏警告是发现内存泄漏的另一种方法。 如果您的代码符合 JDK 1.5 或更高版本,当引用终止但对象继续且不会关闭时,Eclipse 会向您发出警报。
确保您的项目设置允许泄漏检测。 请记住,使用 Eclipse 可能不是一个完整的解决方案。
特别是,如果您的代码与 JDK 1.5(或更高版本)不兼容,Eclipse 可能无法捕获所有泄漏,并且无法检测到某些文件关闭。
其他工具
- NetBeans Profiler – 它可以监视内存、线程和 CPU 资源,并支持 Java SE、Java FX、EJB、移动应用程序和 Web 应用程序。
- VisualVM – VisualVM 构建于 NetBeans 平台之上,是一种易于扩展的工具,它使用各种插件为您提供有关应用程序的大量信息,用于监视远程和本地程序。 使用此程序,您可以手动运行垃圾收集器并获取内存分析。
- JProfiler – 它是一个用于分析线程、内存和 CPU 的工具,还可以检查内存泄漏和其他性能问题。
- GCeasy – GCeasy 是一个分析垃圾收集日志的工具,并提供了一种在检查垃圾收集日志时查找内存泄漏问题的简单方法。 GCeasy 无需安装计算机即可在线访问,这进一步鼓励了其使用。
-
GC Viewer – 它是一个开源程序,可以使用 JVM 数据实现快速、简单的信息可视化。 GC 查看器显示垃圾收集性能信息,例如累积暂停、最长时间暂停和吞吐量。
该程序不仅使您能够启动垃圾收集,还允许您指定初始堆大小。
- Patty 的实际应用 – 这是另一个开源程序,您可以使用它来分析自己并获得有针对性的深入分析。 该工具可用于检查堆。
- JRockit – JRockit 是适用于 Java SE 应用程序的专有 Oracle 解决方案,可以预测延迟、显示垃圾收集并分析内存相关问题。
在本教程中,我们了解了 Java 中的内存泄漏、其不同原因以及如何查找它们。 本教程讨论了各种工具和技术。
用户可以遵循减少内存泄漏的技术和工具来提高应用程序的性能。
相关文章
Java迭代器remove()方法
发布时间:2023/07/17 浏览次数:117 分类:Java
-
Java 开发人员经常需要在迭代时从 ArrayList 中删除元素或对象。在本文中,我们将了解迭代器的remove()方法和集合的remove()方法的工作原理有何不同。
在 Java 中对一个 Switch Case 语句使用多个值
发布时间:2023/07/16 浏览次数:174 分类:Java
-
在本文中,我们将学习如何在一个 switch-case 语句中使用多个值。使用 switch-case 语句 Java 允许程序员通过使用 switch case 语句来像其他编程语言一样克服太多的 if-else 条件语句。
Java 中的线程安全延迟初始化
发布时间:2023/07/16 浏览次数:59 分类:Java
-
本文将讨论在 Java 中实现线程安全的延迟初始化。Java 中的对象初始化 延迟初始化是延迟对象创建的行为。 它还可能导致某些计算任务或首次昂贵流程的延迟。
在 Java 中显示动画 GIF
发布时间:2023/07/16 浏览次数:112 分类:Java
-
我们可以使用javax包的Swing库方法来在Java中显示动画GIF。 本文介绍用户如何在 Java 应用程序或单独的窗口中显示动画 GIF。使用 Javax.swing 库在 Java 中显示动画 GIF
在 Java 中用 %20 替换空格
发布时间:2023/07/16 浏览次数:96 分类:Java
-
在本文中,我们将学习两种用 %20 替换给定字符串的所有空格的方法。Java中使用replaceAll()方法将空格替换为%20 在这里,我们使用Java内置方法 replaceAll() 将所有空格替换为%20字符串。
Java 中的矩阵乘法
发布时间:2023/07/16 浏览次数:99 分类:Java
-
在本文中,我们将学习在 Java 中将两个矩阵相乘。Java 中两个矩阵相乘 我们使用乘法和加法运算符来乘两个矩阵。
Java Synchronised变量
发布时间:2023/07/16 浏览次数:131 分类:Java
-
本文将讨论如何在Java中同步或锁定变量。同步或锁定是避免此类错误情况的解决方案。 synchronized 关键字
Java最快的排序算法
发布时间:2023/07/16 浏览次数:155 分类:Java
-
本文将介绍两种最快的排序算法并用 Java 编写它们的代码。第一种技术是计数排序,它有一些局限性。 因此,我们还将介绍合并排序算法。 Java中的计数排序算法 Java中的归并排序算法