JVM_01_程序计数器 虚拟机栈

 

1.什么是 JVM ?

定义:

Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)

好处:

  • 一次编写,到处运行

  • 自动内存管理,垃圾回收功能

  • 数组下标越界检查

 2.常见的JVM

JVM_01_程序计数器 虚拟机栈_第1张图片

 注意:我们所使用的是HotSpot

1、程序计数器(寄存器)

  1. 作用程序计数器用于保存JVM中下一条所要执行的指令的地址JVM_01_程序计数器 虚拟机栈_第2张图片

         注意:程序计数器是存储在寄存器(读取非常快)中的因为程序计数器要经常做读操作

      2.特点1:是线程私有的(为了让cpu来回切换的时候记住程序进行的位置)

         特点2:该区域不会存在内存益出(java虚拟机内部定义)

yH5BAAAAAAALAAAAAAOAA4AAAIMhI+py+0Po5y02qsKADs=

2.虚拟机栈

JVM_01_程序计数器 虚拟机栈_第3张图片

 定义

  • 每个线程运行时所需要的内存,称为虚拟机栈
  • 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

问题辨析

1. 垃圾回收是否涉及栈内存?

  • 不需要。因为虚拟机栈中是由一个个栈帧组成的,在方法执行完毕后,对应的栈帧就会被弹出栈。所以无需通过垃圾回收机制去回收内存。

2. 栈内存分配越大越好吗?

  • 不对,应为总内存是一定的栈的内存分配越多,线程数分配越少

3. 方法内的局部变量是否线程安全?

  • 如果方法内局部变量没有逃离方法的作用访问,它是线程安全的
  • 如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

 2.2栈内存溢出

  • 栈帧过多导致栈内存溢出(递归)
  • 栈帧过大导致栈内存溢出(情况很少见)

 3.本地方法栈

 一些带有native 关键字的方法就是需要JAVA去调用本地的C或者C++方法,因为JAVA有时候没法直接和操作系统底层交互,所以需要用到本地方法!JVM_01_程序计数器 虚拟机栈_第4张图片

 例子:

 JVM_01_程序计数器 虚拟机栈_第5张图片

 JVM_01_程序计数器 虚拟机栈_第6张图片

 

 

你可能感兴趣的:(JVM学习专栏,jvm,java,开发语言)