首页 > 编程语言 >Java虚拟机(JVM)深入解析

Java虚拟机(JVM)深入解析

时间:2025-01-18 12:57:17浏览次数:3  
标签:Java 虚拟机 线程 内存 JVM 加载

Java虚拟机(JVM)是Java程序运行的核心环境,它负责将Java字节码转换为机器码并执行。本文将深入解析JVM的运行时数据区、类加载机制以及执行引擎,帮助读者更好地理解JVM的工作原理。

一、运行时数据区(Runtime Data Area)

运行时数据区是JVM在执行Java程序时分配的内存区域,主要包括以下几个部分:

1. 方法区(Method Area)

方法区用于存储类信息、常量、静态变量以及即时编译器编译后的代码。它是线程共享的区域,所有线程共享方法区内存。

  • JDK 8之前:HotSpot使用永久代(PermGen)来实现方法区。

  • JDK 8及以后:永久代被移除,改为使用元空间(Metaspace),元空间使用本地内存(Native Memory)来提高性能和避免OOM错误。

2. 堆(Heap)

堆是JVM中最大的内存区域,用于存储所有线程共享的对象和数组,是垃圾回收的主要区域。

  • 新生代(Eden):新对象最初会被分配到Eden区,Eden区较大,频繁进行垃圾回收。

  • 幸存区(Survivor):两个Survivor区S0和S1交替使用,新对象在经历一次垃圾回收后会存放到其中一个Survivor区,进一步存活的对象会移动到另一个Survivor区,最终晋升到老年代。

  • 老年代:长生命周期对象经过多次垃圾回收后会被迁移到老年代,Major GC在老年代进行,频率较低但耗时长。

3. 虚拟机栈(JVM Stack)

虚拟机栈是线程私有的,每个线程创建时都会创建一个虚拟机栈。虚拟机栈用于存储局部变量表、操作栈、方法出口等信息。

  • 栈帧(Stack Frame):每当一个方法被调用时,虚拟机会在栈中创建一个新的栈帧,该栈帧用于存储方法的局部变量表、操作栈、方法出口等信息。方法执行完后,栈帧会被弹出,释放内存。

4. 本地方法栈(Native Method Stack)

本地方法栈也是线程私有的,用于为本地方法服务。它使用JNI(Java Native Interface)调用的本地代码在此区域分配内存。

5. 程序计数器(Program Counter Register)

程序计数器是线程私有的,每个线程都有一个独立的程序计数器。它用于记录当前字节码行号,是唯一不会出现OOM的内存区域。

二、类加载机制(Class Loading)

类加载机制是JVM将类信息加载到内存中的过程,主要包括以下几个阶段:

1. 加载(Loading)

加载阶段将类的二进制数据读入内存,并创建一个Class对象。

  • 启动类加载器(Bootstrap ClassLoader):主要负责加载<JAVA_HOME>\lib目录或被-Xbootclasspath指定的路径中的类库。

  • 拓展类加载器(Extension ClassLoader):主要负责加载<JAVA_HOME>\lib\ext目录下的类库。

  • 应用类加载器(Application ClassLoader):主要负责加载用户类路径(classpath)上的类库。

2. 链接(Linking)

链接阶段包括验证、准备和解析三个步骤。

  • 验证(Verification):验证加载的类信息是否符合JVM规范。

  • 准备(Preparation):为类的静态变量分配内存,并设置初始值。

  • 解析(Resolution):将符号引用转换为直接引用。

3. 初始化(Initialization)

初始化阶段执行类的静态初始化块,为静态变量赋初值。

三、执行引擎(Execution Engine)

执行引擎负责将字节码转换为机器指令并执行,主要包括以下两个部分:

1. 解释器(Interpreter)

解释器逐行解释字节码并执行,适用于程序首次运行时。

2. 即时编译器(JIT Compiler)

即时编译器将热点代码(频繁执行的代码)编译为机器码执行,以提升效率。JIT还可能会发生指令重排序,一般用volatile关键字解决该问题。

编译类型

  • C1编译器(Client Compiler):用于快速启动的轻量级优化,适用于客户端应用程序。

  • C2编译器(Server Compiler):用于长时间运行的重度优化,适用于服务器端应用程序。

四、本地方法接口(JNI)

本地方法接口(JNI)允许Java调用非Java代码(如C/C++),便于与操作系统或其他本地库进行交互。JNI提供跨语言调用能力,使Java程序可以访问操作系统级别的功能或高性能库。

标签:Java,虚拟机,线程,内存,JVM,加载
From: https://blog.csdn.net/m0_73355421/article/details/145225732

相关文章

  • JAVA多线程
           一多线程基础知识相关概念进程(Process):进程是程序的基本执行实体。进程是操作系统分配资源的基本单位。每个进程都有自己的内存空间、代码段、数据段等。进程之间相互独立,一个进程的崩溃不会影响其他进程。进程是程序的基本执行实体。线程(Thread): ......
  • Java集合小结
    、这一节先快速回顾所学集合知识(抓要点,不深追底层代码),下一节复习集合的八股文狠狠学java,猛猛赚他一笔!一集合体系图集合分为单列集合和双列集合,先来看集合体系图二单列集合2.1List之三种遍历方式 iterator迭代器遍历(idea快捷键itit)Listlist=newArrayList();It......
  • JAVA:根据经纬度获取夏令时以及偏移(免费)
    注:国内根据经纬度来获取夏令时区以及时区偏移量的api的服务有百度和谷歌,但是谷歌的获取夏令时和时区的api在国内服务其上部署时访问不了的(看过有在服务器上安装代理的,但是操作有点复杂。好吧,其实是我看着步骤太多,感觉太麻烦所以直接pass了)。所以目前在我获取到的信息中,只有百......
  • JAVA安全之JDK8u141版本绕过研究
    基本介绍从JDK8u141开始JEP290中针对RegistryImpl_Skel#dispatch中bind、unbind、rebind操作增加了checkAccess检查,此项检查只允许来源为本地,下面以bind为例:publicvoiddispatch(Remotevar1,RemoteCallvar2,intvar3,longvar4)throwsException{if(var4!=4......
  • Java初学者笔记-04、异常与泛型
    异常异常代表程序出现的问题。Error错误和Exception异常。RuntimeException运行时异常。编译时异常,提醒程序员这里的程序很容易出错。异常的基础处理抛出给上层调用者。使用try-catch处理。异常的处理方案底层异常抛出,最外层捕获异常记录异常并响应合适信息。(少见)最......
  • leetcode——接雨水(java)
    给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨水)。示例......
  • 【2024年华为OD机试】 (A卷,200分)- 硬件产品销售方案(Java & JS & Python&C/C++)
    一、问题描述题目描述某公司目前推出了AI开发者套件,AI加速卡,AI加速模块,AI服务器,智能边缘多种硬件产品,每种产品包含若干个型号。现某合作厂商要采购金额为amount元的硬件产品搭建自己的AI基座。例如当前库存有N种产品,每种产品的库存量充足,给定每种产品的价格,记为price(不......
  • 【2024年华为OD机试】 (B卷,100分)- 流水线(Java & JS & Python&C/C++)
    一、问题描述题目描述一个工厂有m条流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。现给定流水线个数m,需要完成的作业数n,每个作业的处理时间分别为t1,t2,...,tn。请你编程计算处理完所有作业的耗时为多......
  • 股票API接口使用python、JAVA等多种语言实例代码演示免费获取实时数据、历史数据、CDM
    ​最新整理的股票API接口,下方所有接口链接均可直接点击验证,查看返回的数据。沪深两市股票列表股票API接口链接(可点击验证):https://api.mairui.club/hslt/list/LICENCE-66D8-9F96-0C7F0FBCD073【实时数据接口】沪深两市实时交易数据接口股票API接口链接(可点击验证):https:......
  • leetcode——令牌放置(java)
    你的初始能量为power,初始分数为0,只有一包令牌以整数数组tokens给出。其中tokens[i]是第i个令牌的值(下标从0开始)。你的目标是通过有策略地使用这些令牌以最大化总分数。在一次行动中,你可以用两种方式中的一种来使用一个未被使用的令牌(但不是对同一个令牌使......