赞
踩
目录
模拟代码
- public class OnLine {
-
- public static void main(String[] args) {
- while (true) {
- // run
- }
- }
- }
方法一:top命令列出进程信息,按P(shift+p)让CPU占用率由高到低排序(按M是内存),由此看到最高的是java进程,PID为31416。
方法二:jps命令,看到启动类OnLine对应的PID为31416。
方法三:ps -ef | grep java,自己玩哈。
top -Hp PID命令列出指定进程里线程信息,同样按P排序,看到最高的线程ID为31420。
首先将十进制31420转为十六进制,使用命令printf '%x\n' xxx。然后用jstack命令配合grep命令输出线程的堆栈信息。
jstack 进程ID | grep '0x线程ID' -A 10
由此可以看到线程的状态和执行代码位置。
模拟代码
- public class OnLine {
-
- private static final List<Byte[]> bytesList = new ArrayList<>();
-
- public static void main(String[] args) {
- for (int i = 0; i <= 10; i++) {
- Byte[] bytes = new Byte[1024 * 1024];
- bytesList.add(bytes);
- }
- LockSupport.parkNanos(TimeUnit.HOURS.toNanos(1));
- }
- }
top命令列出进程信息,按M(shift+m)让内存占用率由高到低排序(按P是CPU),由此看到最高的是java进程,PID为13915。
jmap -dump:live,format=b,file=heap.bin 13915
jmap
[options] pid
-dump:
dump_options pidConnects to a running process and dumps the Java heap. The dump_options include:
live
--- When specified, dumps only the live objects; if not specified, then dumps all objects in the heap.
format=b
--- Dumps the Java heap inhprof
binary format
file=
filename --- Dumps the heap to filenameExample:
jmap -dump:live,format=b,file=heap.bin
pid
打开可视化工具jvisualvm(目录:JAVA_HOME/bin/),文件->装入,选择刚才dump的文件
打开之后,选择“类”,按“大小”降序,就可以看到各类的实例数量和内存占用大小的信息了
双击类所在行(比如上面的java.lang.Byte[]),选择实例,可以看到详细引用信息了
让JVM在发生内存溢出时自动dump堆快照文件
参数设置:
还是采用上面的代码,启动参数设置如下
-Xms10M
-Xmx10M
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/zhh/
发生OOM时,在指定位置dump了堆快照文件,这时就可以拿去分析了(参考2)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。