竹笋

注册

 

发新话题 回复该主题

Weblogic内存溢出和内存泄漏问题的 [复制链接]

1#
甲氧补骨脂素洗剂 http://baidianfeng.39.net/a_wh/140105/4322198.html

OOM:由于java堆或本机内存中的内存耗尽而发生内存不足错误。在JVM中,当JVM由于堆内存不足而无法分配对象时,会抛出OutOfMemoryError错误,并且垃圾收集器无法提供更多的堆内存。

内存泄漏:如果应用程序正在使用内存,而应用程序在使用完内存后没有释放内存,则会发生内存泄漏。内存泄漏可能发生在java堆或本机内存中,并且最终会导致内存不足的情况。

故障排除

请注意,并非所有以下项目都需要完成。有些问题只能通过以下几个项目来解决。

故障排除步骤

Java堆、本机内存和进程大小

Java堆:这是JVM用来分配Java对象的内存。java堆内存的最大值是使用java命令行中的-Xmx标志指定的。如果没有指定最大堆大小,那么这个限制是由JVM考虑机器中的物理内存量和此时可用的可用内存量等因素决定的。始终建议指定maxjavaheap值。

本机内存:这是JVM用于自身内部操作的内存。JVM将使用的本机内存堆的数量取决于生成的代码数量、创建的线程数量、GC期间用于保存java对象信息的内存以及代码生成、优化等期间使用的临时空间。

如果有第三方本机模块,它也可以使用本机内存。例如,本机JDBC驱动程序分配本机内存。

本机内存的最大数量受任何给定操作系统上的虚拟进程大小限制以及已提交给带有-Xmxflag的java堆的内存量的限制。例如,如果应用程序总共可以分配3GB,如果最大java堆是1GB,那么最大可能的本机内存大约是2GB。

进程大小:进程大小将是java堆、本机内存以及加载的可执行文件和库所占用的内存的总和。在32位操作系统上,进程的虚拟地址空间最多可达4GB。在这个4GB中,OS内核为自己保留了一些部分(通常为1-2GB)。其余的可用于应用程序。

Windows:不同版本的Windows支持不同的进程大小。

redhatlinux:RH-Linux上有不同的内核,这些不同的内核支持不同的进程大小。

对于其他操作系统,请参阅操作系统文档以了解您的配置。

有关为WebLogic服务器配置所有这些的更多信息,请参阅调优Java虚拟机(jvm)。

进程地址空间和物理内存之间的差异

每个进程都有自己的地址空间。在32位操作系统中,此地址空间的范围为0到4GB。这与机器中可用的RAM或交换空间无关。由于jvmgc性能要求java堆的大部分位于RAM中,因此添加RAM比增加交换更有帮助尺寸。用于例如,对于一个使用8gigJava堆的Java应用程序,添加4gig的RAM加上12gig的swap并没有添加等量的纯RAM那么有用。

进程中的内存地址是虚拟的。内核将这个虚拟地址映射到物理地址。物理地址指向物理内存中的某个位置。在任何给定的时间,计算机中正在运行的进程使用的所有虚拟内存的总和都不能超过该计算机上可用的总物理内存。

为什么会出现OOM问题,JVM在这种情况下会做什么?

java堆内存不足

如果JVM不能在java堆中获得更多的内存来分配更多的java对象,JVM就会抛出java内存不足错误。如果java堆中充满了活动对象,并且JVM无法再扩展java堆,那么JVM将无法分配更多的java对象。

在这种情况下,JVM让应用程序决定在抛出java.lang.OutOfMemoryError错误.例如,应用程序可能会处理此错误并决定以安全的方式关闭自身,或者决定忽略此错误运行。如果应用程序没有处理这个错误,那么抛出这个错误的线程将退出(如果进行java线程转储,您将看不到这个线程)。

在WebLogic服务器的情况下,如果这个错误是由一个execute线程抛出的,则会处理这个错误,并且会记录错误。如果连续抛出此错误,则核心运行状况监视器线程将关闭WebLogic服务器。

本机堆内存不足

如果JVM不能获得更多的本机内存,它就会抛出本机内存不足(nativeOOM)。这通常发生在进程达到该操作系统上的进程大小限制或计算机内存和交换空间不足时。

当这种情况发生时,JVM将处理本机OOM条件,记录一条消息,指出本机内存不足或无法获取内存并退出。如果JVM或任何其他加载的模块(如libc或第三方模块)不能处理这种本地OOM情况,那么OS将向JVM发送sigabort信号,使JVM退出。通常,JVM在收到SIGABROT信号时会生成一个核心文件。

调试问题的步骤

首先,确定它是java堆OOM还是本机OOM(堆外内存溢出)

java.lang.OutOfMemoryErrorjava.lang.OutOfMemoryError请注意,上面的消息转到stdout或stderr,而不是特定于应用程序的日志文件,如weblogic.log.

对于JavaOOM:

收集并分析详细垃圾收集(GC)输出

启用详细GC日志记录。为了有效地记录GC活动,启动时JVM中应包括以下选项:

1.对于HotSpot:-verbose:gc、-XXPrintGCDetails和-XXPrintGCTimeStamps。Xloggc:也可以指定将GC详细统计信息重定向到输出文件。除了日志文件消耗的一些磁盘空间之外,基本GC的开销是空的(有关更多详细信息,请参阅Java热点VM选项)。

2.对于JRockit:-verbose:gc,gcpause,memdbg(有关详细信息,请参阅JRockit命令行选项)。

确保JVM在抛出javaoom之前执行以下操作

完全GC运行:

执行一个完整的GC,所有不可到达的、幻象的、弱的和不可到达的对象都被移除,并且这些空间被回收。有关不同级别的对象可达性的更多详细信息,请访问:

分享 转发
TOP
发新话题 回复该主题