java 内存泄露 内存溢出_「内存溢出」内存溢出是怎么回事?举个例子 - seo实验室...

内存溢出

原 https://blog.csdn.net/ITzhangdaopin/article/details/78716180

https://blog.csdn.net/shenlei19911210/article/details/39755037

Java内存溢出(内存泄漏)

内存溢出(out of memory)通俗理解就是内存不够,在计算机程序中通俗的理解就是开辟的内存空间得不到释放。Java虽然提供了垃圾回收机制,但是并没有保证我们所写的代码就不存在没存溢出的可能。import java.util.ArrayList;

import java.util.List;

public class MyList{

/*

* 此处只为掩饰效果,并没有进行封装之类的操作

* 将List集合用关键字 static 声明,这时这个集合将不属于任何 MyList 对象,而是一个类成员变量

*

*/

public static List list = new ArrayList();

}

class Demmo{

public static void main(String[] args) {

MyList list = new MyList();

list.list.add("123456");

// 此时即便我们将 list指向null,仍然存在内存泄漏,因为MyList中的list是静态的,它属于类所有而不属于任何特定的实例

list = null;

}

}

上面的情况如果想要防止内存溢出,那么我们应该做的是,在每次使用完后调用List集合中的remove方法,将集合中无用的元素清除。

还有就是,既然是static变量就别要使用类对象去调用啦,使用实例对象调用static变量可能引发一些意想不到的后果哦!

内存溢出分三种情况

1、OutOfMemoryError: PermGen space

Permanent Generation space 这个区域主要用来保存加来的Class的一些信息,在程序运行期间属于永久占用的,Java的GC不会对他进行释放,所以如果启动的程序加载的信息比较大,超出了这个空间的大小,就会发生溢出错误;

解决的办法无非就是增加空间分配了——增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。

2、OutOfMemoryError:Java heap space

heap 是Java内存中的堆区,主要用来存放对象,当对象太多超出了空间大小,GC又来不及释放的时候,就会发生溢出错误。

Java中对象的创建是可控的,但是对象的回收是由GC自动的,一般来说,当已存在对象没有引用(即不可达)的时候,GC就会定时的来回收对象,释放空间。但是因为程序的设计问题,导致对象可达但是又没有用(即前文提到的内存泄露),当这种情况越来越多的时候,问题就来了。

针对这个问题,我们需要做一下两点:

1、检查程序,减少大量重复创建对象的死循环,减少内存泄露。

2、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。

3、StackOverFlowError

stack是Java内存中的栈空间,主要用来存放方法中的变量,参数等临时性的数据的,发生溢出一般是因为分配空间太小,或是执行的方法递归层数太多创建了占用了太多栈帧导致溢出。

针对这个问题,除了修改配置参数-Xss参数增加线程栈大小之外,优化程序是尤其重要。

相关阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在使用Java中的FutureTask类时,可能会遇到java.util.concurrent.FutureTask.report内存溢出的问题。 FutureTask是Java中Executor框架的一部分,用于表示一个异步计算任务。在执行计算任务时,可能会出现内存溢出的情况,这通常是由于以下原因引起的: 1. 任务计算量过大:如果计算任务需要处理大量的数据或执行复杂的操作,可能会导致内存使用过多,进而导致内存溢出。 2. 内存泄漏:如果在任务执行过程中有未正确释放的资源或对象引用,那么这些未释放的资源可能会一直保存在内存中,最终导致内存溢出。 解决这个问题的方法如下: 1. 优化任务计算:检查计算任务的实现代码,尝试减少计算量或改进计算逻辑,以降低内存使用量。可以通过合理使用数据结构、循环和递归等技巧来减少内存占用。 2. 调整内存配置:如果计算任务确实需要较大的内存空间,可以调整Java虚拟机的内存配置参数。可以增加-Xmx和-Xms等参数,以提供足够的内存空间给计算任务使用。 3. 检查内存泄漏:通过使用Java内存分析工具,如Eclipse Memory Analyzer等,来检查任务执行期间是否存在内存泄漏。如果发现泄漏问题,需要修复代码,确保资源和对象在不再使用时能够正确释放。 综上所述,当出现java.util.concurrent.FutureTask.report内存溢出的情况时,我们可以通过优化任务计算、调整内存配置和检查内存泄漏等方法来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值