Jvm知识点整理

JVM是什么

Java二进制代码的运行环境

JVM有哪些部分组成

类加载子系统

用于装载字节码文件,JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来

类加载器有哪些

  1. 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/jre/lib目录下的库
  2. 扩展类加载器(ExtClassLoader):主要加载JAVA_HOME/jre/lib/ext目录中的类
  3. 应用类加载器(AppClassLoader):用于加载classPath下的类
  4. 自定义类加载器(CustomizeClassLoader):自定义类继承ClassLoader,实现自定义类加载规则。

双亲委派模型

  1.         当一个类加载器需要加载一个类时,它首先会检查自己的缓存,看是否已经加载过该类。
    1.         如果没有加载过,它会将加载请求委派给父类加载器。
    2.         父类加载器会重复上述步骤,直到到达最顶层的引导类加载器。
    3.        如果引导类加载器也无法加载该类,那么会依次由子类加载器尝试加载。
    4.        如果所有的类加载器都无法加载该类,那么就会抛出ClassNotFoundException异常。

类加载的执行过程

  1. 加载:查找和导入class文件
  2. 验证:保证加载类的准确性
  3. 准备:为类变量分配内存并设置类变量初始值
  4. 解析:把类中的符号引用转换为直接引用
  5. 初始化:对类的静态变量,静态代码块执行初始化操作
  6. 使用:JVM 开始从入口方法开始执行用户的程序代码
  7. 卸载:当用户程序代码执行完毕后,JVM便开始销毁创建的Class对象

运行时数据区

程序计数器

存储当前线程所执行的字节码的行号指示器的寄存器

  存储对象实例和数组的主要内存区域

堆的结构
  1. 堆被划分为多个不同的区域,主要包括新生代(Young Generation)和老年代(Old Generation)。新生代又被进一步细分为Eden区、From Survivor区(也被称为S0区)和To Survivor区(也被称为S1区)。
  2. 在JDK 8及以后的版本中,永久代(PermGen)被元空间(Metaspace)所取代,但元空间并不属于堆内存,而是属于方法区(Method Area)的一部分
堆的特性
  1. 线程共享:堆内存是所有线程共享的,这意味着多个线程可以访问和操作堆中的对象。
  2. 垃圾回收的主要目标:堆是垃圾收集器(GC)管理的主要目标,当堆中的对象不再被引用时,垃圾收集器会将其标记为可回收对象,并最终回收内存。
  3. 动态内存分配:堆内存用于管理动态生命周期的内存区域,通过自动内存管理机制(如垃圾回收)来管理。
  4. 扩展性:堆一般实现成可扩展内存大小,可以使用-Xms与-Xmx参数来控制堆的最小与最大内存。

虚拟机栈

  1. Java方法执行的内存模型
  2. 存储了局部变量,部分执行结果,方法调用,返回值
  3. 默认的栈空间大小为1024K 栈帧过大 会导致线程数变少

本地方法栈

方法区\元空间

  1. 存储JVM加载的类的相关信息 包括类的名称 方法信息 字段信息常量池 静态变量 JIT编译后的代码
  2. 各个线程共享的内存区域
  3. 方法区在实际内存空间上不是连续的
  4. 方法区的大小可以选择固定大小或者扩展,取决于JVM的配置和运行时需要
  5. 演变历史JDK 1.7及以前:方法区通常被称为永久代(PermGen),是HotSpot虚拟机特有的概念。在这个时期,字符串常量池和静态变量都存放在永久代中。JDK 1.7:将字符串常量池从永久代中移出,单独存放在堆中。JDK 1.8及以后:完全将方法区移出永久代,改用元空间(Metaspace)实现方法区。元空间不再放在JVM内存中,而是放在本地内存中。类静态变量也随着Class类对象存放在堆中

执行引擎

主要任务是将字节码指令解释或编译为对应平台上的本地机器指令

  1. 解释器
    JVM启动时,根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行  
  2. 编译器
    虚拟机将源代码直接编译成和本地机器平台相关的机器语言。JIT编译器的主要目标是提高执行效率,通过编译热点代码(频繁调用的方法或循环次数多的循环体)为机器码,从而提升程序的性能
  3. 执行模式
    Java虚拟机通常将解释执行与编译执行二者结合起来进行。当程序启动时,解释器首先发挥作用,立即执行代码,省去编译时间。随着时间的推移,编译器将更多代码编译为本地代码,提高执行效率

垃圾回收

  1. 当一个对象没有任何引用指向它时,这个对象就被视为“垃圾”
  2. 用什么可以定位“垃圾”呢?
  3. 引用计数法 与 可达性分析法(GCRoot)可以定位

垃圾回收算法

  1. 标记清除算法 1.GCRoot得出垃圾进行标记 2.对标记可回收的内容进行回收
  2. 标记整理算法 解决了标记清除算法的碎片化的问题 将存活对象移动到内存的另一端,效率低
  3. 复制算法 将内存一分为二,将使用的对象移向另一个内存,然后将该内存清空,交换内存角色,无碎片,内存使用率低

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值