欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM 内存结构

程序员文章站 2022-04-18 15:54:41
...

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 jvm