为一个进程。若要在 Linux 上进行 Thread Dump,查找通过其启动所有其它进程的进程 ID。使用命令:
?
若要获得根 PID,使用:
ps -efHl | grep 'java' **. ** 使用一个作为字符串的 grep 参数(可在与服务器启动命令匹配的进程堆栈中找到该字符串)。如果 ps 命令还没有管道传送到另一个例程,则报告的第一个 PID 将是根进程。 IBM AIX
在AIX上用IBM的JVM,内存溢出时默认地会产生javacore文件(关于cpu的)和heapdump文件(关于内存的)。执行kill -3
有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在 weblogic启动的时候,最好将其标准输出重定向到一个文件,用\sh startWebLogic.sh > start.log &\命令,执行\-3
Windows、XP、NT
? 设置DOS 窗口的属性:Layout -> Screen Buffer Size-> Height 9999。 ? 同时按下CTRL-BREAK
? 找到Thread Dump的最开始的位置:\
每个服务器需要
获取失败时刻的获取失败时刻的Thread Dump
? 启动JVM 时,加入参数:
? Sun JVM: -XX:+ShowMessageBoxOnE ? JRockit JVM: -Djrockit.waitone
五、 常见的问题
1、Out of Memory
? 当JVM没有足够的内存执行任务时,会触发 java.lang.OutOfMemoryError ? 当没有更多内存可以分配时
? 或空闲的内存有太多碎片,无法利用时
? 可能不足的内存类型有可能不足的内存类型有:: ? Native (物理内存) ? Heap (堆内存)
? 特定Java 内存代(例如,permanet)
对Out of Memory的响应的响应
? JVM会发送error到标准输出流和错误输出流
? WLS会将应用程序没有处理的Java异常和错误都输出 到服务器日志
? Out-of-Memory和类似的系统错误不应该由应用程序直 接处理接处理
? 如果应用程序发生错误,会给客户端返回错误信息( 例如HTTP 500)
? 如果WLS子系统发生错误,则服务器处于不稳定状态 ,需要重启
内存泄漏内存泄漏
? 内存泄漏:
? 最常见的引发Out-of-Memory错误的原因
? 在Java中,内存泄漏并不常发生(相对传统语言)
? 内存泄漏的原因是当对象不再被需要时,没有显式声明,进而 没有被垃圾回收处理
? 常见的场景有:
? 太大的缓存造成内存泄漏
? 太多使用HTTP会话,导致内存泄漏
? 对数据库操作结束时,没有正常关闭数据集及数据连接 ? 动态类加载问题
错误日志错误日志
? 该日志文件通常包括如下类型的信息: ? 操作系统错误消息 ? JVM版本
? 硬件和操作系统参数
? 系统环境变量 ? 堆和垃圾回收汇总 ? 线程汇总
Runtime data area 主要包括五个部分:Heap (堆), Method Area(方法区域), Java Stack(java的栈), Program Counter(程序计数器), Native method stack(本地方法栈)。Heap 和Method Area是被所有线程的共享使用的;而Java stack, Program counter 和Native method stack是以线程为粒度的,每个线程独自拥有。
Heap
Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。 (这里可能出现的异常java.lang.OutOfMemoryError: Java heap space)
Method area
在Java虚拟机中,被装载的class的信息存储在Method area的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。与Heap 一样,method area是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。 (这里可能出现的异常java.lang.OutOfMemoryError: PermGen full)
Java stack
Java stack以帧为单位保存线程的运行状态。虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到java stack中(压栈);当一个方法调用返回时,从java stack弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现StackOverFlow问题。 下面的程序可以说明这个问题。 public class TestStackOverFlow { public static void main(String[] args) { Recursive r = new Recursive(); r.doit(10000); // Exception in thread \java.lang.StackOverflowError
} }
class Recursive { public int doit(int t) { if (t <= 1) { return 1; } return t + doit(t - 1); } }
Program counter
每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿“地址”,这里的“地址”可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
Native method stack
对于一个运行中的Java程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和JVM相同的能力和权限。 (这里出现JVM无法控制的内存溢出问题native heap OutOfMemory ) 旧系统
2、服务器挂起
问题描述
在出现以下情况时怀疑服务器挂起: ? 服务器不响应新的请求。 ? 请求超时。
? 请求处理的时间越来越长(其最终结果可能是挂起)。
? 通常,服务器挂起不会表现为服务器崩溃,但服务器挂起之后可能会崩溃。 ? 资源濒临枯竭:内存、工作线程、数据库连接池…
故障排除 请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解
决。
快速链接:
为什么发生此问题? 服务器挂起的可能原因 基本步骤
已知的 WebLogic Server 问题 收集 Thread Dump Thread Dump 分析 为什么发生此问题?
服务器挂起有多种原因。一般而言,服务器挂起是因为缺少某种资源。缺少资源会阻止服务器响应服务请求。例如,由于故障(死锁)或者大量请求的缘故,可能没有任何可用的执行线程来完成工作,所有执行线程都被占用或忙于处理以前的请求。
引起引起Server Hang的原因的原因 ? 工作线程太少
? 垃圾回收占用时间太多 ? JVM代码优化问题 ? 应用程序死锁 ? JDBC 死锁
? Remote JNDI lookups ? JSP 编译
? JSP 不正确的设置:PageCheckSeconds ? JVM bug
服务器挂起的可能原因 主题 模式名称 链接
RMI、RJVM 响应 - 所有绑定线程等待 RJVM、RMI 响应。 EJB_RMI 服务器挂起 EJB_RMI 服务器挂起
应用程序死锁 - 线程锁定资源 1,然后等待锁定资源 2。另一个线程锁定资源 2,然后等待锁定资源 1。 应用程序死锁导致服务器挂起 待定 线程全部被占用,没有线程可用于新工作。 线程占用导致服务器挂起 待定 垃圾回收花费太多时间。 垃圾回收导致服务器挂起 待定 servlet 时间的 JSP 错误设置,比如 PageCheckSeconds。 JSP 导致服务器挂起 待定
死锁造成 JDBC 挂起。 JDBC 中的服务器挂起 待定
(代码优化)过程中的 JVM 挂起类似于服务器挂起。 代码优化中服务器挂起 待定
在大量负载情况下 JSP 编译造成服务器挂起。 JSP 编译导致服务器挂起 待定
SUN JVM 错误,比如轻量型线程库。 Sun JVM 错误导致服务器挂起 待定 返回页首 基本步骤
当服务器挂起时,首先使用 java weblogic.Admin t3://server:port PING 来
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库weblogic故障诊断与日常维护总结(3)在线全文阅读。
相关推荐: