Java内存模型是描述Java程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。
在Java虚拟机中,内存分为三个代:新生代(New)、老生代(Old)、永久代(Perm);
- 新生代New:新建的对象都存放这里
- 老生代Old:存放从新生代New中迁移过来的生命周期较久的对象。新生代New和老生代Old共同组成了堆内存。
- 永久代Perm:是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。
【jvm内存占用过高分析】
1.top >> 观察占用cpu或者MEN(内存)使用情况最高的进程,记录PID;
2.top -p PID >> 观察该PID对应进程的占用情况,
shift + h >> 开启线程显示,观察cpu/Men占用较高的线程有哪些,记录对应TID;
3.jstack PID > jstack.txt >> 查看该线程的堆栈信息
4.printf "%x\n" TID >> 将线程对应PID转为 16进制数(TID16);
5.cat jstack.txt | grep TID16 >> 查看当前占用内存高的线程具体在做什么操作,分析原因
6.jmap -histo:live PID >> 查看当前堆内存中存在哪些存活对象
7. jstat -gcutil PID 1000 3 >> 查看gc情况