摸鱼JVM - 类加载机制

在Java虚拟机上班是一种怎样的体验? 228 人赞同了该回答 利益相关,匿了! JVM公司里面线程众多,派系林立,尤其是执行引擎那波人,因为是核心部门,经常diss别的部门。 428 人赞同了该回答 不请自来。 其实在JVM工作没有你们想象的那么辛苦,其他部门不清楚,就拿我所在的垃圾回收部(这名字不好听,叫GC部门吧)来说说。 我的工作是负责执行对象的finalize方法,你们也知道,现在的程序员,很少实现类的这个方法了,所以我的工作大部分时间都可以摸鱼。 --------------------分割线... 阅读详情

前言

我们知道, 在java开发中, .java文件会被编译超成一个个.class文件, 最终被JVM加载和运行.

大致流程图如下

JVM

什么是类的加载

我们写的java文件保存着业务逻辑代码,

java编译器负责将 .java 文件编译成 .class 文件,

.class 文件中保存着java文件转换后虚拟机将要执行的指令.

当需要某个类的时候, java虚拟机会加载 .class 文件,并创建对应的class对象.

将class文件加载到虚拟机的内存, 这个过程被称为类的加载.

类加载的最终产品是位于堆区中的Class对象,

Class对象封装了类在方法区内的数据结构, 并且向Java程序员提供了访问方法区内的数据结构的接口.

类加载器并不需要等到某个类被“首次主动使用”时再加载它, JVM规范允许类加载器在预料某个类将要被使用时就预先加载它.

如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误).

如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误.

知道了什么类的加载, 下面我们就来了解下JAVA类的生命周期

JAVA类的生命周期

JAVA类的生命周期

可以看出, JAVA类的生命周期如下:

  • 加载
  • 验证
  • 准备
  • 解析
  • 初始化
  • 使用
  • 卸载

类加载的过程包括了加载、验证、准备、解析、初始化五个阶段.

PS:
验证、准备、解析这三个阶段也被统称为连接阶段

在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的;

而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).

PS:
另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段.

加载

加载阶段主要查找并加载类的二进制数据, 类加载器通过一个类的完全限定名查找此类字节码文件,并利用字节码文件创建一个class对象.

在加载阶段, 虚拟机需要完成以下三件事情:

  1. 通过一个类的全限定名来获取其定义的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口

相对于类加载的其他阶段而言,加载阶段是可控性最强的阶段, 因为开发人员既可以使用系统提供的类加载器来完成加载, 也可以使用自己定义的类加载器来完成加载.

JVM类加载器

类的加载由类加载器完成,类加载器通常由JVM提供.

JVM提供的这些类加载器通常被称为系统类加载器;除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器.

JVM预定义有三种类加载器:

  • 启动类加载器(Bootstrap ClassLoader)
    用来加载 Java 的核心类,是用原生代码来实现的,并不继承自java.lang.ClassLoader(负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类);
    由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作
//获得根类加载器所加载的核心类库,并会看到本机安装的Java环境变量指定的jdk中提供的核心jar包路径
public class ClassLoaderTest {
	public static void main(String[] args) {
		URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
		for(URL url : urls){
			System.out.println(url.toExternalForm());
		}
	}
}

结果

file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/resources.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/rt.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/sunrsasign.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jsse.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jce.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/charsets.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/jfr.jar
file:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/classes
  • 扩展类加载器(Extension ClassLoader)
    它负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类, 由Java语言实现,父类加载器为null

  • 应用程序类加载器(Application ClassLoader)
    被称为系统(也称为应用)类加载器,它负责在JVM启动时加载来自Java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH换将变量所指定的JAR包和类路径.
    程序可以通过ClassLoader的静态方法getSystemClassLoader()来获取系统类加载器;如果没有特别指定,则用户自定义的类加载器都以此类加载器作为父加载器,由Java语言实现,父类加载器为ExtClassLoader.

类加载器加载Class大致要经过如下8个步骤:

  1. 检测此Class是否载入过,即在缓冲区中是否有此Class,如果有直接进入第8步,否则进入第2步
  2. 如果没有父类加载器,则要么Parent是根类加载器,要么本身就是根类加载器,则跳到第4步,如果父类加载器存在,则进入第3步
  3. 请求使用父类加载器去载入目标类,如果载入成功则跳至第8步,否则接着执行第5步
  4. 请求使用根类加载器去载入目标类,如果载入成功则跳至第8步,否则跳至第7步
  5. 当前类加载器尝试寻找Class文件,如果找到则执行第6步,如果找不到则执行第7步
  6. 从文件中载入Class,成功后跳至第8步
  7. 抛出ClassNotFountException异常
  8. 返回对应的java.lang.Class对象
JVM类加载机制

JVM的类加载机制主要有如下3种:

  • 全盘负责
    所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入

  • 缓存机制
    缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中.这就是为什么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因

  • 双亲委派
    双亲委派就是如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成, 若成功则直接返回, 否则继续向上,直到到达最顶层的类加载器;
    因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器无法完成该加载请求时,子加载器才会尝试自己去加载该类

双亲委派.png

JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承java.lang.ClassLoader实现自定义的类加载器.

采用双亲委派的一个好处是比如加载位于 rt.jar 包中的java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象
简而言之:

  • 系统类防止内存中出现多份同样的字节码
  • 保证Java程序安全稳定运行
JVM类加载方式

JVM有3种类加载方式:

  • 命令行启动应用时候由JVM初始化加载

  • 通过ClassLoader.loadClass()方法动态加载
    将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块;
    Classloader.loaderClass得到的class是还没有连接(验证、准备、解析)的

  • 通过Class.forName()方法动态加载
    将类的.class文件加载到jvm中,还会对类进行解释,执行类中的static块; Class.forName()得到的class是已经初始化完成的

实例:

package com.test.classloader;
public class loaderTest { 
        public static void main(String[] args) throws ClassNotFoundException { 
    ClassLoader loader = HelloWorld.class.getClassLoader(); 
    System.out.println(loader); 
    //使用ClassLoader.loadClass()来加载类,不会执行初始化块 
    loader.loadClass("TestClass"); 
    //使用Class.forName()来加载类,默认会执行初始化块 
    Class.forName("TestClass"); 
    //使用Class.forName()来加载类,并指定ClassLoader,初始化时不执行静态块 
    Class.forName("TestClass", false, loader); 
       } 
}

public class Test { 
        static { 
                System.out.println("静态初始化块执行了!"); 
        } 
}
验证

验证阶段是为了确保 Class 文件的字节流中包含的信息是符合当前虚拟机的要求,并且不会危害虚拟机自身的安全.
验证大致会完成4个检验动作:

  1. 文件格式验证
    验证字节流是否符合Class文件格式的规范.
    例如: 是否以0xCAFEBABE开头; 主次版本号是否在当前虚拟机的处理范围之内; 常量池中的常量是否有不被支持的类型;

  2. 元数据验证
    对字节码描述的信息进行语义分析(注意: 对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;
    例如:这个类是否有父类, 除了java.lang.Object之外;

  3. 字节码验证
    通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的.

  4. 符号引用验证
    确保解析动作能正确执行.
    验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响;
    如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间.

准备

准备阶段是为static修饰的类变量分配内存, 并设置类变量初始值的阶段;
这些内存都将在方法区中分配; 不包含final修饰的静态变量, 因为final变量在编译时分配.

需要注意的是:

  • 此时进行内存分配的仅包括类变量(static),而不包括实例变量; 实例变量会在对象实例化时随着对象一块分配在Java堆中.
  • 这里所设置的初始值通常情况下是数据类型默认的零值(如0、0L、null、false等)而不是被在Java代码中被显式地赋予的值.

举个例子:
类中定义了变量 public static int a =100;
实际上变量 a 在准备阶段过后的初始值为 0 而不是100;(对这句话有疑惑的可以去补充下JAVA数据类型初始值的知识)
将 a 赋值为 100 的 put static 指令是程序被编译后, 存放于类构造器()方法之中的.

不过注意,如果声明为:public static final int a = 100;
在编译阶段会为 a 生成 ConstantValue 属性, 在准备阶段虚拟机会根据 ConstantValue 属性将 a 赋值为 100

解析

解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程,
主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行.
符号引用就是一组符号来描述目标,可以是任何字面量.

######直接引用
直接引用可以是指向目标的指针,相对偏移量或是一个能间接定位到目标的句柄; 如果有了直接引用,那引用的目标必定已经在内存中存在.

符号引用

符号引用与虚拟机实现的布局无关,引用的目标并不一定要已经加载到内存中.
各种虚拟机实现的内存布局可以各不相同,但是它们能接受的符号引用必须是一致的; 因为符号引用的字面量形式明确定义在 Java 虚拟机规范的 Class 文件格式中.

初始化

这里是类记载的最后阶段,如果该类具有父类就进行对父类进行初始化,执行其静态初始化器(静态代码块)和静态初始化成员变量.(前面已经对static 初始化了默认值,这里我们对它进行赋值,成员变量也将被初始化).

JVM负责对类进行初始化,主要对类变量进行初始化.

######Java对类变量进行初始值设定的两种方式:

  1. 声明类变量是指定初始值
  2. 使用静态代码块为类变量指定初始值
JVM初始化步骤
  1. 假如这个类还没有被加载和连接,则程序先加载并连接该类
  2. 假如该类的直接父类还没有被初始化,则先初始化其直接父类
  3. 假如类中有初始化语句,则系统依次执行这些初始化语句
类初始化时机

只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

  1. 创建类的实例,也就是new的方式
  2. 访问某个类或接口的静态变量,或者对该静态变量赋值
  3. 调用类的静态方法
  4. 反射(如Class.forName(“com.test.Test”))
  5. 初始化某个类的子类,则其父类也会被初始化
  6. Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类
注意以下几种情况不会执行类初始化:
  1. 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化
  2. 定义对象数组,不会触发该类的初始化
  3. 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类
  4. 通过类名获取 Class 对象,不会触发类的初始化
  5. 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化
  6. 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作

请关注我的订阅号

订阅号.png

【OpenSearch】从零到一:手把手搭建OpenSearch与Dashboard可视化平台 本文提供了一份详细的OpenSearch与Dashboard可视化平台从零搭建指南。内容涵盖环境准备、系统调优、核心服务安装配置、Dashboard部署与汉化,以及生产环境安全加固建议,帮助用户快速构建一个功能完整的搜索与分析平台。 阅读详情

相关推荐

网络工程系统CAD图:从设计到落地的关键技能与实战指南

网络工程并不只是配置路由器和交换机,真正的核心在于将设计方案转化为可施工的物理图纸。网络工程系统CAD图正是连接逻辑设计与物理世界的桥梁,它涵盖综合布线、信息点布置、桥架路由、弱电间规划等关键内容。理解并掌握这套图纸体系,是网络工程师从基础设备调试走向项目主导者、弱电总工乃至网络架构师的重要分水岭。在园区网、数据中心、智能楼宇等真实场景中,一套规范的系统CAD图直接决定了施工质量、验收效率与后期运维的可靠性。本文从基础概念出发,拆解图纸的组成层次、绘制流程和软件工作流,并结合学习路线与就业方向,帮助初学者建

weixin_33860553的博客 389

解密 `java.lang.ClassNotFoundException`:从JVM类加载机制到实战排错(Java小白必读)

`java.lang.ClassNotFoundException` 是Java开发中一个非常常见的运行时异常。当Java虚拟机(JVM)在运行时尝试通过类名动态加载一个类(例如使用 `Class.forName()` 或通过类加载器显式加载),但在其类搜索路径(Classpath)下找不到对应的 `.class` 文件时,便会抛出此异常。这通常与类路径配置错误、依赖的JAR包缺失、打包问题或类名书写错误等因素紧密相关。本文将以“小白”视角出发,从`ClassNotFoundException`的表象入手,

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2737

超详细 Git创建仓库及上传项目至Github操作(Windows系统)

文章目录前言一、Git下载及安装二、创建代码仓库1.配置身份2.创建本地仓库3.提交本地代码三、使用Git上传代码至Github1.创建ssh keys2.在Github中新建仓库3.关联本地仓库与Github仓库4.推送代码至Github仓库总结 前言 本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去。内容参考《第一行代码》以及一些博客。 本文适合新手阅读哦~ 一、Git下载及安装 打开网站 git下载 下载安装包(直接

lijianyi0219的博客 2万+

摸鱼JVM - 执行引擎

前面介绍过类加载器子系统运行时数据区(也就是内存相关)执行引擎前几章我们简单的梳理了一下JVM的类加载机制及运行时数据区,今天我们来聊聊JVM执行引擎.如无特殊说明, 所有描述JVM的特性均特指HotSpot VMHotSpot中采用的是解释器+JIT即时编译器混合.好处在Java程序运行时,JVM可以快速启动,前期先由解释器发挥作用,不需要等到编译器把所有字节码指令编译完之后才执行,这样可以省去很大一部分的编译时间;...

CTO技术的博客 563

YT8531 PHY芯片硬件设计与MDIO/RGMII实战指南

以太网PHY芯片是FPGA系统实现网络通信的物理层核心,其关键在于标准接口(如MDIO管理总线和RGMII数据接口)的正确实现与协同。MDIO作为IEEE 802.3定义的低速配置通道,负责寄存器级控制与状态监控;RGMII则通过双沿采样精简引脚,在千兆速率下兼顾性能与PCB布线可行性。技术价值体现在电压兼容性(支持1.8V/2.5V/3.3V)、可编程时序调节(RX_DELAY/TX_DELAY)及多级环回测试能力,显著提升国产FPGA平台(如Xilinx Zynq)的工程鲁棒性。典型应用场景涵盖嵌入式网

weixin_42453228的博客 1333

基于任务的后勤智能体:三段构建与演进设计探究

这是系统智能化的核心难点。例如,对于一个“加强连级滩头阵地防御”子任务,系统会根据防御时长、预期敌军攻击强度、地形等因素,计算出所需的弹药(不同弹种的具体数量)、构筑工事的器材、人员的给养和饮水量、以及医疗救护的药品和血包数量。首先进行分词、词性标注等基础处理,然后利用在军事语料库上训练的命名实体识别(NER)模型,提取出关键实体,如任务类型(“夺控作战”)、作战对象(“Y岛”)、时间约束(“D日H时”、“24小时内”)、成功标准(“建立稳固滩头阵地”)、保障重点(“弹药充足”、“及时救治”)等。

weixin_49042442的博客 1088

java面经总结-jvm相关

一.谈谈你对java的理解 平台无关性 在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。 同一份Java源代码在不同的平台上运行,它不需要做任何的改变,并且只需要编译一次。而编译好的字节码,是通过JVM这个中间的“桥梁”实现跨平台的,JVM是与平台相关的软件,它能将统一的字节码翻译成该平台的机器码。 gc特性 语言特性 面向对象 类库 异

nice_good_boy的博客 381

手把手实战:RK3588上YOLOv8模型从训练到部署全流程解析

本文详细解析了在RK3588开发板上部署YOLOv8目标检测模型的全流程。从模型训练、正确导出适配的ONNX格式,到使用RKNN-Toolkit2进行模型转换与量化,最后在板卡上完成部署与性能测试。文章提供了完整的代码示例和关键避坑指南,帮助开发者高效实现嵌入式AI应用落地。

weixin_28224217的博客 402

摸鱼JVM -运行时数据区

前面介绍过JVM被分为三个主要的子系统:前面我们介绍了JVM的类加载机制, 今天我们则重点聊聊JVM的运行时数据区, 即JVM内存相关知识关于JVM内存, 有两个比较重要的概念,这两个概念, 经常会有人搞混, 所以, 顺带来做个梳理.内存模型内存结构Java Memory Model, 就是我们常说的JMM;JMM和JVM内存结构不同, 它只是一个抽象的概念, 描述了一组规则或规范, 这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。我们知道, Java的多线程之间是通过共享内存进行通信的,而

CTO技术的博客 291

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 396

笔试题-2023-乐鑫-数字IC设计【纯净题目版】

笔试题-2023-乐鑫-数字IC设计【纯净题目版】

w0shishabi的博客 1777

JVM学习笔记

①避免类的重复加载;②防止核心API被篡改;为了避免原始类被覆盖的问题。老子走过的路,小子不用走比如,用户编写了一个Object类,放入程序中加载。当没有双亲委派机制时,就会出现重复的Object类,给开发人员造成很大的困扰,本来就只需要基于JDK开发就好了,现在还得把JDK中的类全记住,避免编写重复的类。当存在双亲委派机制时,整个事情就不一样了,每次加载类时,都会遵循双亲委派机制,去问父类是否可以加载,如果可以呢,那就不需要再次加载了,这样事情就简单了。

qq_41119146的博客 1111

【Unity的HDRP渲染管线下实现好用的GUI模糊和外描边流光效果_Blur_OutLine_案例分享(内附源码)】

因为没有用到纹理,但介于是UI层,没有MainTeX的时候,会提示报错,所以这里加上了MainTex,最后不在片段着色渲染出来既可。这样UI层级显示正常了,但旋转后的模糊效果,跟背景拼接不上,有很大的偏移。猜测是屏幕UV采样错误导致,只要找到屏幕UV数值,更正过来就可以了,RenderTexture设置一下Size既可,其他的先不管。没有贴图,用Shader实现外描边流光效果。将主相机拖入Render Camera。新建一个RenderTexture。

暴走约伯的博客 1148

JUC、JVM

什么是juc?JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包。提供了许多在并发编程工程中常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO、轻量级框架、还提供了多线程上下文的Collectiion的实现。什么是进程和线程?一个软件一个进程,一个进程有许多的线程。进程——资源分配最小单位  线程——程序执行最小单位New 新建状态(线程刚被创建,start方法之前的状态)

qq_42012853的博客 2028

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度思考:老生常谈的双亲委派机制,JDBC、Tomcat是怎么反其道而行之的?

要说双亲委派机制,还得从类加载器的类型谈起 一、类加载器的类型 类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader) 启动类加载器 内嵌在JVM内核中的加载器,由C++语言编写(因此也不会继承ClassLoader),是类加载器层次中最顶层的加载器。用于加载java的核心类库,即加载jre/lib/rt.jar里所有的class。由于启动类加载器

阳阳的博客 3490

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

妹子:我都这样给你讲类加载器了,还不懂!

ClassLoader的中文名翻译过来叫做类加载器,主要的工作就是负责把Class加载到JVM中,看起来挺高大撒上,其实就是个看大门的,只能放VIP进去,不同级别的VIP会安排到不同级别的...

码农code之路 416

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在 Java 虚拟机上班是一种怎样的体验?

来源 |编程技术宇宙责编| Carol封图 | 优快云下载自视觉中国本文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助。匿名用户JVM老鸟 2...

优快云资讯 2235

大专刚毕业的我都可以拿到大厂offer,你还去摸鱼嘛

,给大家整理了今年来最经典的面试真题100道,每个题目都有详细的解答,收集了java基础、RabbitMQ,微服务、MySQL数据库、Java并发、JVM,Redis、设计模式,Spring / Spring MVC,等专题的经典面试真题,和详细分析。 数据库篇 事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别? MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别? MySQL的MyIS

weixin_58610844的博客 112

2020-11-04

11/4 今天做了两道算法题和进入JVM的浅层学习 首先先总结JVM的知识内容 JVM一开始就是讲述类加载器(ClassLoader) 类加载器分为三种:BootStrapClassLoader、ExtClassLoader、AppClassLoader 在JAVA中,类加载的机制是双亲委派机制 原理就是从下而上寻找可以加载的加载器,如果这个加载器没有的话,就寻找父类的加载器,顺序是(App->Ext->BootStrap),然后自上而下地进行加载,如果没有可以加载的加载器,就会有异常,一图流解

qq_41558507的博客 135

JVM 面试问题,背完去面试(面试篇 一)

首先声明,该博客用于对JVM有了解的人,本文也是根据B站某班的老师讲的内容,进行了总结。将概念理论,大家自己去查找,我也可以发你地址(很多视频,不说讲的不好,实在是在摸鱼,纯粹浪费时间,而有些博客写的实在是看不下去,还是错的)。 基于我自己的理解,做了一些简单的总结,你可以背完去面试,但是不建议。很多东西你得有自己的认识,下面涉及的很多概念,都需要一定的基础。 - 谈谈你对JVM的认识。题目很大,等于没问 1. 首先,JVM(Java Virtual Machine)java虚拟机,但是也不能说只能运

dadachenchen的博客 467

大厂高频面试题-请把Java的双亲委派机制说清楚!

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

2401_85405874的博客 367

上班”摸鱼“看到的面试笔记,准备跳槽了。

前几天,一个认识了好几年在大厂工作的程序员朋友,年近30了,却被大厂以“人员优化”的名义无情被辞,据他说,有一个月散伙饭都吃了好几顿……在很多企业,都有KPI考核,然后在此基础上还会弄个“...

MarkerHub的博客 156

java虚拟机概述

导读:我们写了一行Java语言的代码,那么这行代码执行的时候到底发生了什么事情,就需要我们对Java虚拟机以及背后的运行机制有深入的理解,本文只是作为复习资料做一个笼统的介绍。学习JVM需要一些前置知识,这些知识包括计算机组成原理、操作系统;如果想深入理解的理解JVM,可以看周志明的《深入理解JAVA虚拟机》以及《Java虚拟机规范》、《Java语言规范》;本文仍旧希望能说清楚JVM内在演变逻辑。...

weixin_47267435的博客 52

我爱了!“上班摸鱼”吃透了这份999页的Java面试手册,成功拿到了美团的offer

前言 事情是这样的,今年年初,在某个大博主那里拿到一份Java面试宝典,然后就一直躺在盘里吃灰,直到5月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套“积灰”的面试宝典拿出看了看,这一看就看了一个多月才算是完整的吃透。7月中旬开始面试美团了,前后差不多5面的样子,原本以为没啥希望,等到月底29号收到了offer,通知8月3号到公司报到,看到邮件那一刻差点跳起来了! 再说一下我个人情况吧,华南地区本科生,非985和211,毕业以后就在一家小公司工作,赚的不多但起码不是996,这一晃就差

m0_50180963的博客 227

每天突击学习五分钟,24年春招Java面试不发愁

内卷可以说是2023年最火的一个词了。2024年还没开始,在很多程序员网站看到很多Java程序员的2023年度总结都是:Java越来越卷了(手动狗头),2023年是被卷的一年。前有几百万毕业生虎视眈眈,后有在职人员带头“摸鱼”占着坑位,加上疫情让很多公司倒闭,市面上根本没那么多就业岗位。自然而然HR们就开始优中选优,计划内卷矛盾!那么如何在众多的应聘者中脱颖而出呢?答案之一就是要摸清现在互联网公司的面试套路!

知识分享官 1010
上一篇: 摸鱼JVM - 几个常识概念启蒙 (老鸟请跳过)
下一篇: 摸鱼JVM -运行时数据区
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值