JVM 内存结构
2021/7/9 7:06:12
本文主要是介绍JVM 内存结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java文件转换成class
一. 程序计数器
1.1定义
Program Counter Register 程序计数器(寄存器)
基本作用:用于记住下一条jvm指令的执行地址
特点:
- 线程是私有: 程序计数器是属与自己线程的
- 不会存在内存溢出
当解释器执行完一条指令后,会去程序计数器中查找下一条指令的地址。
当解释器执行下一条指令的时候,程序计数器又会去记录新的下一条指令的地址
在物理上,程序计数器是通过一个叫寄存器实现的,
寄存器是整个cpu组件里,读取速度最快的一个单元,
二.虚拟机栈
Java Virtual Machine Stacks (Java 虚拟机栈)
2.1 定义
- 定义:每个线程运行需要的内存空间,成为虚拟机栈,
- 每个栈帧(Frame)组成,对应着每次方法调用时所占的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
问题1: 垃圾回收是否涉及栈内存
答: 不需要,栈弹出后就被释放掉了,不需要垃圾回收来管理栈内存
问题2: 栈内存分配越大越好吗?
答: 不是栈内存越大,只是可以进行很多次的内存调用,并不会提高运行效率,而且栈内存越大,最大线程数据则会相应的减少。一般采用系统默认的大小即可,除windowsw外,其他系统默认为1024k, windows则看虚拟内存
问题3: 方法内的局部变量是否线程安全
答: 如果方法內部变量没有逃离方法作用的范围,他是线程安全的
如果是局部变量引用了对象,并逃离方法的作用方法,需要考虑线程安全
2.2 栈内存溢出
栈帧过多,造成栈内存溢出
栈帧过大,
2.3 线程运行诊断
案例1: cpu 占用过高
定位
- 用top定位哪个经常cpu占用过高
- ps H eo pid, tid, %cpu|grep 进程id (用ps命令进一步定位是哪给线程引起的cpu占用过高)
- jstack进程id
-
可以根据线程id,找到有问题的线程,进一步定位代码
案例2: 程序运行很长时间没有结果
- jstack进程id
三.本地方法栈
四.堆
五.方法区
这篇关于JVM 内存结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27消息中间件底层原理资料详解
- 2024-11-27RocketMQ底层原理资料详解:新手入门教程
- 2024-11-27MQ底层原理资料详解:新手入门教程
- 2024-11-27MQ项目开发资料入门教程
- 2024-11-27RocketMQ源码资料详解:新手入门教程
- 2024-11-27本地多文件上传简易教程
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器