JVM那些事儿之执行原理(二)

4、深入理解JVM的垃圾回收原理 我们需要明白,内存资源是有限的。我们在JVM的Java堆内存中创建的对象,实际上也会占用JVM的内存资源,比如“UserManager”实例对象,它会占用500字节的内存。如果一个实例对象没有被任何方法的局部变量引用,也没有被任何类的静态变量(包括常量等)引用,那么垃圾回收线程会将其视为不再需要的“UserManager”实例对象,并将其从内存中清除,释放其所占用的内存资源。总结来说,JVM中的“垃圾”指的是无用的对象,而“垃圾回收”则是JVM自动清理这些无用对象,释放内存资源的机制。 阅读详情

JVM那些事儿之执行原理(二)

案例

当一个java程序员把第一个helloworld程序敲出来后,它是怎么在console里打印出“helloworld”的?

编写Java程序

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(“hello world!”);
    }
}

通过javac将.java文件编译成.class字节码文件

> javac HelloWorld.java

使用 javap查看.class字节码文件

> javap -verbose HelloWorld.class

此时可以看到这样一个字符串。这个字符串就是编译后的内容

Classfile /jvmtest/HelloWorld.class
  Last modified 2017-8-12; size 426 bytes
  MD5 checksum 4efac412ef483c8a3fe7489c87d15c8c
  Compiled from "HelloWorld.java"
public class HelloWorld
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #18            // hello world!
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // HelloWorld
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               HelloWorld.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Class              #23            // java/lang/System
  #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #18 = Utf8               hello world!
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               HelloWorld
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public HelloWorld();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String hello world!
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 3: 0
        line 4: 8
}
SourceFile: "HelloWorld.java"

执行.class文件

> java HelloWorld

此时控制台会打印出

> hello world!

执行原理

如何生成.class文件咱们先不讲,反正文件是有了。咱们就来讲讲拿到这个文件后,JVM在执行这个文件时的过程。

先说明一下JVM到底是什么语言开发的?Java的解释器肯定不是Java开发了,其实,JVM主要是C/C++开发的,里面还有很多汇编语言。我们在执行.class文件时采用的方式是解释执行。

我们先说一个最精简的原理。
前面我们已经看到.class文件里面,会分成不同的方法。JVM在解释的时候,先把内存什么的规划好(具体怎么规划的后面讲),然后大概看一下有哪些方法,把这些方法都转换成机器码保存起来。当JVM自检结束后,将会先从main方法开始执行。

具体执行依赖的是C/C++的函数指针技术,这个技术让JVM可以直接执行一段机器码,而前面我们已经把Java的方法都转换成机器码保存起来了,这时候利用这个技术直接执行机器码就好了。

大家注意了,前面说的这段算是JVM最精彩的部分,为什么呢?刚开始的JVM可不是这样的,所以Java刚出来的时候,由于执行速度慢,被大家诟病,后来改了这个方案后,再加上将字节码转换成机器码的过程不断改进、优化,现在的Java程序在某些方面已经达到甚至超越了C/C++的速度。

以后再有人跟你说java速度慢,你就可以怼回去了。

体系结构

  • 类装载子系统

    负责把类从文件系统中装入内存

  • GC子系统

    垃圾收集器的主要工作室自动回收不再运行的程序引用对象所占用的内存,此外,它还可能负责那些还在使用的对象,以减少的堆碎片。

  • 内存区

    用于存储字节码,程序运行时创建的对象,传递给方法的参数,返回值,局部变量和中间计算结果。

  • 执行引擎

    1、最简单的:一次性解释字节码。
    2、快,但消耗内存的:“即时编译器”,第一次被执行的字节码会被编译成机器代码,放入缓存,以后调用可以重用。
    3、自适应优化器,虚拟机开始的时候会解释字节码,但是会监视运行中程序的活动,并记录下使用最频繁的代码段。程序运行的时候,虚拟机只把使用最频繁的代码编译成本地代码,其他的代码由于使用的并不频繁,继续保留为字节码–由虚拟机继续解释他们。一般可以使java虚拟机80%~90%的时间里执行被优化过的本地代码,只需要编译10%~20%对性能优影响的代码。
    4、由硬件芯片组成,他用本地方法执行java字节码,这种执行引擎实际上是内嵌在芯片里的。
    图示

Java毕设乡村养老服务管理系统:13模块源码与部署排错 信息管理系统通常基于B/S架构与关系型数据库构建,通过表结构设计、索引优化和事务控制实现数据一致性。在乡村养老服务场景中,老人档案、生活照料订单、健康档案等模块需要高效查询与状态流转,合理使用MySQL索引和JDBC动态SQL能显著提升性能。这类系统适用于乡镇养老服务站,解决纸质记录查询慢、数据追溯难的问题。本文以Java毕设源码为例,拆解从E-R图到物理表、登录鉴权过滤器、订单分页查询及部署常见问题排查的完整链路,帮助开发者快速跑通并二次开发。 阅读详情

相关推荐

kaggle注册以及数据集下载全流程

kaggle注册,数据集下载及常见问题

Arriteey的博客 2万+

深入JVM 解析执行

通常而言,虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即使编译器直接翻译成本地机器码)2种选择。 ——解释执行 在老版本的虚拟机中,通常认为Java语言是解释执行的语言,但现代主流虚拟机都包含即使编译器,Class文件到底是被解释执行还是编译执行,并不确定,不论是解释还是编译,也不论环境是实际物理机还是虚拟机,对于应用程序,机器都需要进行一定步骤。 ...

一只老风铃 454

使用DevExpress22.X(Patch)控件库在VisualStudio2022使用C#进行Winform、WPF应用的开发,看这一篇就够了!

写在开头,Dev Express是个十分强大的控件库(下文简称Dev),但碍于其高昂的使用费用,“出于学习目的”,我们一般使用的都是Patch版本(在版权意识日趋加强的当下,不要提那两个字,现在加上那些字,百度都搜不出内容)。

平凡之路 2万+

JVM 运行机制及其原理

最近出去面试,总被问到Java JVM相关的东西,什么JVM的内存模型、JVM的内存分配、内存回收、内存回收算法…搞得我一头雾水,早些年还看过一些,蹭着有时间给大家也给自己总结下JVM相关的知识。 JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机主要由字节码指令集、...

xiangzhihong8的专栏 3万+

华硕ROG玩家国度安装Ubuntu双系统避坑指南:安全启动密钥那些事儿

本文详细解析了在华硕ROG玩家国度设备上安装Ubuntu双系统时,如何正确处理BIOS中的安全启动(Secure Boot)与密钥管理,避免常见的引导失败和Windows系统无法启动问题。指南提供了从数据备份、启动盘制作到BIOS精细设置(如将OS Type改为Other OS而非简单关闭Secure Boot)以及分区规划的完整流程,确保两个系统都能稳定共存。

weixin_29219189的博客 754

SAP 批量处理分包事后调整:BAPI_GOODSMVT_CREATE 关键参数与避坑指南

本文详细解析了SAP系统中使用BAPI_GOODSMVT_CREATE进行分包事后批量调整的关键参数配置与常见错误排查。重点介绍了GOODSMVT_CODE设置为'07'的必要性、GOODSMVT_ITEM结构体的正确配置方法,以及如何避免M7384、M7386等常见错误,帮助用户高效处理分包业务中的数量调整问题。

weixin_29276847的博客 568

【java基础】.class文件由虚拟机的解释器解释为机器码,这个机器码是给JVM执行的机器码,还是类似于.exe给操作系统执行的机器码

问题起因:               我注意到再写java程序运行时不会像.exe程序一样出现在windows的任务管理器---进程一栏里面,只能看到javaw.exe。(可以了解一下javaw.exe与java.exe区别)然后经过一系列联想我就到了一个问题:java的.class文件由虚拟机的解释器解释为机器码,这个机器码是给JVM执行的机器码,还是类似于.exe给操作系统执行的机器码。

youxia0075454的专栏 4272

在树莓派4B上基于NCNN框架部署YOLOv8的实战教程

摘要:本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的完整流程。从PyTorch模型转换为NCNN格式,到树莓派环境配置(OpenCV和NCNN编译),再到C++代码实现与优化,涵盖模型加载、推理和绘图等核心功能。测试结果显示,树莓派4B上可实现约2 FPS的检测速度,Windows平台达6~7 FPS。文章还提供了量化模型、多线程优化等实用建议,并附常见问题解答,为边缘设备部署轻量化目标检测提供了可行方案。(149字)

m0_64661770的博客 596

【关于JVM,不得不知道的那些事儿】

一、JVM内存区域划分 JVM主要是分成四个区域:堆、栈、程序计数器、方法区 JVM本质上是一个java进程,JVM启动之后就会从操作系统这里申请到一大块内存~ 每个线程,都有自己的栈和程序计数器~ 下面我们对于这四个区域进行详细的描述~ 1.堆:里面放的就是new出来的对象 我们程序中每new一个实例对象,就会放到堆中。 2.方法区:里面放的是类对象 .java =》 .class =》 JVM就会把 .class进行加载,加到内存里=》类对象 类对象里都包含哪些内容: 类的st

weixin_54161577的博客 1490

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1235

2022中山大学计算机技术专硕考研初试、复试经验帖

个人简介 推荐几个我自己感觉对考研非常有帮助的小助手吧。可以帮助节省时间! 考研时间规划总览 初试篇 数学 英语 政治 408 复试篇 机试 笔试 面试 关于选导师 个人感言

zik的博客 1万+

JVM工作原理那些事儿

JVM工作原理和特点 我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是Java程序运行的环境,但是他同时是一个操作系统的一个应用程序也是一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间. 首先来说一下JVM工作原理中的jdk这个东西,不管你是初学者还是高手,是j2ee程序员还是j2se程序员,jdk总是在帮我们做一些事情.我们在了解Java之前

flowingWater 460

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 134

关于JVM的那些事儿!

1.基本概念 JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。 2.运行过程 我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件,而字节码文件又 通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。也就是如下: ① Java 源文件—->编译器—->字节码文件 ② 字节码文件—->J

qq_34433301的博客 212

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

理解JVM字节码,做点有意的事儿

作者:侯树成来源:Tomcat那些事儿JVM 字节码,做为虚拟机执行的指令,对于平时做 Java 应用开发来说,一直像蒙着一层神秘面纱,朦朦胧胧。但其实理解了字节码指令,对于 Jav...

华章IT官方博客 350

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM专题七:JVM垃圾回收机制

中,我们介绍了JVM内存主要分哪些区域,这些区域分别是干什么的,同时也举了个例子,在运行过程种各个区域数据是怎样流转的。细心的小伙伴可能发现一个问题,在介绍完方法弹栈以后就没有介绍后续流程了。方法执行完以后,堆内存存放的对象实例咋整呢,带着这样的疑问进入今天的内容。

Jeremy程序员 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JVM你想了解的那些事儿

学习JVM前 先思考一下一个对象被实例化的过程 https://www.hellojava.com/a/92881.html 带着疑问来开始学习JVM 什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 JVM作用 Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都

delete_bug的博客 416

谈谈JVM体系结构那些事儿。

二话不说,先抛出一张大气的JVM体系结构简约图,给小伙伴们欣赏一下纸。 如果可以,请承诺我你已经认真的看了五分钟,如果真的是这样。 ShowTime!!! 简单讲解一下这个东东。 当小伙伴们创建JAVA类,运行class文件的时候,首先会先经过类装载器子系统。那么在类装载子系统(Class Loader中是怎么运行的呢???) 1:当我们创建类之后,这里简单用Phone替代:我们创建Phone类之后,java虚拟机会自动生成一个.class文件,那么.class文件是如何经过JVM整个体系呢。首先会被Cl

qq_42534991的博客 221

理解 JVM 字节码 ,做些有意思的事儿

JVM 字节码,做为虚拟机执行的指令,对于平时做 Java 应用开发来说,一直像蒙着一层神秘面纱,朦朦胧胧。但其实理解了字节码指令,对于 Java 虚拟机的工作原理,对于基于「栈」的指令...

Tomcat那些事儿 143

死磕P7: JVM垃圾回收那点事,轻松拿捏不是事儿(二)

本文又是一片硬骨头,放松心态,当个小说读两遍,能记多少记多少吧!回顾一下本篇内容就是,了解了对象是否存活的 2 种策略:引用计数法和可达性分析法,了解了 Java 的 4 类引用分类:强软弱虚,知道了垃圾回收的常见算法:标记-复制,标记-清除,标记-整理,并根据图示能理解其大概行为,最后介绍了常见的垃圾收集器:Serial, ParNew, Parallel, CMS, G1, ZGC, 知道其大概优缺点即可。

新质程序猿 1488

JVM那些事儿之简介(一)

JVM那些事儿之简介JVM全名是Java虚拟机(Java Virtual Machine),这个英文名大家一定要记住,为什么要记这个英文呢?要说这英文呀,太重要了,是出门装逼抗事必备。不然你出去跟人家说诸如“JVM虚拟机”之类的话就要被鄙视了。虚拟机那到底啥是虚拟机呢?其实虚拟机就是在硬件计算机上模拟一个假的计算机,大家用电脑玩过psp吧,这时候就要用到一种叫做模拟器的软件,这个软件其实就是虚拟机。

小刀 449

JVM到底该学些什么

指明接下来的系列文章将会介绍的内容,本篇文章放弃了细节,希望从宏观上能让大家对JVM的学习路线有清晰的认识。

跑码场 589

怎么学 JVM

JVM 对 Java 有多重要,对程序员面试有多重要,这些不用多说。如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了。曾经的我很不屑于学 JVM,但是后来发现不学不行。这就像和媳妇吵架之后我不想道歉一样,不道歉那是不可能的,道歉是早晚的事儿,逃不掉。后来我明白了:认怂越晚,结局越惨。但是我学的时候才知道:JVM,你太过分了,太难学了!我的学习过程可以说非常坎坷,不过经历坎坷之后,我倒是发现学 JVM 的门道很多。以我的经验加上和同行们的交流,我认为学 JVM

hahazz233的博客 448

关于Android虚拟机的那些事儿

早前android给人的印象是卡,慢,无;但是从6.0依赖的手机似乎人们不再提android的这些诟病了,无非来一句“不高端”。知道什么原因吗?有同学说,android一个劲的提升内存,和CPU的升级,但这只是其中的表象,为什么会提升内存呢?认识一下Jvm、Dalvik和Art,你将一切都明白了。 什么是JVM JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的.class字节码文件,与C语言编译后产生的汇编语言不同的是,C编译成的

乂星人 2174

学Java有必要学JVM吗?怎么学JVM?

JVM 对 Java 有多重要,对程序员面试有多重要,这些不用多说。 如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了。 曾经的我很不屑于学 JVM,但是后来发现不学不行。这就像和媳妇吵架之后我不想道歉一样,不道歉那是不可能的,道歉是早晚的事儿,逃不掉。 后来我明白了: 认怂越晚,结局越惨。 但是我学的时候才知道:JVM,你太过分了,太难学了! 我的学习过程可以说非常坎坷,不过经历坎坷之后,我倒是发现学 JVM 的门道很多。 以我的经验加上和同

Jsono8的博客 1300
上一篇: JVM那些事儿之简介(一)
下一篇: JVM那些事儿之内存空间管理(三)
李茂盛
博客等级 码龄13年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值