您的位置 首页 > 德语常识

什么叫omo,oom的原因和解决方法

1.什么是OOM? OOM,正式名称是“Out Of Memory”,翻译成中文就是“内存不足”,来自于java.lang.OutOfMemoryError。查看官方描述:当Java虚拟机由于内存不足而无法分配对象,并且垃圾收集器没有提供更多内存时抛出。这意味着JVM没有足够的内存。当对象分配空间并且垃圾收集器没有可用空间可回收时,会抛出此错误(注意:问题还没有严重到应用程序可以处理的程度,因此这不是异常。)

2.为什么OOM?为什么没有内存?原因有两个:

什么叫omo,oom的原因和解决方法

1)低分配:例如虚拟机本身可用内存太少(通常由启动时VM参数指定)。 2)应用使用过多,使用后不释放,浪费。这会导致内存泄漏或内存溢出。内存泄漏:应用程序使用的内存没有被释放,虚拟机无法再次使用它。此时,这块内存不再被申请者使用,因虚拟机无法将其分配给其他内存而被泄漏。

内存溢出:请求的内存超出了JVM可以提供的内存大小。这称为溢出。

在C、C++等语言没有自动垃圾回收的时代,个人必须申请和释放内存,而在C++中,申请被视为新的,比如申请内存但使用后忘记释放。但是,不会执行删除,这可能会导致内存泄漏。偶尔的内存泄漏可能不会造成问题,但大量的内存泄漏可能会导致内存溢出。

Java 语言的自动垃圾收集机制通常消除了主动释放未使用对象占用的内存的需要。这意味着理论上不存在“内存泄漏”。但是,如果您的代码不正确,例如,如果将对象的引用放置在全局映射中,则即使该方法存在,该对象也可能不会被回收,因为垃圾收集器根据该引用回收内存,因此不会及时完成。目的。如果这种情况多次发生,可能会导致系统中常用的缓存机制发生内存溢出。 Java 中的内存泄漏通常有逻辑原因,这与C++ 中的忘记删除不同。

3.OOM型JVM内存模型:

根据JVM规范,JAVA虚拟机在运行时管理以下内存区域:

程序计数器:当前线程执行的字节码的行号指示器线程私有JAVA 虚拟机堆栈:Java 方法执行的内存模型每个Java 方法执行对应一个堆栈帧压入和弹出操作。 Native Method Stack:类似于“JAVA虚拟机栈”,但提供了执行Native方法的内存环境。 JAVA堆:分配对象内存的地方。内存垃圾收集的主要区域,由所有线程共享。它可以分为新生代和老一代。方法区:用于存储类信息、常量、静态变量、即时编译器编译的代码以及JVM加载的其他数据。热点“永续一代”。运行时常量池:方法区的一部分。存储常量信息,例如各种文字、符号引用等。直接内存:不属于JVM运行时数据空间的一部分,但可以直接访问的内存。例如NIO就使用了这部分。根据JVM规范,除了程序计数器不会抛出OOM之外,其他各种内存区域也会抛出OOM。

最常见的OOM 情况是:

java.lang.OutOfMemoryError: Java堆空间------Java堆内存溢出。这种情况最常见,通常是由内存泄漏或堆大小调整不当引起的。对于内存泄漏,需要使用内存监控软件来查找程序中泄漏的代码。堆大小可以通过虚拟机参数-Xms、-Xmx等更改。

java.lang.OutOfMemoryError: PermGen space ------java持久代溢出,或者说方法空间溢出,一般发生在大量的Class页面或者JSP页面上,或者是使用了cglib等反射机制的时候去做。在上述情况下,方法区中存储了大量的类信息。这种情况可以通过使用类似-XX:PermSize=64m -XX:MaxPermSize=256m 的格式调整方法区的大小来解决。此外,太多的常量,尤其是字符串,可能会导致方法空间溢出。

java.lang.StackOverflowError ------ 虽然没有抛出OOM错误,但这也是常见的Java内存溢出。 JAVA虚拟机中的堆栈溢出通常是由程序中的无限循环或深度递归调用引起的,但如果堆栈大小设置得太小,也可能会发生此类溢出。堆栈大小可以通过虚拟机参数-Xss来设置。

4.OOM分析——heapdump 可以使用两种方法来转储堆的内存映像。

如果要在OOM时自动转储堆信息,请设置JVM参数-XX:+HeapDumpOnOutOfMemoryError。不过该方法需要JDK5以上版本。使用JDK自带的jmap命令。 'jmap -dump:format=b,file=heap.bin ' 其中pid可以通过jps获取。转储堆内存信息后,需要分析转储的文件,找出OOM的原因。常用的工具包括:

mat: eclipse内存分析器,基于eclipse RCP的内存分析工具。如需了解更多信息,我们建议访问http://www.eclipse.org/mat/。 jhat:JDK附带的Java堆分析工具,可以以HTML格式显示堆中的对象,包括它们的数量、大小等,并支持对象查询语言OQL。分析完相关应用后,您可以通过http://localhost:7000访问分析结果。在真正的故障排除过程中,文件通常会先转储到生产环境,然后拉到您自己的开发机器上进行分析,因此不如以前使用高级分析工具那么高效。不推荐。垫。此链接:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html 提供了使用mat 分析的示例。

注意:不同虚拟机生成的转储文件并不相同,因为JVM规范没有定义转储文件格式。分析时,针对不同虚拟机的输出,应使用不同的分析工具(当然,有些工具兼容多种虚拟机格式)。 IBM HeapAnalyzer 是另一种用于分析堆的常用工具。

5. 相关虚拟机技术或工具的概述通常需要考虑虚拟机规范和各种虚拟机实现。特别是在调整虚拟机时,您通常需要考虑虚拟机实施策略的某些方面。例如,不同的虚拟机有不同的垃圾收集算法,这直接影响虚拟机某些参数的性能。配置虚拟机性能以获得最佳设置。

JVM运行时分析和诊断需要掌握基本的分析方法,并根据具体情况利用虚拟机原理进行具体分析。总之,水很深。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023

an>