Java-JVM探析

JAVA中JVM 一、什么是JVMJVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是平台无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。 阅读详情

一、概述

JVM 是 Java 虚拟机(Java Virtual Machine)的缩写,它是 Java 程序运行的执行引擎。它屏蔽了底层操作系统的差异,让 Java 字节码可以在不同平台上运行。更重要的是在虚拟机自动内存管理机制的帮助下,不再需要手动释放内存,不容易出现内存泄露和内存溢出问题。

Java 编译器(javac)把 .java 文件编译成 .class 字节码,而 JVM 负责执行这些字节码。

了解虚拟机的运行机制有助于在我们开发中,更容易发现问题,找到内存泄漏原因…

须知:

  • JVM 是规范(接口标准)
  • HotSpot / ART/Dalvik 是实现(具体虚拟机)
  • PC 端的虚拟机是HotSpot,安卓端则使用的是ART/Dalvik

二、 JVM 核心组件(构成体系)

JVM 主要由以下部分组成:

在这里插入图片描述

类加载器系统(Class Loader Subsystem)

  • 加载 .class 文件(可来自文件系统、网络等)
  • 双亲委派模型:防止类的重复加载

执行引擎(Execution Engine)

负责将字节码转为机器码并执行。

  • 解释器(Interpreter):逐行解释执行
  • JIT 编译器(Just-In-Time):热点代码编译成本地机器码,提高效率

本地接口(Native Interface)

通过 JNI(Java Native Interface)调用 C/C++ 等底层库。

运行时数据区(Runtime Data Area)

这是 JVM 运行时用于存储各种数据的内存区域:

区域说明
方法区(Method Area)存储类元数据、静态变量、常量池(JDK 8后并入元空间)
堆(Heap)存储对象实例,GC 主要作用区域
虚拟机栈(VM Stack)每个线程一个,存储栈帧、局部变量
本地方法栈用于执行 native 方法
程序计数器(PC)当前线程执行的字节码行号

前面三个只简单了解下即可,因为在开发中 运行时数据区 才是我们需要重点关照的。

三、 运行时数据区

运行时数据区(Runtime Data Area)是 JVM 在执行 Java 程序时用于内存分配的关键部分。掌握这部分知识对解决内存泄漏、优化性能和理解 Java 内部机制至关重要。 当然也是面试的重灾区!

程序计数器 (Program Counter Register)

每个线程都有其独立的程序计数器,这是一个非常小的内存空间,用于保存当前线程正在执行的字节码指令的地址。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地方法,则计数器的值为undefined。

在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

此内存区域是唯一 一个在Java虚拟机规范中没有规定OutOfMemoryError情况的区域。

特点:

  • 线程私有
  • 唯一一个不会出现 OutOfMemoryError 的区域

用途: 支持线程切换(线程上下文切换时,保存和恢复执行位置)

Java 虚拟机栈(VM Stack / Java Stack)

与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。

栈中的每个元素称为栈帧(Frame),栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址等。

经常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),其中所指的“堆”就是Java堆,而所指的“栈”就是现在所讲的虚拟机栈,或者说是虚拟机栈中局部变量表部分。

局部变量表

存储方法参数和方法内部定义的局部变量、存放基本数据类型、对象引用(reference)和returnAddress类型

局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关位置)和returnAddress类型(指向了一条字节码指令的地址)。

以变量槽(Slot)为最小单位,32位类型占1个Slot,64位类型占2个Slot

其中64为长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

操作数栈

操作数栈是栈帧内部的一个后进先出(LIFO)的工作区,用于存储计算过程中的临时数据。JVM 执行算术运算、方法调用传参、存储中间结果等操作时,都会依赖操作数栈。例如,执行 **iadd**(整数加法)指令时,JVM 会从操作数栈弹出两个整数相加,再将结果压回栈中。

动态链接

动态链接存储了指向运行时常量池中当前方法引用的信息,用于支持方法调用时的动态绑定(如多态)。在类加载阶段,符号引用(如方法名)会被解析为直接引用(实际内存地址),动态链接确保方法调用能正确找到目标方法,包括虚方法(如接口或重写方法)的动态分派。

方法返回地址

方法返回地址记录了方法执行完毕后应该回到的指令位置。如果方法正常结束(**return**),JVM 会使用该地址恢复调用者的执行;如果方法异常退出(未捕获的异常),JVM 会查找异常表处理,并跳转到对应的异常处理代码,而非原返回地址。


如果栈空间不足:StackOverflowError、 如果无法分配内存:OutOfMemoryError

在开发中常见的就是栈溢出,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,比如一个方法自己调用自己,就会报这个错误。如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

特点:

  • 线程私有**,每个线程一个独立的虚拟机栈**
  • 生命周期和线程相同
  • 编译期间确定大小,运行期不会改变

本地方法栈(Native Method Stack)

为 native 方法(JNI调用C/C++) 服务,类似虚拟机栈,但用于 native 方法执行时的栈帧保存。

在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定。HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

其中“HotSpot” 指的是虚拟机能通过运行时分析,自动找出运行频率高的代码(热点代码),并用 JIT 编译器将其编译为机器码,从而提高性能。 它是最主流的 JVM 实现,支持高性能执行、JIT 编译、多种 GC 策略,是 Java 应用程序运行的核心引擎。

特点:

  • 线程私有。
  • 不是所有 JVM 都区分虚拟机栈与本地方法栈(HotSpot JVM 就合并处理了)。

堆(Heap)

Java 堆是 JVM 中最大的一块内存区域,也是所有线程共享的。它用于存放对象实例和数组。几乎所有的对象实例和数组都在这里分配内存,是 Java 内存管理(GC)工作的重点区域。

Tips:但随着JIT编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上就不那么绝对了。

在这里插入图片描述

JDK 7 及以前,方法区被称为永久代 (Permanent Generation),它位于堆的内部!

虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

现代垃圾回收器通常采用分代收集 (Generational Collection) 的思想,将堆划分为新生代 (Young Generation) 和老年代 (Old Generation)。

堆
├── 新生代(Young)
│   ├── Eden 区
│   └── Survivor 区 (S0 / S1)
└── 老年代(Old)
  • 新生代:用于存放新创建的对象。又细分为 Eden 空间、From Survivor 空间和 To Survivor 空间。大多数对象在 Eden 区创建,经过 Minor GC 后存活的对象会进入 Survivor 区,多次 Minor GC 仍然存活的对象会进入老年代。
  • 老年代:存放生命周期较长的对象,或者在新生代中多次 GC 后仍然存活的对象。

堆是可伸缩的,启动时可以指定其大小,也可以在运行时动态扩展或收缩。

-Xms256m -Xmx1024m  # 设置堆初始和最大大小

当堆中没有足够的内存完成实例分配,并且垃圾收集器也无法再提供更多内存时,就会抛出 OutOfMemoryError。

特点:

  • 线程共享
  • 是 GC 管理的主要区域。
  • 大部分对象在 Eden 区创建(新生代)。

方法区(Method Area)(JDK 8 前)

方法区是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JVM 加载类时将类的信息放入方法区,也被称为“永久代”(PermGen Space)。

尽管在JDK 7及之前的方法区(永久代)从物理角度看是堆的一部分,但由于其独特的作用和管理方式,在解释Java内存模型时,常常将其与堆的其他部分区分开来描述。

虽然方法区是 GC 的一部分,但其回收条件相对苛刻,主要是针对废弃常量和无用的类进行回收。

在这里插入图片描述

从 JDK 8 开始,永久代被彻底移除,方法区由元空间 (Metaspace) 实现,元空间使用的是本地内存 (Native Memory)。

异常情况:

  • java.lang.OutOfMemoryError: PermGen space(JDK 8 前)
  • java.lang.OutOfMemoryError: Metaspace(JDK 8 后)

当方法区无法满足内存分配需求时,会抛出 OutOfMemoryError。在 JDK 7 以前的永久代中,更容易出现 OutOfMemoryError;在 JDK 8 后的元空间中,由于使用本地内存,相对来说不容易出现此问题,但也并非不可能。

特点:

  • GC 不频繁,但会发生
  • 线程共享
  • 被称为“永久代”(PermGen Space)——直到 JDK8。
运行时常量池

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量 (Literal) 和符号引用。字节码中的常量(字面值、符号引用)在类加载后放入运行时常量池。

  1. 字面量: 字面量分为文本字符串(如: “abc”,1等)和用final修饰的成员变量(实例变量和静态变量)
  2. 符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。

除了编译期已确定的常量,还可以在运行时动态地将一些数据放入常量池,例如 String 类的 intern() 方法。

intern() 的主要作用是确保返回的字符串常量池中具有相同值的一个引用。具体来说,当调用 intern() 方法时,如果字符串常量池中已经包含了一个等于此 String 对象的字符串(使用 equals(Object) 方法进行比较),则返回常量池中的这个字符串的引用。否则,将此 String 对象添加到字符串常量池中,并返回对该对象的引用。

与方法区一样,当常量池无法再申请到内存时,会抛出 OutOfMemoryError。String.intern() 时如果池满会导致内存溢出(尤其是 JDK 7 前后行为不同)。

直接内存(堆外内存)

除了 JVM 规范中定义的 运行时数据区(堆、方法区、栈等),在实际的 HotSpot 虚拟机中,还有一个重要概念叫做 直接内存(Direct Memory),也称为 堆外内存(Off-Heap Memory)。

  • 它是在 Java 堆外 向 操作系统本地内存 申请的内存空间,不受 JVM 堆大小(-Xmx)限制。直接受操作系统管理。
  • 通过 Unsafe 类 或 NIO 包中的 ByteBuffer.allocateDirect() 申请。

作用:

减少堆内存复制

  • 在进行 I/O 操作(比如网络传输、文件读写)时,如果使用普通堆内存,数据需要在堆 → 内核缓冲区之间复制。
  • 使用直接内存可以直接操作操作系统的内存缓冲区,减少一次复制,提高性能。

大数据缓存

  • 用于缓存海量数据,而不影响 JVM 堆 GC。

当直接内存达到最大限制时就会触发GC,如果回收失败则会引起OutOfMemoryError。

四、JMM(Java Memory Model)

Java 内存模型 (JMM) 是 Java 语言规范的一部分,它定义了在多线程环境下,线程如何通过内存进行交互。简单来说,JMM 规范了当一个线程修改了共享变量时,另一个线程何时以及如何能够“看到”这个修改。

JMM 的核心概念:主内存(Main Memory)与工作内存(Working Memory)

在这里插入图片描述

在多核处理器架构下,每个处理器都有自己的高速缓存 (Cache),并且数据最终会存储在主内存 (Main Memory) 中。JVM 运行在这样的硬件之上,为了优化性能,编译器和处理器都可能对指令进行重排序。如果没有一个明确的内存模型来规范这些行为,多线程程序的行为将会变得不可预测,容易出现各种并发问题,如可见性问题、原子性问题和有序性问题。


JMM 主要解决了以下三个并发编程中的核心问题:

1. 可见性 (Visibility):

  • 可见性是指当一个线程修改了共享变量的值,其他线程能够立即(或者在某个确定的时间点)看到这个修改。
  • 在多核系统中,每个线程可能拥有自己独立的 CPU 缓存。当一个线程修改了变量,这个修改可能只反映在其私有缓存中,而没有立即写入主内存。其他线程从自己的缓存中读取到的可能是旧的值,这就导致了可见性问题。
  • JMM 通过特定的同步机制来保证可见性,例如 volatile 关键字、synchronized 关键字、final 字段等。
    • volatile:保证变量对所有线程的可见性,禁止指令重排序。
    • synchronized:通过加锁,保证可见性和原子性。
    • final:在构造函数完成之前,禁止对该变量的重排序。

2. 原子性 (Atomicity):

  • 原子性是指一个操作是不可中断的,要么全部执行成功,要么全部不执行。
  • 例如,i++ 看起来是一个简单的操作,但它实际上包含了三个独立的步骤:读取 i 的值、对 i 进行加 1、将新的值写回 i。在多线程环境下,这三个步骤可能被其他线程打断,导致非原子性问题。
  • JMM 通过 synchronized 关键字、java.util.concurrent.atomic 包下的原子类等机制来保证原子性。

3. 有序性 (Ordering):

  • 有序性是指程序中指令的执行顺序。
  • 为了提高性能,编译器和处理器可能会对指令进行重排序。重排序分为两种:
    • 编译器重排序 (Compiler Reordering):编译器在不改变单线程程序语义的前提下,可能会对指令进行重排序。
    • 处理器重排序 (Processor Reordering):处理器在执行指令时,也可能会对其进行重排序。
  • 在单线程环境下,这些重排序是透明的,不会影响程序结果(称为 “as-if-serial” 语义)。但在多线程环境下,重排序可能会导致意想不到的结果。
  • JMM 通过 “happens-before” 原则来保证有序性,并使用内存屏障 (Memory Barriers/Fences) 来防止特定类型的重排序。

JMM 的核心目标就是:在保证程序正确性的前提下,允许编译器和处理器进行必要的优化。

这里只需要了解每个线程有自己独立的工作内存,JMM 就是这些众多的线程中的交通警察,为了维护和平与正义…重要是程序正常运行而存在的。

五、JVM 与 JMM 之间的关系

JVM 和 JMM 是紧密关联的,它们的关系可以理解为:

  • JMM 是一个规范/抽象模型:JMM 定义了一套规则,它是一个理论模型,描述了多线程程序在内存中如何交互,以及这些交互应该满足哪些一致性保证。它不直接是 JVM 的某个组件,而是对 JVM 实现的要求。
  • JVM 是 JMM 的实现者:JVM(特别是其执行引擎和内存管理部分)是 JMM 规范的具体实现者。JVM 必须遵循 JMM 定义的规则,以确保 Java 程序在各种硬件和操作系统上都能表现出一致的并发行为。

这里与上面说过的 JVM 是一种规范并无矛盾,JMM 可以看作顶级规范,凌驾与 JVM 之上,程序运行的基本规则!

打个比方:

  • JMM 就像是交通法规。它规定了车辆(线程)在道路(内存)上行驶时必须遵守哪些规则(可见性、原子性、有序性),以确保交通安全(并发程序的正确性)。
  • JVM 就像是汽车制造商和道路管理者。汽车制造商(JVM 的 JIT 编译器、垃圾回收器等)要确保他们生产的汽车(线程)能够遵守交通法规;道路管理者(JVM 的内存管理机制)要确保道路(主内存和缓存)的基础设施能够支持交通法规的实施(通过内存屏障等手段)。

总结来说:

JMM 是一个抽象的规范,规定了多线程环境下内存访问的行为,而 JVM 则是这个规范的具体实现者,它通过内部机制(如内存屏障、JIT 优化)来遵循 JMM 的规则,从而为 Java 开发者提供了可靠的并发编程环境。

六、最后

本来还想写写 GC 的发展史及不同版本的差异呢,发现啰啰嗦嗦写了一大堆,而且有些内容还只是浅尝辄止,毕竟 JVM 的知识涉及太多了,远不止几千字就能够说明白的,本篇文章仅当对 JVM 的了解了,如果有描述错误的地方还请批评指正。后面再单独写一篇关于垃圾回收的文章。

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计 本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。 阅读详情

相关推荐

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

Java-interface-jvm 层面的实现探析

Java 多态 JVM 层面实现 只是解析了类,本篇探析 interface 层面的实现。 测试代码 interface Eat package com.example.demo.invokeinterface; public interface Eat { void eat(); } interface Fly package com.example.demo.invokeinterface; public interface Fly { void fly(); } implement

power_to_go 331

为什么你的Nginx配置SM2国密SSL证书失败?这些坑我都帮你踩过了

本文针对Nginx配置SM2国密SSL证书的常见失败原因,提供了详细的排查与解决方案。核心在于使用支持国密算法的Nginx版本(如集成Tongsuo库),正确处理从阿里云等平台获取的证书格式,并正确配置ssl_ciphers等关键参数。文章还解释了浏览器兼容性差异及双证书部署等进阶场景,帮助运维和开发人员高效完成国密合规改造。

weixin_29228203的博客 385

JAVA—JVM详解

JAVA—JVM详解 一、JVM 1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 通过JVM,Java实现了平

weixin_51356824的博客 2万+

华为硬件工程师笔试题

1、基尔霍夫定理的内容是什么?(仕兰微电子)   基尔霍夫定理包括电流定律和电压定律。   电流定律(KCL):在集总电路中,任何时刻,对任一结点,所有流出结点的支路电流的代数和恒等于零。   电压定律(KVL):在集总电路中,任何时刻,沿任一回路,所有支路电压的代数和恒等于零。   2、平板电容公式(C=εS/4πkd)。(未知)   3、最基本的如三极管曲线特性。(未知)   4、描述反馈电路...

weixin_33717117的博客 2万+

企业微信消息推送API实战:5步搞定可信IP与域名配置(含Python代码示例)

本文详细解析了企业微信消息推送API实战中的关键配置步骤,特别是可信IP与可信域名的配置流程。通过5个清晰步骤,结合Python代码示例,指导开发者快速完成安全通信链路搭建,避免常见错误,确保消息推送服务稳定可靠。

qsc9012345的博客 995

JVM——JVM与Java体系结构

JVM简介、OpenJDK和OracleJDK、虚拟机与JVM、JVM整体结构、Java代码执行流程、JVM的架构模型、JVM生命周期、JVM的明星产品

码说芯语的博客 1867

TMC22系列步进电机驱动设计:从静音原理到硬件实战

步进电机驱动是运动控制系统的核心,其性能直接影响设备的精度、噪音和效率。传统驱动方案如A4988采用方波控制,存在转矩脉动大、运行噪音高等问题。而高性能驱动通过优化电流波形与切换策略,从根本上提升了运动质量。其中,**StealthChop2**技术通过同步MOSFET开关与电机反电动势过零点,实现了近乎无声的低速运行;**SpreadCycle**模式则通过逼近正弦波的电流调节,优化了中高速动态性能。这些技术为3D打印机、CNC机床、自动化设备等对静音和精度有要求的场景提供了关键解决方案。本文以广泛应用的

weixin_31858171的博客 353

JVM监控:JVM监控指标、JVM监控界面实现、Java监控JVM

本文概要: 1、监控JVM的哪些指标; 2、一目了然的JVM监控的UI界面; 3、Java代码获取JVM监控状态。 1、监控JVM的哪些指标 javaVersion /** Java版本号 */ ...

tjiyu的博客 1万+

基于opencv-ANN的水果识别模型训练

本文通过opencv-ann-mlp训练模型,实现对五种水果进行分类识别。本文详细介绍该项目的各个过程,包括数据准备、预处理、样本读取、训练数据集制作、训练标签制作、模型参数设置、模型训练,模型测试验证等,总结该过程需要注意的事项。

qq_15985873的博客 3972

从Overleaf上导出Latex论文发布到arxiv详细教程(常见问题与解决)

如果是做cv的论文请选择“Computer Vision and Pattern Recognition”,选择“Artificial Intelligence”可能会被on hold,貌似这个指的是传统的人工智能?我用公司邮箱注册发布一篇论文,一个多月还是“on hold”状态,换成edu邮箱第二天就被发布了。3、有可能是subject class选错了,编辑会帮你手动选择,然后发一封邮件告知你解除……报错缺失bbl等文件,这是因为从Menu中下载的话,是没有bbl文件的。论文被on hold。

沉迷单车的追风少年 3584

这是一篇给Java小白看的JVM文章

很多Java开发人员,还不清楚JVM是什么,就直接涉足JVM调优。很多Java开发人员,说起JVM,只知道运行时数据区域(或称之为JVM内存布局或JVM内存结构)。还有很多Java开发人员,在被问起:“你知道Java内存模型吗?”,答:“知道,Java内存模型分为方法区、堆、…”。虽说“概念”这个词发明出来是为了方便交流和说明问题的,不用太过于较真。但是,答非所问就是你的不对了。如果你属于其中一者,我劝你看完这篇文章。本文就一个目的:认识JVM。

二蛋的博客 1472

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+

Java——jvm篇

汇总了java面试中常见的jvm相关问题

Michael_Jay的博客 3044

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java进程之间以及跟JVM关系

先提出两个问题:1、命令启动了两个java程序,它们之间是什么关系?2、java程序又和JVM之间是什么关系,它们是共用一个JVM,还是每个java程序,都有一个JVM?演示1、用命令启动两个一样的java程序。2、用jvisual观察到有两个WhileTrue程序的进程。进程的概念在多道程序工作的环境下,操作系统必须能够实现资源的共享和程序的并发执行,从而使程序的执行出现了并行、动态和相互制约...

干货 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java-什么是JVM?JVM有什么作用?

在java的学习中会经常见到JVM这个词,但是都没有对JVM有一个明确的解释,我也是在学习过程中遇到了许多知识提及JVM,所以就去查阅资料,写下一些自己查到的理解。 JVM解释 JVM全称为Java Virtual MAchine-Java虚拟机,我们可以直观的从名字上得出一个定义:JVM是java上的一个虚构出来的计算机,是一个位于Java与操作系统之间的中间态。有自己完善的硬件结构,如处理器、...

阿巴卡的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性

编写代码:程序员编写 Java 源代码。编译为字节码:Java 源代码编译为与平台无关的字节码。JVM 执行字节码:在每个平台上都有适配的 JVM 实现,它加载、验证并解释或编译这些字节码,使其在当前平台上执行。标准库封装平台差异:Java 标准库提供了平台无关的 API,隐藏了平台之间的差异。JVM 是执行 Java 字节码的运行时环境,它负责提供内存管理、线程管理等基础功能。JVM 和 Java 之间的关系非常密切,JVM 是 Java 平台不可或缺的组成部分。

weixin_45056021的博客 1337

《剑指JVM》Java与JVM——JVM与Java体系结构——引言篇1

🔥本篇概览:详细讲解了JVM与Java体系结构。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1140

如何通过Java命令行查看JVM参数

要通过Java命令行查看JVM的启动参数,你可以使用Java的java命令结合一些特殊的选项,但是java命令本身并不直接提供一个选项来列出所有JVM启动参数。

DKPT的博客 2138

JVM_Java虚拟机<深入理解Java虚拟机>走进JVM

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?栈:跨平台性、指令集小、指令多、执行性能比寄存器差言包括:Java、Scala、Groovy、Kotlin;

Coastlise的博客 1168

JVM是什么?Java程序为啥需要运行在JVM中?

JVM 代表Java 虚拟机,本质上是一个虚拟机或运行时环境,允许 Java 程序在多个设备和操作系统上运行和操作。Java 程序不能在没有 JVM 支持的机器上运行,它是 Java 运行时环境 (JRE) 的一个组成部分。JVM 具有许多共同运行 Java 程序的规范。它本质上是平台相关的,即每个操作系统都有不同的JVM。规范实现实例规范是正式描述 JVM 实现所需内容的文档,拥有单一规范可确保所有实现都是可互操作的。JVM 实现是满足 JVM 规范要求的计算机程序。

m0_73311735的博客 1249

【Java】JVM

隔离加载类修改类加载的方式扩展加载类防止源码泄露自定义类加载器的父类加载器由方法设置,该方法返回的是。开发人员可以通过继承抽象类java.lang.classLoader类的方式,实现自己的类加载器,以满足一些特殊的需求在JDK1.2之前,在自定义类加载器时,总会去继承classLoader类并重写loadclass()方法,从而实现自定义的类加载类,但是在JDK1.2之后已不再建议用户去覆盖loadclass()方法,而是建议把自定义的类加载逻辑写在findclass()方法中。

athicket 1934

【Java】JVM基本组成

2. 为了提高执行效率,JVM 还会在运行期间,JVM 通过热点代码的统计分析,识别高频的方法调用,循环体、公共模块等,当超过阈值时,JVM 会基于。:在程序运行过程中,随着时间的推移, JIT 开始慢慢发挥了作用,把热点代码编译成本地代码后,以后执行相同的代码,即可直接交给CPU 执行,带来更高的执行效率。:不同的平台,执行字节码时,都需要各自的 虚拟机版本,用于将字节码翻译成当前平台可以执行的。:不同的平台,相同的源代码,编译的字节码是相同的,所以字节码文件可以在不同平台“通用”;

weixin_71491685的博客 1562

JAVA面试-JVM

一文带你吃透JVM,斩获大厂offer。

冲击AI顶流!!! 1076

java(JVM)

JVM的学习和垃圾回收器的学习笔记

m0_64021225的博客 1480

从JVM Instructions看Java

我们都知道Java程序是运行在JVM里面的一段一段字节码,JVM需要做的就是把这些字节码转换成机器语言,使得Java程序能正确的运行在计算机上,说的更底层一点就是正确分配内存,执行CPU计算并且释放内存。所以任何一个程序如果能做到以下几件事:读入Java Class文件、分析Class文件格式、为变量对象方法动态分配内存、管理这些变量和内存的回收,都可以做为我们所谓的虚拟机为Java程序员服务。从

Ant Ren的专栏 1833
上一篇: 在安卓中使用 FFmpegKit 剪切视频并添加文字水印
下一篇: Java垃圾回收(GC)探析
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值