JVM笔记
一、内存结构
1.程序计数器
- 作用:记住下一条jvm指令的执行地址
- 特点:是线程私有的,不会存在内存溢出。
2.虚拟机栈
- 每个线程运行时所需要的内存,称为虚拟机栈
- 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存(局部变量,函数传参)
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
- 栈内存溢出(-Xss设置栈内存大小 )
- 栈帧过多导致栈内存溢出
- 栈帧过大导致栈内存溢出
- 线程运行诊断
- 案例一:cpu占用过多
- 定位:用top定位哪个线程对cpu的占用过高
- ps H -eo pid,tid,%cpu | grep 进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高)
- jstack 进程id:可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行号。
- 案例二:代码运行很久
- 案例一:cpu占用过多
3.本地方法栈
本地方法栈为虚拟机使用到的本地方法服务。
4.堆
4.1 定义
- 通过new关键字,创建对象都会使用堆内存
- 特点
- 它是线程共享的,堆中对象都需要考虑线程安全问题
- 有垃圾回收机制
4.2 堆内存溢出(-Xmx)
4.3 堆内存诊断
- jps工具
- jmap工具
查看堆内存占用情况 jmap -heap 进程id - jconsole工具
5. 方法区
- 各个线程共享区域
- 在JVM启动时被创建 ,并且物理内存可以不连续
- 大小可以固定也可以是动态扩展的
- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类会出现OOM错误
- 会随着JVM的关闭而释放这一区域的内存
方法区的演进:
本文详细介绍了JVM的内存结构,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。讨论了线程私有的内存区域如栈和程序计数器,以及线程共享的堆和方法区。文章还提到了内存溢出的问题,如栈内存溢出(-Xss)和堆内存溢出(-Xmx),并提供了诊断工具如jstack、jmap和jconsole的使用案例。
5万+

被折叠的 条评论
为什么被折叠?



