Java-虚拟机

132 阅读2分钟

记录

日期说明
2023/1/1首次创建

总纲

关于虚拟机的一些概念

内存分区

  1. 程序计数器:当前线程锁执行的字节码的行号指示器。每条线程都有一个独立且私有的计数器。唯一一个不会产生内存溢出的区域
  2. 虚拟机栈
  • 描述Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,栈是用于支持虚拟机进行方法调用和方法执行的数据结构
  • 战阵用于存储局部变量表,操作数栈,动态链接,方法返回地址和一些额外的附加信息
  • 可以抛出两种异常:StackOverflowError(线程请求的栈过深),OutOfMemoryError(动态扩展栈时内存不足)
  1. 本地方法栈:类似于虚拟机栈,只是虚拟机栈为虚拟机执行Java方法服务,本地方法栈为使用到的本地操作系统(native)方法服务
  2. Java堆:内存中最大的一块,所有线程共享,垃圾回收的主要区域。物理上可以不连续,逻辑上必须连续。可以抛出OutOfMemoryError异常
  3. 方法区:线程共享的区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、即使编辑器编码后的代码等数据。允许该区域可以选择不垃圾回收。运行时常量池时方法区的一部分。可以抛出OutOfMemoryError异常
  4. 运行时常量池

内存溢出和泄漏

  1. 内存溢出:是指程序所需要的内存超出了系统所能分配的内存的上限
  2. 内存泄漏:是指备份呢配的对象可到但无用

类初始化

  1. 场景
  • 遇到new、getStatic、putStatic、invokeStatic会触发其初始化
  • reflect包的方法对类进行反射调用时会触发
  • 子类初始化时,会触发父类的初始化
  • 虚拟机启动时,会触发用户指定的要执行的主类

泛型

  1. <T>:泛型,<T extends Number>表示T必须时Number的子类
  2. ?:类型通配符,<? super Number>表示?必须是Number的父类
  3. extends决定上限,super决定下限