这是一个简单而有效的解释内存泄漏以及垃圾收集器如何以及何时运行。这篇小文章将解决许多疑问,同时也提供了到Oracle文档的链接以供进一步研究。
内存泄漏是当对象不再被使用并且垃圾回收器无法将它们从堆中移除时发生的一种情况,因为它们仍在被引用。结果,应用程序消耗越来越多的资源,这最终导致致命的OutOfMemoryError。
通过设置参数,可以指定应用程序的初始堆大小和最大堆大小:
-Xms<size>
-Xmx<size>
Xms64m -Xmx512m
JVM从64M开始,如果mem,则增长(最大上限为512)。要求超过64。
借助Eclipse检查内存泄漏:
如果任何实现closable(从1.5开始)(例如outputstream从1.5开始)的引用被破坏但对象没有关闭,那么它将向您抛出警告。
“从Eclipse Project”>“泄漏选项”>“编译器设置”中选择“错误”
检查代码:
- 静态字段:静态引用持续存在,因此无法从内存中清除对象。
- 在Web应用程序的生命周期之外启动的守护程序线程很容易发生内存泄漏。
- 关闭连接:关闭所有文件和数据库连接可以防止内存泄漏。始终关闭
finally block
中的连接。 - 空分配:为列表、映射等分配空值。使用后也可以防止内存泄漏。
- 自动装箱每次都会创建一个新对象,避免传递给函数时将原语与wrapper类混合在一起。
分析内存使用情况:
像JProfiler、gcviewer、VisualVM、JConsole等工具可以帮助您分析应用程序的性能。
您可以通过运行附加了VisualVM的应用程序来分析代码。然后执行减慢应用程序速度的任务,并分析“监视器”和“内存池”选项卡。
查看内存使用的峰值,然后按perform gc按钮释放内存。
垃圾收集
Java垃圾收集是Java程序执行自动内存管理的过程。垃圾回收器找到未引用的对象并将其删除以释放内存。
Java垃圾收集是一个自动过程。程序员不需要显式地标记要删除的对象。垃圾收集实现存在于JVM中。
这个java.lang.System.gc()
方法运行垃圾回收器。
甲骨文称:
调用gc方法意味着Java虚拟机在回收未使用的对象上花费精力,以便使它们当前占用的内存可供快速重用。当控件从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。
调用System.gc()实际上相当于调用:
运行时Runtime.getRuntime().gc()
一旦对象符合垃圾回收的条件,它可能不会被垃圾回收器立即销毁。每当JVM运行垃圾收集器程序时,只有对象会被销毁。但我们无法预料JVM何时会运行垃圾收集器。
不能保证以上方法一定会运行垃圾回收器。
有些人将对象引用设置为null,以使其符合gc和use的条件System.gc()方法显式删除内存。设置为null不是什么大不了的,但是调用System.gc()方法会极大地影响系统的性能,不能执行。
JVM内存模型
堆被分成更小的部分或几代。堆的部分是:年轻一代,老年一代或终身一代,永久一代。
- 年轻一代是所有新对象分配和老化的地方。当年轻一代人填满时,这会导致少量的垃圾收集。
- 旧一代被用来储存长期存活的物体。通常,为年轻一代对象设置一个阈值,当满足该年龄时,对象将移动到老一代。最后需要收集老一代人。此事件称为主要垃圾回收。
- 永久代包含JVM描述应用程序中使用的类和方法所需的元数据。
经过一次较小的GC后,当老化对象达到一定的年龄阈值时,它们将从年轻一代提升到老一代。
这是对内存泄漏和垃圾收集器工作的一个简单而小的解释。
完成GC和JVM生成的工作,如何将对象从一代移动到另一代。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/926.html
暂无评论