【基础知识】_JVM笔记

JVM

定义

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

优点

  • 一次编写,到处运行
  • 自动内存管理,垃圾回收功能
  • 数组下标越界越界检查
  • 多态

比较

jvm比较

编译工具:javac、javap等

应用服务器:tomcat等


学习JVM的作用

  • 应付面试
  • 理解底层的实现原理(自动生成、foreach、动态代理)
  • 中高级程序员的必备技能(解决内存溢出、响应过慢等问题)

常见的JVM

jvm也可以说是一种标准,很多公司都开发了不同的jvm

常见的jvm

以HotSpot为主


学习路线

学习路线


CSDN重要知识点

类的加载

类的加载过程

loading

类的加载指的是将类的.class文件中的二进制数据读取到内存中,存放在运行时数据区的方法区中,并创建一个大的Java.lang.Class对象,用来封装方法区内的数据结构。(会创建类的Class对象)

linking

  • 验证:确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性。
  • 准备:为类变量分配内存并且设置该类变量的默认初始化值,但不会为实例变量分配初始化。
1
2
3
4
5
6
7
8
9
10
11
12
13
java中的变量介绍:成员变量和局部变量

成员变量包括:实例变量和类变量:
- 修饰符:类变量就是类中以static修饰的成员变量,实例变量就是没有static修饰的成员变量。
- 访问:实例变量是一定要用过类的实例化对象来访问的,而类变量可以通过实例化对象来访问也可以直接通过类对象来访问。(这里所说的类对象就是class对象)
- 生存周期:实例变量与类的实例化对象共存亡,类变量与类的Class对象共存亡。
- 变量修改:多个类的实例化对象分别指向不同的堆内存位置,每个实例化对象中的实例变量指向的是不同的内存位置,修改实例变量就是修改相关的实例化对象中的某个内存数据;类变量是多个实例化对象中的变量指向同一个方法区内存,每一个实例化对象都可以调用修改该同一个类变量指向的方法区内存数据,该数据的值即为最后一次修改的值。

局部变量包括:
- 形参(函数形参)
- 方法局部变量(在方法内定义)
- 代码块局部变量(在代码块内定义)
- 解析:将常量池中的符号引号转换为直接引用的过程。

initialization

  • 为类变量赋予正确的初始化值。
  • 类的初始化阶段就是执行类构造器方法()的过程。(构造器方法主要用于执行静态变量赋值和static{}代码块运行)
  • 如果该类有父类,Jvm会保证子类的()执行前,父类的()已经执行完成。

双亲委派机制

  • 原理:如果一个类加载器收到了类加载请求,它并不会自己直接去加载,而是把这个亲求委托给父类加载器去执行,如果父类记载器还有父类,则进一步向上委托,依次递归,请求最终到达顶层的启动类加载器。如果父类加载器可以完成类加载任务,就成功返回,倘如父类加载器无法完成次加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
  • 优势:避免类的重复加载;保护程序安全,防止核心API被随意篡改。

主动使用和被动使用

java程序对类的主动使用:

  • 创建类的实例化对象
  • 访问某个类或者接口的静态变量,或者对该静态变量赋值
  • 调用类的静态方法
  • 反射加载类或者类中属性和方法
  • 初始化类的子类
  • 被标明为启动类的类
  • 动态语言支持相关类

除了以上七种情况,其他使用java类的方式都被看做是对类的被动使用,都不会导致类的加载和初始化。

栈帧组成部分

  • 局部变量表Local Variables(用于存储该栈帧的方法参数和定义在方法体内的局部变量)
  • 操作数栈Operand Stack
  • 动态链接Dynamic Linking(或指向运行时常量池的方法引用)
  • 方法返回地址Return Address

方法区存放内容

静态变量+常量+类信息+运行时常量池