Java虚拟机:内存区域分配和对象的创建

news2024/11/27 6:14:07

Java虚拟机:内存区域分配和对象的创建

虚拟机内存区域分配

首先上一张图:
在这里插入图片描述
这里主要是看右边的图,这张图描述了JVM中的内存分配区域,其中蓝色的部分是每个线程独有的,而绿色部分是线程共有的。我们以这张图为准,介绍JVM内存区域分配中的各个区域。

程序计数器

它是程序控制流的指示器,分支,循环,跳转,异常和线程恢复等基础功能都要靠它来实现。简单来说它就是控制程序接下来该干什么事的。可以看到它是线程私有的一片区域,因为多线程之间切换回来之后肯定要恢复原来的运行状态,而每条线程的运行状态都是不一样的,所以需要每一条线程都有一个程序计数器。这个计数器记录的是正在执行的虚拟字节码指令的地址;若是本地方法(Native)的话该指示器的值为0。

虚拟机栈(VM Stack)

虚拟机栈描述的是Java方法执行的线程内存模型:每个Java被执行的时候Java虚拟机栈都会同步创建一个栈帧用于存储局部变量表操作数栈动态链接方法出口等信息。每个方法被调用直至执行完毕的过程就对应着一个栈帧从入栈到出栈的过程。

局部变量表中存放着编译器可知的各种基本数据类型和对象引用,一般是指向对象起始地址的引用指针。这些数据类型在局部变量表中用局部变量槽来表示,其中64位的longdouble会占用两个变量槽,其他的则为一个。而具体一个变量槽到底占多大的空间是有具体的JVM来实现的。

本地方法栈

本地方法栈与虚拟机栈很像,不同的就是一个用来描述Java方法,一个用来描述本地方法,在《Java虚拟机规范》中没有规定该区域的语言,使用方式和数据结构,因此每个虚拟机可以自由实现它。

Java堆区

Java堆是虚拟机管理的内存中最大的一块区域。Java堆是被所有的线程所共享的区域,它在虚拟机启动时创建出来,此区域存在的唯一目的就是存放对象实例,Java世界中几乎所有的对象实例都在这里被分配。Java堆还是由垃圾收集器管理的内存区域,因此又被称为GC堆

如果从内存分配的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(用来分配对象用的,防止并发不安全的情况),以提升分配时的效率。根据《Java虚拟机规范》的规定,Java堆可以处于物理上不连续的内存空间中,但是在逻辑上它应当被视为连续的。和操作系统的内存分配很类似。

方法区

方法区也是一块线程共享的内存区域,它用于存储已经被虚拟机加载的类型信息常量静态变量即时编译器编译后的代码缓存等数据。它是堆的一个逻辑部分但是本质上又与堆区分开来

垃圾收集行为在这个区域的确是比较少出现,这区域的内存回收的目标主要是针对常量池的回收和对类型的卸载。

运行时常量池

前面说到方法区中要存放常量,这块区域就叫做运行时常量池,它也是方法区的一部分。编译期间生成的各种字面量和符号引用等在加载之后都会被存放进入方法区的运行时常量池中。

对象的创建

类型的加载

那么Java虚拟机接收到一条new指令之后会发生什么呢。首先它将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载。如果没有的话就要先执行类型加载的过程。

一个Java文件被加载到虚拟机内存中到从内存中卸载的过程被称为类的生命周期。其中类的加载包括了三个阶段,分别是加载,链接初始化。首先虚拟机将查找并加载Class文件。根据《Java虚拟机规范》的描述,加载阶段主要做了三件事情:

  • 根据特定名称查找类或者是接口类型的二进制字节流。
  • 将这个二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  • 在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。

链接过程又可以被分为三个阶段:

    1. 验证:确保被导入类型的正确性。
    1. 准备:为类的静态字段分配字段,并用默认值初始化这些字段。
    1. 解析:虚拟机将常量池内的符号引用替换为直接引用。

链接过程结束之后就进入到初始化阶段,这个阶段中会将该类的变量初始化为正确的值

在这里插入图片描述

内存分配

类型加载完毕之后就是对象实例的内存分配了,在之前的内存区域分配中我们已经知道对象实例的内存实际上是被分配在Java堆区域之中的,既然要分配内存的话肯定是使用还未被分配的内存。为了区分哪些内存已经被分配,哪些还没有被分配就有许多策略,第一种策略便是指针碰撞策略:所有被使用的内存被放在一边,没有被使用过的在另一边,中间有一个指针指向分界线,分配内存时只需要将指针移动即可。
在这里插入图片描述

如果内存空间不是规整的话,那么虚拟机就不能使用指针碰撞了,这个时候虚拟机需要维护一个列表并记录哪些内存是可用的,分配时在这个表中查找到足够大的空间分配给新对象并更新列表,这种策略被称为空闲列表

除此之外还有一个问题就是一个对象被分配之后指针还没有来得及修改另一个对象紧接着就又被分配了,这种情况下就会产生前一个对象被覆盖的问题,为了解决该问题也有两种策略:一种就是将内存分配的行为进行同步,保证分配对象这整个指令原子性的;另一种方法就是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一块内存,称之为**本地线程分配缓冲区。**只有这块缓冲区用完之后才要进行同步。内存分配完之后会将分配到的内存空间都初始化为0。

最后虚拟机还需要对对象进行必要的设置,例如说这个对象是哪个类的实例,如何才能找到类的元数据信息等。这些信息是存放在对象的对象头(Object Header)中的。

初始化

这一切工作都完成之后从虚拟机的角度来说这个对象已经被创建出来了,接下来要执行的Class文件中的<init>方法了,也就是构造函数中的初始化部分。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iptables 四表五链图

iptables 通过配置四表五链&#xff0c;来控制内核多数据包的过滤、记录、转发、修改操作 全局结构图 常用的 filter 和 nat 表联合图 各个表拥有的链图

传导和辐射EMI有什么区别?

当我们设计原型或使用开发板时&#xff0c;通常可以忽略电磁干扰。但EMI在现实生活中的电子设备和系统中是一个重要的主题&#xff0c;工程师有责任确保电路能够在预期的EMI水平下正常运行&#xff0c;并且不会产生过多的EMI。 我倾向于将EMI与无线干扰联系起来&#xff0c;考…

Nginx服务优化措施、网页安全与配置防盗链

目录 一.优化Nginx 二.隐藏/查看版本号 隐藏版本号方法一&#xff1a;修改配置文件&#xff0c;关闭版本号 隐藏版本号方法二&#xff1a;修改源码文件中的版本号&#xff0c;重新编译安装 三.修改用户与组 四.设置缓存时间 五.日志切割脚本 六.设置连接超时控制连接访…

nvme_queue_rq函数分析一

nvme I/O请求时&#xff0c;数据交互分析 主要函数为nvme_queue_rq&#xff1a; static blk_status_t nvme_queue_rq(struct blk_mq_hw_ctx *hctx, const struct blk_mq_queue_data *bd) {struct nvme_ns *ns hctx->queue->queuedata;struct nvme_queue *nvmeq hctx-…

elementui表单的验证问题

elementui表单的验证问题 element ui是基于vue的一个ui框架&#xff0c;用起来还是挺不错的&#xff0c;但是有时候还是会遇到一些摸不着头脑的情况。 ​ 我在打开一个新增数据的对话框的时候出现了一个问题&#xff0c;明明是新增&#xff0c;但是一打开就出现了错误提示&…

Linux虚拟化指南:构建虚拟化环境

虚拟化技术在计算领域具有广泛的应用&#xff0c;能够提高硬件资源的利用率、降低维护成本&#xff0c;并实现灵活的资源分配。Linux作为一种开源操作系统&#xff0c;在虚拟化方面也有多种选择和工具可供使用。下面将介绍如何构建Linux虚拟化环境&#xff0c;并提供一些建议和…

skywalking入门

参考&#xff1a; https://www.jianshu.com/p/ffa7ddcda4ab 参考&#xff1a; https://developer.aliyun.com/article/1201085 skywalking&#xff08;APM&#xff09; 调用链路分析以及应用监控分析工具 Skywalking主要由三大部分组成&#xff1a;agent、collector、webapp-…

强怼美国政府,Zlibrary高调复活,官宣2023年最新网址,免费下载海量电子书籍

去年11月&#xff0c;号称是全球最大电子图书馆的Z-Library被美国FBI封禁&#xff0c;连同下线的还有多达249个备用、影子、镜像、关联域名等。 随后&#xff0c;美司法部在阿根廷逮捕了Z-Library网站幕后的两位策划者。他们被控盗取文化作品牟利&#xff0c;经常在新书出版后几…

HTML5中使用video标签

参考链接 <videocontrolscontrolslist"nodownload noplaybackrate"disablePictureInPicture"true"disableRemotePlayback"true"src"https://www.runoob.com/try/demo_source/movie.mp4"></video>隐藏下载&#xff1a;nod…

ElasticSearch从入门到精通(一)

1. 初识 ElasticSearch 传统数据库查询的问题&#xff1a;如果使用模糊查询&#xff0c;左边有通配符&#xff0c;不会走索引&#xff0c;全表扫描&#xff0c;效率比较慢 倒排索引 将文档进行分词&#xff0c;形成词条和 id 的对应关系即为反向索引。 以唐诗为例&#xff0c…

解决域控制器的传感器配置问题

gpu加速计划 下载东西有时会报没有apt-utils&#xff0c;所以最好先给它下了&#xff1a; sudo apt-get install apt-utils验证&#xff1a; python #输入库 import torch #查看版本 print(torch.__version__) #查看gpu是否可用 torch.cuda.is_available() #返回设备gpu个数…

跨端开发方案之桌面应用小程序

小程序容器技术的未来是充满希望的&#xff0c;它为我们开辟了一个全新的数字世界&#xff0c;连接了桌面操作系统和移动生态系统之间的界限。正如技术不断演进&#xff0c;我们可以期待着更多的创新和发展&#xff0c;为用户带来更加便捷和多样化的应用体验。这一技术的推广和…

用C++写一个生成n个m之内的随机整数的函数

#include <iostream> #include <cstdlib> #include <ctime>using namespace std;void generateRandomNumbers(int n, int m) {srand(time(NULL)); // 初始化随机数种子for (int i 0; i < n; i) {int num rand() % m 1; // 生成 1 到 m 之间的随机整数c…

windwos10系统搭建我的世界服务器,内网穿透实现联机游戏Minecraft

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

麒麟信安的2023世界计算大会时刻

9月15至16日&#xff0c;由工业和信息化部、湖南省人民政府主办的2023世界计算大会在长沙隆重举行。麒麟信安连续五年亮相世界计算大会&#xff0c;本届大会麒麟信安作为计算产业的重要建设者、国家新一代自主安全计算系统产业集群内核心企业&#xff0c;在展览展示、主题演讲、…

基于SSM的金鱼销售平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

LeetCode 23. 合并 K 个升序链表

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 首先我们实现一个合并两个有序链表的操作&#xff0c;然后使用归并的思想对数组中的链表进行排序。 代码 /*** Definition for singly-linked list.* struct ListNode {* in…

基础组件(线程池、内存池、异步请求池、Mysql连接池)

文章目录 1、概述2、线程池2、异步请求池3、内存池 1、概述 池化技术&#xff0c;减少了资源创建次数&#xff0c;提高了程序响应性能&#xff0c;特别是在高并发场景下&#xff0c;当程序7*24小时运行&#xff0c;创建资源可能会出现耗时较长和失败等问题&#xff0c;池化技术…

Spring事件机制之ApplicationEvent

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

vue3 - 前端 Vue 项目提交GitHub 使用Actions自动化部署

GitHub Demo 地址 在线预览 参考文章 使用GithubActions发布Vue网站到GithubPage 使用Github Actions将Vue项目部署到Github Pages 前端使用github pages 部署自己的网站 GitHub Actions自动化部署前端项目指南 前言 vue前端项目写好之后&#xff0c;想部署到线上通过在线地址…