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 内存结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程