Java:JVM基础

文章目录

  • 参考
  • JVM内存区域
    • 程序计数器
    • 虚拟机栈
    • 本地方法栈
    • 方法区
    • 符号引用与直接引用
    • 运行时常量池
    • 字符串常量池
    • 直接内存

参考

JavaGuide

JVM内存区域

在这里插入图片描述
在这里插入图片描述

程序计数器

程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,各线程之间计数器互不影响。
程序计数器是唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期与线程同步。

虚拟机栈

除了一些Native方法调用通过本地方法栈实现,其他所有的Java方法调用都是通过栈来实现的,每一次方法调用都会入栈,每一个方法返回都会出栈,每个方法对应一个栈帧,栈帧内部结构如下:
在这里插入图片描述

  • 局部变量表:存放了编译时可知的各种数据类型和对象引用。
  • 操作数栈:主要作为方法调用的中转站,用于存放方法执行过程中产生的中间计算结果和临时变量。
  • 动态链接:当一个方法要调用其他方法时,需要将符号引用转换为调用方法的直接引用,即动态链接。
  • 方法返回:一种是随return语句正常返回,一种是抛出异常,两种都会导致栈帧被弹出,方法结束。

本地方法栈

类似于虚拟机栈,虚拟机栈为虚拟机执行Java方法(字节码)服务,本地方法栈为虚拟机使用的Native方法服务,在HotSpot虚拟机中,两栈合二为一。
Native方法被执行时在本地方法栈也会创建栈帧,结构同上。

堆是Java虚拟机所管理的内存中最大的一块,是所有线程共享的一块内存区域,唯一作用是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。

但随着JIT编译器的发展产生了逃逸分析技术,如果某些方法中的对象引用没有被返回或者未被外面使用,那么对象可以直接在栈上分配内存。

Java堆是垃圾收集器管理的主要区域,在JDK7及之前,堆从垃圾回收的角度被划分为新生代、老年代和永久代;在JDK8之后永久代被元空间取代,元空间使用本地内存。

方法区

方法区是一种设计规范,属于JVM运行时数据区域的一块逻辑区域,是各个线程共享的内存区域,当虚拟机要使用一个类时,它需要读取并解析Class文件获取相关信息,再将信息存入方法区,主要是类信息、字段信息、方法信息、常量、静态变量等。

永久代和元空间是实现方法区的两种方式,弃用永久代的主要原因是: 整个永久代有一个JVM本身设定的固定上限,不能调整,而元空间放在本地内存,不容易溢出。

符号引用与直接引用

符号引用以一组符号来描述所引用的目标,可以是任何形式的字面量,比如类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等,在编译期或者运行期间生成,不依赖于具体的内存地址,而是在运行时根据上下文信息去定位目标。

直接引用时一种直接指向目标的内存地址或者偏移量,与内存地址直接相关,如指向对象实例的指针、指向类的变量的指针等。

在程序运行时需要通过符号引用来找到对应的直接引用,这个过程称为解析,他是Java虚拟机执行引擎的一部分。

使用两种引用的原因:

  • 动态链接:符号引用提供了一种在编译期间和运行期间都能定位目标的方法,使得Java能实现动态链接,即在运行时才确定最终目标。
  • 运行时多态:符号引用提供了一种描述方法的方式,同上。
  • 内存管理:使虚拟机更灵活地进行内存管理,如动态加载和卸载类。
  • 平台无关性:不需要针对不同平台进行特定的编译或链接。

运行时常量池

常量池表,用于存放编译期生成的各种字面量和符号引用,类似符号表。

字面量是源代码中的固定值,包括整数、浮点数和字符串字面量。
符号引用包括类符号引用、字段符号引用、方法符号引用、接口方法符号等。

字符串常量池

字符串常量池是JVM为了提升性能和减少内存消耗针对字符串专门开辟的一块区域,主要是为了避免重复创建字符串。

JDK1.7将字符串常量池移动到堆中,因为永久代垃圾回收效率太低,只有在整堆收集的时候才会被执行,而大量字符串通常是需要被及时回收的,因此移动到堆中。

直接内存

直接内存是一种特殊的内存缓冲区,通过JNI的方式在本地内存中分配。
CSDN

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

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

相关文章

第二十一周周报

文献阅读:Recent Advances of Monocular 2D and 3D Human Pose Estimation: A Deep Learning Perspective 摘要:在本文中,作者提供了一个全面的 2d到3d视角来解决单目人体姿态估计的问题。首先,全面总结了人体的二维和三维表征。…

上传项目的全部依赖到maven私有仓库-nexus

背景 项目之前的私有仓库不能使用了,本地仓库可以,但是一旦clean就没了,所以在本地有依赖的时候可以自己搭建一个maven私有仓库然后将依赖全部上传上去 搭建:使用docker-compose方式搭建 docker-compose文件 version: "3…

游戏框架搭建

使用框架的目标:低耦合,高内聚,表现和数据分离 耦合:对象,类的双向引用,循环引用 内聚:相同类型的代码放在一起 表现和数据分离:需要共享的数据放在Model里 对象之间的交互一般有三…

XUbuntu22.04之显示实时网速(二百一十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Linux进程间通信3——共享内存

目录 1.原理 2.共享内存函数介绍 2.1 shmget 2.2 shmat 2.3 shmdt 2.4 shmctl 3.共享内存使用 例1 例2 1.原理 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存 上申请一块空间,多个进程可以将其映射到自己的虚拟地址空…

[C++]使用纯opencv去部署yolov9的onnx模型

【介绍】 部署 YOLOv9 ONNX 模型在 OpenCV 的 C 环境中涉及一系列步骤。以下是一个简化的部署方案概述,以及相关的文案。 部署方案概述: 模型准备:首先,你需要确保你有 YOLOv9 的 ONNX 模型文件。这个文件包含了模型的结构和权…

【排序】基于快速选择算法的快排实现

目录 一、常用排序算法比较 二、快速选择算法 快速选择 图解快速选择 三、代码实现 一、常用排序算法比较 排序 时间复杂度 空间复杂度 稳定性 插入排序 O(n) O(1) 稳定 希尔排序 O(nlogn)-O(n)取决于增量序列 O(1) 不稳定 选择排序 O(n) O(1) 不稳定 冒泡…

STM32(9)EXTI

EXTI工作原理 EXTI的寄存器组 每个寄存器都是20个比特位,对应EXTI的20路通道,如这6个寄存器的最左边就都是对应通道1的

Spring:EnclosingClass工具类分辨

Spring:EnclosingClass工具类分辨 1 前言 通过Spring的工具分辨EnclosingClass类。 测试类如下: package com.xiaoxu.test.enclosingClass;/*** author xiaoxu* date 2024-01-18* java_demo2:com.xiaoxu.test.enclosingClass.Outter*/ public class …

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点,上图 列表共5条数据,准备输入Author过滤条件进行查询 进入查看详情页,就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能,后来放弃了,想到直接用路由去做可能也不错。有时间再整一套…

Onenote软件新建笔记本时报错:无法在以下位置新建笔记本

报错现象: 当在OneNote软件上,新建笔记本时: 然后,尝试重新登录微软账户,也不行,提示报错: 解决办法: 打开一个新的记事本,复制粘贴以下内容: C:\Users\Adm…

pytest多重断言插件-pytest-assume

最近准备废弃之前用metersphere做的接口自动化,转战pytest了,先来分享下最近接触到的一个插件:pytest-assume。 在使用这个插件之前,如果一个用例里面有多个断言的话,前面的断言失败了,就不会去执行后面的断…