八股---7.JVM

[复制链接]
发表于 2025-6-11 00:11:49 | 显示全部楼层 |阅读模式
1. JVM组成

1.1 JVM由哪些部分组成?运行流程?(讲一下JVM)⭐️

难易水平:☆☆☆        出现频率:☆☆☆☆
   
      
  • Java Virtual Machine:Java 虚拟机,Java程序的运行环境(java二进制字节码的运行环境)  
  • 利益:一次编写,到处运行;主动内存管理,垃圾回收机制  
  • 程序运行之前,需要先通过编译器将 Java 源代码文件编译成 Java 字节码文件;
      
  • 程序运行时,JVM 会对字节码文件进行逐行表明,翻译成呆板码指令,并交给对应的操纵体系去执行。

  

   
      
  • 利益:一次编写,到处运行;主动内存管理,垃圾回收机制
      
  • JVM  <---> 操纵体系(windows、linux)<---> 计算机硬件(cpu、内存条)
    java跨平台是因JVM屏蔽了操纵体系的差异,真正运行代码的不是操纵体系

  

   JVM 主要由四个部分组成: 运行流程:
Java 编译器(javac)将 Java 代码转换为字节码(.class 文件)
  1. 类加载器(ClassLoader)
  
      
  • 负责加载 .class 文件,将 Java 字节码加载到内存中,并交给 JVM 执行
  2. 运行时数据区(Runtime Data Area)
  
      
  • 管理JVM使用的内存。主要包括:
      
  • 方法区(Method Area):存储类的元数据、常量、静态变量等。
      
  • 堆(Heap):存储所有对象和数组,垃圾回收器主要回收堆中的对象。
      
  • 栈(Stack):每个线程都有一个栈,用于存储局部变量、方法调用等信息。
      
  • 程序计数器(PC Register):每个线程有一个程序计数器,指示当前线程正在执行的字节码指令地点。
      
  • 本地方法栈(Native Method Stack):支持本地方法的调用(通过 JNI)。
    此中方法区和堆是线程共享的,虚拟机栈、本地方法栈和程序计数器是线程私有的。

  3. 执行引擎(Execution Engine)
  
      
  • 负责执行字节码,包含:  
  • 表明器:逐条表明执行字节码。
      
  • JIT 编译器:将热点代码编译为呆板码,提高执行效率。
      
  • 垃圾回收器:回收堆中的不再使用的对象,开释内存。

  4. 本地库接口(Native Method Library)
  
      
  • 答应 Java 程序通过 java本地接口JNI(Java Native Interface)调用本地方法(如 C/C++ 编写的代码),与底层体系或硬件交互。
  1.2 什么是程序计数器?

难易水平:☆☆☆        出现频率:☆☆☆☆
   
      
  • 程序计数器:线程私有的,每个线程一份,内部保存字节码的行号。用于记录正在执行的字节码指令的地点。  
  • 每个线程都有本身的程序计数器,确保线程切换时可以或许继续执行未完成的任务。
  1.3 你能给我详细的介绍Java堆吗?⭐️⭐️

难易水平:☆☆☆        出现频率:☆☆☆☆
   
      
  • Java堆是 JVM 中用于存储所有对象和数组的内存区域。线程共享的区域。当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError非常。
    它被分为:
  
      
  • 年轻代(存储新创建的对象),被划分为三部分:
    Eden区:大多数新对象的分配区域;
    S0 和 S1(两个巨细严格雷同的Survivor区):Eden 空间颠末 GC 后存活下来的对象会被移到此中一个 Survivor 区域;  
  • 老年代:在颠末频频垃圾网络后,任然存活于Survivor的对象将被移动到老年代区间。  
  • 永久代:JDK 7 及之前,JVM 的方法区(也称永久代),保存的类信息、静态变量、常量、编译后的代码;
    元空间:JDK 8 及之后,永久代被 Metaspace(元空间)取代,移除了永久代,把数据存储到了本地内存的元空间中,且其巨细不再受 JVM 堆的限定,防止内存溢出。
  

1.4 什么是虚拟机栈

难易水平:☆☆☆        出现频率:☆☆☆☆
   Java Virtual machine Stacks (java 虚拟机栈)
  
      
  • 每个线程在 JVM 中私有的一块内存区域,称为虚拟机栈,先进后出,用于存储方法的局部变量和方法调用信息;
      
  • 每个栈由多个栈帧(frame)组成,当线程执行方法时,为该方法分配一个栈帧(Stack Frame);
      
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的谁人方法;

  

   垃圾回收是否涉及栈内存?

  
      
  • 垃圾回收主要指就是堆内存,  
  • 栈内存中不会有垃圾回收的概念,因为栈内存是由 JVM 主动管理的,方法执行完成时,栈帧弹栈,内存就会开释;
    栈内存分配越大越好吗?

  
      
  • 未必,默认的栈内存通常为1024k;  
  • 栈内存过大会导致线程数变少,例如,呆板总内存为512m,目前能活动的线程数则为512个,假如把栈内存改为2048k,那么能活动的线程数减半;
    方法内的局部变量是否线程安全?

  
      
  • 方法内的局部变量 本身是线程安全的,因为它们存储在每个线程独立的栈中,不会被其他线程共享。  
  • 但假如局部变量是引用类型,而且该引用指向的对象逃离了方法作用范围(例如被返回或转达到外部),则需要思量该对象的线程安全性。
    假如

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表