【JVM】JVM浅尝辄止
程序计数器:
可以看做当前线程所执行的字节码的行号指示器。字节码解释器通过改变这个值来选取下一条需要执行的字节码指令。
每条线程都有一个独立的程序计数器,各条线程之间都需要有一个独立的程序计数器,各条线程之间互不影响,独立存储。这类内存区域称为“线程私有的”
java虚拟机栈:
线程私有的, 生命周期与线程相同。 栈中局部变量表存放了编译器可知的各种基本数据类型(boolean byte char short int float long double)和对象引用(reference 类型, 不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或其他与此对象相关的位置)和return Address 类型(指向了一条字节码指令的地址)
规定了两种异常:
1.线程请求栈深度 大于虚拟机所允许的深度,抛出 stackOverflowError
2.如果可以动态扩展,扩展时无法申请到足够的内存,抛出OutOfMemorryError
本地方法栈:
与虚拟机栈相似,区别:虚拟机栈为java方法服务, 本地方法栈为Native方法服务。 有的虚拟机把这两部分合二为一。
异常同上
java堆(新生代,老年代):
对多数应用来说,heap 是虚拟机所管理的内存中最大的一块。(所有线程共享的内存区域,虚拟机启动时创建。此内存区域的唯一目的是存放对象实例)是java垃圾收集器管理的主要区域。
可以处于物理上不连续的内存空间,只要逻辑上连续即可,如同磁盘内存空间。
方法区(不等价于永久代)别名:Non-heap
(线程共享的)存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等。
Hotspot 中选择用GC永久代来实现方法区,其他虚拟机不存在永久代的概念
不需连续内存,可固定可扩展大小,还可不实现垃圾回收机制。 本区域内存回收时的目标主要是:针对常量池的回收和对类型的类型的卸载
方法区无法满足内存分配需求时,抛出 outofMemoryError 异常
方法区—— 运行时常量池
class文件中出来有类的版本、字段、方法、接口等描述信息以外,还有一项信息是常量池(constant Pool Table)用于存放编译器生成的各种字面量和符号引用,这部分将在类加载后进入方法区的运行时常量池中存放。
java语言不要求变量一定在编译期产生,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的是String类的intern()方法
OutOfMemoryError 异常