Java 虚拟机 跨平台

虚拟机隐藏平台差异,解决不同平台代码运行结果不一致问题,实现Write Once, Run Anywhere,实现用户代码跨平台。它本身是一个操作系统上的应用程序,将字节码文件翻译成特定机器的机器码。

Java 虚拟机 运行时内存区域

虚拟机隐藏内存区域,自动实现内存分配与垃圾回收,使用户专注逻辑实现。

JVM 将运行时数据区分成五块:堆,方法区,虚拟机栈,本地方法栈,程序计数器。

堆是内存区域最大的一块,存放对象实例。所有线程共享。它是垃圾回收器 GC 主要管理的区域。堆中也存在线程私有区域(Thread Local ALlocation Buffer)以提升效率。Java 参数 -Xmx -Xms 可以设定 Java 堆大小。

方法区也是线程共享区域。相对于堆,垃圾回收没有那么频繁,条件也更苛刻。它存放存储虚拟机加载的类型信息,常量,静态变量,即时编译器代码缓存。垃圾回收主要针对常量池和类型卸载。JVM 将字节码文件中的字面量,符号引用放入运行时常量池。内存不足也报OOM。

虚拟机栈对应线程。每个线程一个栈,且二者生命周期相同。线程执行的方法对应栈帧。栈帧保存局部变量表,操作数栈,返回地址等。调用和返回方法对于栈帧入栈和出栈。如果无限递归,栈深度超出阈值,报StackOverflowError。如果内存不足,OOM。
局部变量表存放方法所需的局部变量和返回地址。对于基本类型,直接存放值,对于引用类型,存放指针。局部变量表基本单位是四字节的 slot。小于四字节的 boolean,byte,char,short 变量也占据一个 slot。

本地方法栈与虚拟机栈类似,执行的是 native 方法,即非 Java 方法。

程序计数器指示当前线程执行字节码行号,用于控制程序流程。线程上下文切换期间记录当前线程执行行号,下次获取时间片后从当前行号继续执行。程序计数器不会内存溢出,线程私有。

直接内存不是虚拟机运行数据区一部分,它不由 JVM 管理,不受 JVM 大小限制。NIO 使用本地方法分配堆外内存(即直接内存,机器直接分配的内存),通过堆内的 DirectByteBuffer 对象引用堆外内存,避免数据在堆内堆外来回复制。

对象的创建

第一步,要求虚拟机已经加载类。
第二步,为对象分配内存。类加载时就确定大小。分配内存的方法有:指针碰撞和空闲列表。指针碰撞:将堆分为两块,一块已分配,另一块未分配,指针为边界,两块不能有交错。移动指针分配空空闲内存。空闲列表:已分配与未分配交错,维护一个列表,记录可用列表块。虚拟机采用CAS+重试实现线程安全地分配内存。
第三步,初始化内存,将实例字段初始化为零值。
第四步,设置对象头。
第五步,执行构造函数。

对象布局

对象在堆内存中分三块:对象头,实例数据,对齐填充。对象头包含两部分:对象运行时数据和类型指针。运行时数据包括:GC 年龄,哈希码,锁状态。类型指针指向类型元数据。如果是对象是数组,还包含数组长度。
实例数据包含对象字段。父类定义的变量在子类之前,相同长度的字段总是分配在一起。
对齐填充:对象起始地址必须是八字节的整数倍。

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

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

相关文章

[学习笔记-AI基础篇]03_Transfommer与GPT架构学习

介绍GPT-1,GPT-2,GPT-3,GPT-4 GPT-1 介绍2018年6月,OpenAI公司发表了论文"|mproving Language Understanding by Generative Pre-training”《用生成式预训练提高模型的语言理解力》,推出了具有1.17亿个参数的GPT-1(Generative Pre-trainingTransformers,生成式预训练变换…

HPNetworkCheckControl.dll HPEnvRes.dll hpcasl.dll HpBwcDecode.dll HpBlogic.dll hpbhilxres.dll

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

飞算 JavaAI:给需求分析装上 “智能大脑“

在软件开发的漫长旅途中,需求分析是至关重要的起点,其精准度与效率直接关乎整个项目的成败。传统的需求分析依赖人工梳理,不仅耗费大量时间与精力,还时常出现理解偏差和逻辑漏洞。而飞算 JavaAI 的横空出世,犹如为需求…

javacc学习笔记 01、JavaCC本地安装与测试

文章目录前言本章节源码一、什么是javacc二、Mac环境安装javacc三、javacc测试案例1、编写词法描述文件2、借助javacc命令来处理demo01.jj文件3、idea配置输入参数,运行Adder类方法四、javacc文件编译类描述4.1、demo1.jj文件生成内容描述&解析转换过程4.2、解析…

Java基础-stream流的使用

目录 案例要求: 实现思路: 代码: 总结: 案例要求: 实现思路: 创建一个包含学生姓名(String)和选择地址变量(集合)的实体类,然后将题干数据封装到集合,然后进行stream操作 代码: import ja…

virtualbox+UBuntu20.04+内存磁盘扩容

写在前面:1.由于我写博客都是偏向个人笔记性质的,所以写的比较粗糙,如果有疑问私信评论我即可。2.这篇博客的解决方法应该算是“全网”首发吧,因为我为了磁盘扩容真的找了好多相关资料,但是基本都没有用。如果你也是找…

关于对Spring的理解,以及对spring中的两大核心概念AOP和IOC的理解

我们先来说一说Spring,从总体上Spring就是一个基础框架,同时Spring给我们提供了一个Bean容器,用来装载和管理具体的Bean对象,你像我们之前创建对象的时候就是通过new关键字来实现的,但是现在我们只需要告诉容器有哪些对…

Next Terminal 实战:内网无密码安全登录

本文首发于 Anyeの小站,点击阅读原文体验更加。 前言 在日常的 HomeLab 或小型私有云环境中,我们常常通过反向代理(如 Nginx、Caddy 等)将内网服务暴露到公网,方便远程访问。然而,一旦端口映射开启、公网…

WebSocket断线重连机制:保障实时通信的高可用性

一、为什么需要断线重连?WebSocket虽提供全双工通信能力,但实际环境中连接稳定性受多重威胁:​​网络层波动​​:Wi-Fi切换、4G/5G信号抖动(触发onclose事件)​​服务端异常​​:服务器宕机、主…

低空三维多物理场耦合风洞试验,保证飞行器的性能安全是低空飞行的底线,是低空经济发展的基础

风墙\风矩阵开发背景:2024年被称为中国低空经济产业发展元年,国家发改委提出“无安全、不低空”原则,要求低空经济产业在技术研发、适航认证、运营管理各环节优先保障安全。目前无人机及其他低空飞行器技术已深度融入军事、民用与工业领域&am…

中文基于Qwen3-235B-2507蒸馏数据集的操作

中文基于Qwen3-235B-2507蒸馏数据集的操作 flyfish 方式1 from datasets import load_dataset from transformers import AutoTokenizer# -------------------------- 配置参数 -------------------------- TOKENIZER_PATH "/media/models/models/Qwen/Qwen3-8B/" #…

论文阅读笔记:《Dataset Distillation by Matching Training Trajectories》

论文阅读笔记:《Dataset Distillation by Matching Training Trajectories》1.动机与背景2.核心方法:轨迹匹配(Trajectory Matching)3.实验与效果4.个人思考与启发主体代码算法逻辑总结一句话总结: 这篇论文通过让合成…

STM32标准库的工程创建

一.所需文件说明 1.启动文件startup_xxxx.s 作用:初始化堆栈指针、复位向量、中断向量表,执行 SystemInit() 后跳转到 main()。 位置:Libraries/CMSIS/Device/ST/STM32Fxx/Source/Templates/arm/ 文件名: startup_stm32f10x_l…

k8s ceph sc 设置文件系统格式化参数

前言 默认的 sc 文件系统 inode 太少,对于小文件场景,往往会出现容量没满,inode 已经用尽的情况,本文说明如何设置 inode。 说明 本文使用的是 rook-ceph 部署的 ceph 作为存储后端。 xfs 文件系统 sc 创建带格式化参数的 xfs 文件系统的 sc allowVolumeExpansion: t…

关于Npm和Nvm的用法

npm是个什么东西 npm是什么 node package managernodejs包管理工具处理复杂的包的管理的问题那么使用npm以后就不需要从前端引入相应的代码和文件等。 npm相关的命令 查看版本npm -v 更新npm install npm5.4.0 更新到最新版本npm install npmlatest 初始化项目 npm ini…

MyBatis高效查询:简化JDBC开发实战

Mybatis MyBatis 是一款优秀持久层(DAO)框架,用于简化 JDBC 开发 ,原是 Apache 开源项目 iBatis,经历迁移改名,2010 年从 Apache 迁到 Google Code 并改名,2013 年 11 月迁至 GitHub,官网为 https://mybati…

系统信息及进程管理命令

系统信息及进程管理 一、系统信息查看 常用命令:uname、hostnam、hostnamectl、uptime、df、du、free、lscpu 1、uname (1)、命令简介 uname 是一个在 Unix 和类 Unix 系统(如 Linux、macOS)中常用的命令行工具,用于显示系统信息。…

【Z字形变换】

代码思路分析:Z 字形变换 1. 边界情况处理 if (r 1 || r > n) return s;r 1:只有一行,直接返回原字符串(无需变换)。r > n:行数大于等于字符串长度,每行只有一个字符,直接返…

VBA中类的解读及应用第二十五讲:把源数据赋给类利用类完成查找

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,…

Vue3核心语法进阶(Hook)

Vue3 自定义 Hook:让你的代码像乐高一样“可复用”!大家好,我是你们的前端小伙伴!上一篇我们聊了 Vue3 的生命周期,今天咱们继续深入 Vue3 的核心利器——自定义 Hook(Custom Hook)。如果你已经…