线程诊断+堆+方法区+常量池
线程诊断
案例1: cpu占用过多
定位
- 用top定位哪个进程对cpu的占用过高
- ps H -eo pid,tid,%cpu | grep进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高)
- jstack进程id
- 可以根据线程id 找到有问题的线程,进一步定位到问题代码的源码行号
案例2:程序运行很长时间没有结果
可能产生了死锁;
本地方法栈
本地方法栈是给本地方法提供内存空间;
堆
Heap堆:通过new关键字,创建对象都会使用堆内存
特点:
- 它是线程共享的,堆中对象都需要考虑线程安全的问题
- 有垃圾回收机制
在你所建的工程下面可以执行以下命令:
- jps工具:查看当前系统中有哪些java进程
- jmap工具:查看堆内存占用情况 jmap - heap 进程 id
- jconsole工具:图形界面的,多功能的监测工具,可以连续监测
方法区
定义:
方法区内存溢出现象:
元空间内存溢出:输出java.lang.OutOfMemoryError:Metaspace
永久代内存溢出:输出java.lang.OutOfMemoryError:PermGen space
总结:
- 1.8以前会导致永久代内存溢出
* 演示永久代内存溢出 java.lang.outOfMemoryError: PermGen space
* -XX:MaxPermSize=8m
- .1.8之后会导致元空间内存溢出
* 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
* -XX:MaxMetaspaceSize=8m
常量池
定义:常量池,就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息
运行时常量池,常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址。