记录
| 日期 | 说明 |
|---|---|
| 2023/1/1 | 首次创建 |
总纲
关于虚拟机的一些概念
内存分区
- 程序计数器:当前线程锁执行的字节码的行号指示器。每条线程都有一个独立且私有的计数器。唯一一个不会产生内存溢出的区域
- 虚拟机栈
- 描述Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,栈是用于支持虚拟机进行方法调用和方法执行的数据结构
- 战阵用于存储局部变量表,操作数栈,动态链接,方法返回地址和一些额外的附加信息
- 可以抛出两种异常:StackOverflowError(线程请求的栈过深),OutOfMemoryError(动态扩展栈时内存不足)
- 本地方法栈:类似于虚拟机栈,只是虚拟机栈为虚拟机执行Java方法服务,本地方法栈为使用到的本地操作系统(native)方法服务
- Java堆:内存中最大的一块,所有线程共享,垃圾回收的主要区域。物理上可以不连续,逻辑上必须连续。可以抛出OutOfMemoryError异常
- 方法区:线程共享的区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、即使编辑器编码后的代码等数据。允许该区域可以选择不垃圾回收。运行时常量池时方法区的一部分。可以抛出OutOfMemoryError异常
- 运行时常量池
内存溢出和泄漏
- 内存溢出:是指程序所需要的内存超出了系统所能分配的内存的上限
- 内存泄漏:是指备份呢配的对象可到但无用
类初始化
- 场景
- 遇到new、getStatic、putStatic、invokeStatic会触发其初始化
- reflect包的方法对类进行反射调用时会触发
- 子类初始化时,会触发父类的初始化
- 虚拟机启动时,会触发用户指定的要执行的主类
泛型
- <T>:泛型,<T extends Number>表示T必须时Number的子类
- ?:类型通配符,<? super Number>表示?必须是Number的父类
- extends决定上限,super决定下限