JVM 内存结构-程序计数器,虚拟机栈

程序计数器

1.1定义

  • 作用,是用于记住下一条jvm指令的执行地址

  • 特点

    • 线程私有的,就是每个线程都有自己的程序计数器
    • 规定不会产生内存溢出
  • 本质,程序计数器的本质就是一个寄存器,在jvm的二进制码转换成机器码的过程中,发挥作用。

虚拟机栈

  • 定义

    • Java Virtual Machine Stacks (Java 虚拟机栈)
    • 每个线程都只能有一个虚拟机栈(线程私有),对应着当前执行的那个方法
  • 作用

    • 线程每当执行一个方法,就压入虚拟机栈中;每当执行完一个方法,就从中弹出。
  • 思考

    • 方法内的局部变量是否线程安全?
      • 如果方法内局部变量,没有逃离方法的作用访问,它是线程安全的
      • 如果是局部变量引用了对象,并且逃离方法的作用范围,需要考虑线程安全。
      • 核心就是是否出现,多线程访问的情况出现。
  • 栈内存的溢出

    • 栈帧过多导致内存溢出(经常)

      • 比如递归没有很好的规定结束条件时,会出现过多而导致溢出的问题。
    • 栈帧过大导致栈的内存溢出

  • 线程运行时诊断

    • 用top定位那个进程出现(比如cpu占用过高)

    • ps H -eo pid,tid,% cpu | grep 进程id

    • jstack 进程id

      • 可以根据线程的id找到有问题的线程,进一步定位到问题代码的源码行号

猜你喜欢

转载自blog.csdn.net/qq_45788043/article/details/112203248
今日推荐