1.内存泄漏
指的是程序中已经不再使用的对象仍然是被引用,导致垃圾回收器无法进行回收,时间长了,内存泄漏会累积,最终导致内存不足的问题。
(1)常见的原因
长生命周期对象持有短生命周期对象的引用,例如静态集合中存储的对象。
未正确关闭的资源,如数据库连接、文件句柄、网络连接等。
事件监听器或回调函数未被及时移除,导致对象无法被垃圾回收。
(2)如何解决
避免不必要的对象印用,可以在适当的时候将集合中的对象移除。
使用 try-with-resources
来自动关闭资源。
在需要缓存对象但不影响垃圾回收时,可以使用弱引用来解决。
当对象不再需要时,及时注销事件监听器或回调函数。
2.内存溢出
指的是JVM在尝试分配对象时内存不足而抛出的 OutOfMemoryError
异常。这通常意味着程序需要的内存超出了 JVM 所允许的最大内存空间。
(1)常见原因
程序创建了大量对象并且内存不够。
无限递归或未限制的循环生成了大量临时对象。
内存泄漏严重,导致内存逐渐耗尽。
(2)如何解决
检查程序中是否有大量对象的问题,进行优化数据结构
调整JVM参数,来增大堆内存
使用相应的工具,分析内存溢出的问题
(3)常见的三种内存溢出情况
JAVA堆溢出:通常是由于对象创建过多,导致堆内存不足。
方法区溢出:过多的类加载或动态生成的类,导致方法区内存耗尽。
栈内存溢出:通常是由于过深的递归调用,导致栈空间不足。