JVM是什么?

JVM (Java Virtual Machine) 是 Java 编程语言的运行环境,它是一个虚拟的计算机,可以在不同的操作系统上运行 Java 程序。JVM 是 Java 的核心部分,提供了将 Java 代码翻译成特定计算机系统指令的功能。以下是 JVM 的一些重要概念和原理的详细说明:

  1. 类装载器(Class Loader):JVM 的类装载器负责将 Java 类加载到 JVM 中。类装载器有多个级别,主要负责加载 Java 核心类库和用户自定义类。

  2. 字节码执行引擎(Bytecode Execution Engine):JVM 的字节码执行引擎将 Java 字节码转换为可执行的机器码,并执行这些机器码。JVM 提供了多种执行引擎,如解释执行引擎和即时编译器。

  3. 即时编译器(Just-In-Time Compiler):JVM 的即时编译器将频繁执行的字节码转换为本地机器码,以提高程序的执行效率。即时编译器会对热点代码进行分析和优化。

  4. 垃圾回收器(Garbage Collector):JVM 的垃圾回收器负责自动回收不再使用的对象内存,以避免内存泄露和程序崩溃。垃圾回收器会周期性地扫描内存,标记和释放无效的对象。

  5. 内存管理系统(Memory Management System):JVM 的内存管理系统负责管理 Java 程序使用的内存。它将内存分成不同的区域,如堆区和栈区,以及方法区和运行时常量池等。

  6. 安全管理器(Security Manager):JVM 的安全管理器用于控制 Java 程序的访问权限。它通过安全策略文件来规定程序可访问的资源和操作。

  7. 多线程支持(Multithreading Support):JVM 支持多线程并发执行,可以通过多线程编程实现并行计算和提高程序的性能。

JVM(Java虚拟机)的主要组成包括以下几个部分

  1. Class Loader(类加载器):负责将字节码文件加载到内存中,并转换成运行时数据结构(Class对象)。
  2. Execution Engine(执行引擎):负责执行Class对象中的字节码指令,通常有解释器和即时编译器两种方式。
  3. Java Native Interface(JNI):提供了与其他语言交互的接口,可以调用本地(C/C++)代码。
  4. Runtime Data Areas(运行时数据区):包含了一些内存区域,主要有程序计数器、Java堆、Java栈、方法区和本地方法栈等。

程序计数器是一块较小的内存区域,它是线程私有的,其作用是记录当前线程所执行的字节码指令的位置。当线程被切换时,通过程序计数器可以准确地恢复到正确的执行位置。程序计数器在多线程间切换和控制线程执行顺序等方面起到重要作用。

javap -v 类名     字节码文件里面执行即可

Java堆(Java Heap)是JVM中最大的一块内存区域,用于存储对象实例。所有的Java对象实例和数组都在堆中分配内存。堆是所有线程共享的,而且是垃圾回收的重点区域。

它被分成新生代和老年代两部分,新对象在新生代分配,而较长时间存活的对象会被移动到老年代。堆的大小可以通过JVM的启动参数进行设置。

  1. 新生代(Young Generation): 新生代是Java堆中的一部分,用于存储新创建的对象。在新生代中,又分为三个部分:Eden区、Survivor区(S0和S1)。
  • Eden区:新创建的对象首先被分配到Eden区,它是新生代中最大的区域。当Eden区满时,就会触发一次Minor GC(Minor Garbage Collection,新生代垃圾回收)。在Minor GC中,Eden区中存活的对象会被复制到Survivor区。

  • Survivor区:Survivor区是两个较小的区域,称为S0和S1。当一次Minor GC发生时,存活的对象会被复制到另一个Survivor区中,并且年龄加一。当某个对象在Survivor区中经过多次复制仍然存活,就会被晋升到老年代。

  1. 老年代(Old Generation): 老年代是Java堆中的另一部分,用于存储长时间存活的对象。在新生代中经过多次复制仍然存活的对象,会被晋升到老年代。老年代相对于新生代来说,其大小一般较大,并且存放的是相对较长时间存活的对象。

老年代中的对象一般需要经过多次的垃圾回收才会被清理掉。当老年代空间不足时,就会触发一次Major GC(Major Garbage Collection,全局垃圾回收),即进行一次完整的垃圾回收,包括新生代和老年代的垃圾回收。

需要注意的是,除了新生代和老年代之外,在Java堆中还有一些其他的区域,比如永久代(Permanent Generation)和元空间(Metaspace)。永久代主要存储类的信息、方法信息等,而元空间则用来存储这些信息。在Java 8及以上版本中,永久代已经被元空间取代。

在Java堆中,还包括了一个内存区域——方法区(Method Area)。方法区用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它也被多个线程共享,而且是GC的主要回收区域。

  1. 虚拟机栈是Java虚拟机在运行Java程序时所使用的一块内存区域,用于存储局部变量、方法调用和返回的信息。
  2. 虚拟机栈是线程私有的,每个线程都有自己的虚拟机栈,因此是线程安全的。
  3. 每个栈由栈帧组成,栈帧用于存储方法的局部变量表、操作数栈、动态链接信息、方法返回地址以及一些额外的附加信息。
  4. 垃圾回收一般不涉及栈内存,因为虚拟机栈中的栈帧会随着方法的调用和返回而动态地入栈和出栈,当方法调用结束后,栈帧会自动被销毁,不需要进行垃圾回收。
  5. 栈内存的分配大小取决于系统的设计和限制,过大的栈内存可能会导致系统资源的浪费,而过小的栈内存可能会导致栈溢出的问题。所以栈内存的大小应根据具体应用的需求进行合理的配置。
  6. 方法内的局部变量只在方法的执行期间存在,并且每个线程都会有自己的副本,在方法内部是线程安全的。但是如果一个局部变量被多个线程共享或作为实例变量,可能需要考虑线程安全性。
  7. 栈内存溢出情况通常指虚拟机栈的溢出,即栈帧过多导致栈空间不足。当调用深度过大或者栈帧太大时,都可能导致栈内存溢出。溢出时会抛出StackOverflowError或OutOfMemoryError异常。

方法区 

  1. 方法区(Method Area)是Java虚拟机的一部分,用于存储类的结构信息、常量、静态变量、即时编译器编译后的代码等数据。
  2. 方法区的作用是用于存储类的相关信息,包括类的成员变量、方法、构造函数等。同时,方法区还用于存储类的常量池、字节码等。
  3. 方法区位于Java虚拟机的堆之外,通常与堆分开并行回收。具体的位置可以根据虚拟机的实现而有所不同。
  4. 常量池(Constant Pool)是方法区的一块重要部分,用于存储编译期生成的各种字面量和符号引用。常量池的作用是为了提供一种节省空间和方便使用的方式,存储字符串、数字、类、方法、字段等常量。在执行时,可以通过常量池中的索引快速定位到具体的常量值。常量池的执行是在编译期完成的,编译器会将常量值直接存储在常量池中,并在运行时进行引用。
  5. 运行时常量池是Java虚拟机在运行时动态创建的一个存放常量的区域,它是方法区的一部分。在Java源代码中,所有的字面量(如字符串、数字、符号等)都被称为常量,并且它们都会被编译器放入到常量池中。而运行时常量池则是在类加载完成后,将常量池中的符号引用替换为直接引用,并且可以进行动态的扩展。

    运行时常量池中的常量包括两种类型:字面量常量和符号引用。字面量常量指的是字符串、数字等具体的值,而符号引用则是指向字符串字面量、类和接口的全限定名、字段的名称和描述符等。

    运行时常量池的目的是为了提高程序的运行效率和节约内存空间。它可以在类加载时将常量池中的常量缓存在内存中,以减少频繁的创建和销毁。同时,它还可以对常量进行共享、重用,以节约内存的使用。

 

直接内存 

 

  1. 直接内存是一种由操作系统管理的内存,不受Java虚拟机(JVM)直接控制,也不直接受Java堆或方法区的限制。它是通过Java NIO(New Input/Output)库中的ByteBuffer来进行操作的。

  2. 直接内存位于操作系统的虚拟内存空间中,通常是通过调用操作系统的本地方法来分配和释放。

  3. 直接内存的作用是提供一种高效的内存操作方式,可以在对外部I/O进行高速读写时减少数据从Java堆复制到直接内存的开销。它可以通过零拷贝(Zero-copy)技术直接操作内存,提高数据读写的效率。

  4. 直接内存的实用之处在于它可以用来优化各种I/O操作,比如网络传输、文件操作、数据库连接等。直接内存还可以被用于创建内存映射文件,将一个文件直接映射到内存中,从而实现更加高效的文件读写操作。此外,直接内存还可以通过使用操作系统提供的一些特殊机制来实现堆外内存的分配和释放,从而避免了Java堆的GC压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/292086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java容器学习,一文读懂Java容器使用知识文集。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

龙芯loongarch64服务器编译安装tensorflow-io-gcs-filesystem

前言 安装TensorFlow的时候,会出现有些包找不到的情况,直接使用pip命令也无法安装,比如tensorflow-io-gcs-filesystem,安装的时候就会报错: 这个包需要自行编译,官方介绍有限,这里我讲解下 编译 准备 拉取源码:https://github.com/tensorflow/io.git 文章中…

危险品内陆运输相关知识_箱讯科技

危险品拖车 危险品拖车运输是一项涉及到高度危险物质的专业工作,需要确保合法合规的运输,并提供必要的信息以保障公共安全。进行这类运输时,需要携带一系列文件和具备特定的资质。 什么样的车适合做危险品拖车? 1、车辆类型:通…

分享一个项目——Sambert UI 声音克隆

文章目录 前言一、运行ipynb二、数据标注三、训练四、生成总结 前言 原教程视频 项目链接 运行一个ipynb,就可操作 总共四步 1)运行ipynb 2)数据标注 3)训练 4)生成 一、运行ipynb 等运行完毕后,获得该…

当下流行的直播技术demo演示

nginx-http-flv-module(更新不是很频繁) SRS: https://ossrs.net/lts/zh-cn/(独立官网,目前最新稳定版version5) 基于SRS搭建直播demo演示: 一、搭建流媒体服务器 参见官网:https://ossrs.ne…

海康威视对讲广播系统 RCE漏洞复现(CVE-2023-6895)

0x01 产品简介 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 0x02 漏洞概述 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞,该漏洞源于文件/php/ping.php的参数jsonda…

开关柜无线测温装置安装的重要性有哪些?

随着工业4.0的逐步推进,现代电力工业不断向着大容量和高电压的迅速发展,对电力系统供电可靠性的要求越来越高,电力系统的稳定运行已经成为首要目标。在电力系统中,温度是衡量电力设备是否正常运行的重要标准之一。随着工业用电负荷的不断增长,为了避免电…

JavaOOP篇----第十篇

系列文章目录 文章目录 系列文章目录前言一、构造方法能不能显式调用?二、什么是方法重载?三、构造方法能不能重写?能不能重载?四、内部类与静态内部类的区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

CSS新手入门笔记整理:CSS3弹性盒模型

特点 子元素宽度之和小于父元素宽度,所有子元素最终的宽度就是原来定义的宽度。子元素宽度之和大于父元素宽度,子元素会按比例来划分宽度。在使用弹性盒子模型之前,必须为父元素定义“display:flex;”或“display:inline-flex;”。 弹性盒子…

鸿萌推荐:数据库恢复软件 Systools SQL Server Recovery Manager

Systools SQL Server Recovery Manager 支持恢复和导出SQL数据库 MDF、NDF和BAK文件,是 SQL Server 数据库恢复的一款优质软件。 Systools SQL Server Recovery Manager 性能 分析 SQL Server LOG 数据库事务将 MDF、LDF 和 BAK 文件导出到位于网络上的 SQL Serve…

【YOLOv8新玩法】姿态评估解锁找圆心位置

前言 Hello大家好,今天给大家分享一下如何基于深度学习模型训练实现圆检测与圆心位置预测,主要是通过对YOLOv8姿态评估模型在自定义的数据集上训练,生成一个自定义的圆检测与圆心定位预测模型 制作数据集 本人从网络上随便找到了个工业工件…

Map集合体系

Map集合的概述 Map集合是一种双列集合,每个元素包含两个数据。 Map集合的每个元素的格式:keyvalue(键值对元素)。 Map集合也被称为“键值对集合”。 Map集合的完整格式:{key1value1 , key2value2 , key3value3 , ...} Map集合的使用场景…