为了账号安全,请及时绑定邮箱和手机立即绑定

什么是OutOfMemoryError以及如何调试和修复它

什么是OutOfMemoryError以及如何调试和修复它

慕运维8079593 2019-07-04 17:52:48
什么是OutOfMemoryError以及如何调试和修复它我的Java程序抛出了一个OutOfMemoryError..如何调试和修复此问题?许多Java新手都在努力应对OutOfMemoryError..这是一种尝试创建一个规范问题的尝试,该问题将回答关于OutOfMemoryError..我正在创建这个新问题,而不是修改之前关于OutOfMemoryError因为这些问题及其答案与特别一个人遇到的问题。
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

OutOfMemoryError是Java虚拟机(JVM)引发的异常,因为它需要为(新的)对象分配内存,但对象可用内存不足。JVM将首先尝试释放死对象使用的内存。运行垃圾收集器.

作为OutOfMemoryErrorVirtualMachineError,jvm允许扔过去任何时间,尽管它必须尝试首先通过垃圾收集释放内存.

但是,在实践中,它可能会从new语句,该语句试图创建无法为其分配内存的对象。因此,您应该首先检查与异常相关的堆栈跟踪,以获得有关问题原因的线索,就像你对任何其他例外一样.

  • 如果试图分配数组时引发异常(如

    int[] values = new int[n]

    ),原因可能是您试图创建一个过大的数组(

    n

    太大了)。在计算所需数组的大小时是否犯了错误?
  • 如果试图在由其他人编写的容器类的方法中分配数组,则会引发异常,原因可能是您的代码要求容器存储过多的东西。方法,例如

    ArrayList.reserve(int)

    HashMap(int)

    必须为将来的使用分配存储空间。你在计算你需要的集装箱的尺寸时是否犯了错误?
  • 如果从循环内部抛出异常,原因可能是代码已循环了太多次。您的循环终止条件正确吗?如果是

    for

    循环,你是让它循环正确的次数吗?

如果堆栈跟踪没有提供足够的线索,则可以尝试使用堆分析器。这是一个监视程序,使您能够在程序运行时检查用于对象的内存,或检查堆转储程序退出时编写的。它可以提供存储在内存中的对象的大小、数量和类的信息。

JVM有一个有限内存提供给它。您可能会得出这样的结论:您的程序运行正常,但运行所需的内存比提供给它的内存要多。如果没有显式地告诉JVM要使用多少内存,大多数实现将选择合理违约根据您的计算机所拥有的RAM数量计算的数量,但是对于您的程序来说,这个数量可能太小了。JVM的命令行选项可以控制可用内存的数量。对于大多数JVM实现来说,最重要的选项是-Xmx-Xms.


查看完整回答
反对 回复 2019-07-04
?
九州编程

TA贡献1785条经验 获得超4个赞

当Tomcat耗尽内存时,即Tomcat配置的内存比运行应用程序所需的内存少时,就会出现这个问题。

因此,要克服这个问题,请转到Tomcatbin目录创建一个新文件setenv.bat并在该文件中定义PermSize,如下所示:

设置Java_opts=-Dfile.coding=UTF-8-Xms512m-Xmx1024m-XX:PermSize=512m-XX:MaxPermSize=1024m

可根据应用要求将PermSize设置为更高的范围。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 1104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信