当前位置: 首页 > news >正文

HangZhou Java Journey P1

Java程序运行时类加载机制

下面是对这个流程的详细说明:

  1. JVM启动:当Java程序开始执行时,JVM首先启动。JVM的启动涉及到操作系统级别的进程创建和资源分配。

  2. Bootstrap ClassLoader:JVM启动后,首先会初始化Bootstrap ClassLoader(启动类加载器)。Bootstrap ClassLoader是虚拟机的一部分,通常不继承自java.lang.ClassLoader,而是直接用C/C++代码实现。它的主要作用是加载Java核心库,也就是位于JVM安装目录下的rt.jar(或在后续版本中被分解为多个文件)以及其他依赖的库。

  3. ExtClassLoader(扩展类加载器):在Bootstrap ClassLoader加载完核心API之后,它会创建并启动ExtClassLoader(扩展类加载器)。ExtClassLoader负责加载JVM的扩展目录(如java.ext.dirs系统属性指定的目录)中的类库。这些类库通常是由Sun/Oracle或其他厂商提供的扩展API。

  4. AppClassLoader(应用程序类加载器):接下来,Bootstrap ClassLoader会创建AppClassLoader(应用程序类加载器)。AppClassLoader负责加载CLASSPATH环境变量或在应用中通过Classpath属性指定的类路径上的用户类和包。这是大多数Java应用程序中类的主要来源。

这个类加载流程的设计有几个重要的考虑点:

  • 分层的类加载机制:通过这种层次化的加载方式,可以确保Java核心库的稳定性和安全性。如果用户定义的类和Java核心库中的类有冲突,JVM会选择核心库中的类,从而避免潜在的兼容性问题。

  • 封装和隔离:每个类加载器只负责加载特定范围的类,这样可以在一定程度上隔离不同来源的类,减少类之间的冲突。

  • 委托模型:类加载器在尝试加载一个类时,会先委托给其父类加载器去尝试加载。这种委托模型确保了Java核心库的类总是由Bootstrap ClassLoader加载,扩展类由ExtClassLoader加载,而用户类由AppClassLoader加载。如果父类加载器无法完成加载任务,子类加载器才会尝试自己加载。

  • 热部署:由于类加载器的这种设计,可以实现类的热部署,即在运行时可以动态加载和卸载类,这在开发和测试阶段非常有用。

Java中间缓存变量机制

Java中间缓存变量机制通常指的是Java编译器在编译过程中对变量进行优化的一种技术。这种机制主要体现在Java的热点代码优化(也称为JIT编译器的优化)中,目的是为了提高程序的执行效率。

在Java中,中间缓存变量机制主要涉及以下几个方面:

  1. 逃逸分析(Escape Analysis): 逃逸分析是Java JIT编译器中的一个优化技术,它会分析对象的生命周期和作用域,以确定对象是否被外部方法或线程引用。如果一个对象没有逃逸出方法或线程的作用域,那么它就被认为是“不逃逸”的。对于这样的对象,JIT编译器可以进行一些优化,比如将其分配到栈上而不是堆上,这样可以减少垃圾收集器的工作负担,提高内存访问速度。

  2. 标量替换(Scalar Replacement): 标量替换是逃逸分析的一个延伸。如果逃逸分析确定一个对象不会被其他线程访问,并且它的字段也不会被其他对象或方法引用,那么JIT编译器可能会将这个对象的字段拆分开来,直接在CPU寄存器中存储和操作这些字段,而不是操作整个对象。这种优化可以减少内存访问次数,提高程序的执行速度。

  3. 循环展开(Loop Unrolling): 循环展开是一种通过减少循环控制开销来提高循环执行效率的优化技术。编译器会将循环体中的代码复制多份,以减少循环迭代次数和循环控制的开销。例如,一个循环原本需要执行8次,编译器可能会将其展开为执行2次,每次执行4个操作。

  4. 方法内联(Method Inlining): 方法内联是指编译器在调用方法时,将被调用方法的代码直接插入到调用点,而不是进行常规的函数调用。这样可以减少函数调用的开销,如参数传递、栈帧创建和销毁等。如果内联的是一个小方法,而且被频繁调用,这种方法可以显著提高程序的执行效率。

Java自增运算机制

  • 前置自增(++j:首先将变量的值增加1,然后返回新值。
  • 后置自增(j++:首先返回变量的当前值,然后将变量的值增加1。
int j = 0;
j = ++j + j++ + j++ + j++;
// 结果是?
System.out.println(j);

Java中,整数常量不应该以0开头(除非它们是八进制数)

int 1 = 078; // 078不是有效的八进制或十进制数字。

Java中的隐式转换和运算符重载

在Java中,short s = 0; 后s += 1;s = s + 1; 这两行代码虽然看起来相似,但它们在操作机制上有一些关键的区别。

  • 操作符重载(Operator Overloading)

    • s += 1; 这个表达式使用了复合赋值运算符+=。在Java中,复合赋值运算符并不是直接执行加法操作,而是首先执行加法操作,然后将结果强制类型转换回变量的原始类型。对于short类型的变量,这意味着加法操作实际上是以int类型进行的(因为short类型的变量在表达式中会被提升为int类型),然后结果会被隐式地转换回short类型。
    • s = s + 1; 这个表达式首先执行加法操作,得到的结果也是int类型,然后显式地将结果赋值给s变量。但是,结果不会被隐式地转换回short类型。会出现编译错误,需要手动进行转换。

相关文章:

HangZhou Java Journey P1

Java程序运行时类加载机制 下面是对这个流程的详细说明: JVM启动:当Java程序开始执行时,JVM首先启动。JVM的启动涉及到操作系统级别的进程创建和资源分配。 Bootstrap ClassLoader:JVM启动后,首先会初始化Bootstrap …...

fiddler过滤器使用,隐藏图片、js、css请求

如果抓包过程中不想查看图片、js、css请求,或者只想抓某个ip或者某个网页下的请求,可以在过滤器中设置。 (1)没有开启过滤器 可以看出所有的请求都会抓取,cs、js、图片请求都有 (2)开启过滤器 …...

HTML基础:8个常见表单元素的详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具,持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…...

密码学之哈希碰撞和生日悖论

哈希碰撞 哈希碰撞是指找到两个不一样的值,它们的哈希值却相同 假设哈希函数的取值空间大小为k ,计算次数为n 先算每个值不一样的概率P’ 所以至少两个值相同(即存在哈希碰撞)的概率P为 生日悖论 假设班里有50个人,求班里至少两个人相同…...

SpringBoot + Redis + Lua = 王炸!

经有一位魔术师,他擅长将Spring Boot和Redis这两个强大的工具结合成一种令人惊叹的组合。他的魔法武器是Redis的Lua脚本。 今天,我们将揭开这个魔术师的秘密,探讨如何在Spring Boot项目中使用Lua脚本,以解锁新的可能性和提高性能…...

【Python】搭建 Python 环境

目 录 一.安装 Python二.安装 PyCharm 要想能够进行 Python 开发,就需要搭建好 Python 的环境 需要安装的环境主要是两个部分: 运行环境: Python开发环境: PyCharm 一.安装 Python (1) 找到官方网站 (2) 找到下载页面 选择 “Download for Windows”…...

NVIDIA 发布 Project GR00T 人形机器人基础模型和 Isaac 机器人平台重大更新

系列文章目录 前言 Isaac 机器人平台现可为开发者提供全新的机器人训练仿真器、Jetson Thor 机器人计算机、生成式 AI 基础模型和由 CUDA 加速的感知和操作库。 Project GR00T 是一种多模态人形机器人通用基础模型,作为机器人的大脑,使它们能够学习技能…...

05.循环

格式: 05.循环 01.循环语句02.while循环1.1while循环1.2.死循环1.3 while循环应用 计算123。。。100的和 03.for循环(迭代循环)3.1 基本格式3.2 range() 04.break和continue关键字4.1 break4.2 continue 01.循环语句 02.while循环 03.for循环…...

Git 分布式版本控制系统基本概念和操作命令

目录 Git 基本概念 功能特点 工作流程 操作命令 新建代码库 配置 增删文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 小结 Git Git 是一个开源的分布式版本控制系统,用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计,用于…...

Python3爬取2023省市区

爬取地址https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/ import re import requests import pandas as pd import warnings warnings.filterwarnings("ignore") import time from lxml import etree import pymysql t ,urls ,names [],[],[] INDEX_URL &…...

放弃 Rust 选择 Zig,Xata 团队推出 pgzx —— 计划使用 Zig 开发基于 PG 的分布式数据库

Summary Xata 公司在基于 PostgresSQL 开发自己的分布式数据库,出于 Zig 和 C 语言以及 PostgreSQL 的 API 有更好的互操作性的考虑,他们选择了 Zig 而非当红炸子鸡语言 Rust。他们的博客文章中对 pgzx 进行了介绍。让我们来看下他们对 Zig 和 Rust 语言…...

线性数据结构----(数组,链表,栈,队列,哈希表)

线性数据结构 数组链表栈使用场景 队列应用场景 哈希表特点哈希函数,哈希值,哈希冲突键值对 Entry 开放寻址法和拉链法 参考文档 数组 数组(Array) 是一种很常见的数据结构。由相同类型的元素组成,并且是使用一块连续的内存来存储的。 在数组…...

lvgl 窗口 windows lv_port_win_visual_studio 版本 已解决

不知道的东西,不知道lvgl窗口。一切从未知开始 lv_port_win_visual_studio 主分支 对应的分支 v7版本更新git submodule update --init --recursive同步 lvgl代码随后打开 visualSudio 打开.sln 文件 编译 release模式 允许 一切正常代码部分...

【多模态融合】SuperFusion 激光雷达与相机多层次融合 远距离高清地图预测 ICRA 2024

前言 本文介绍激光雷达与相机进行多层次融合,包括数据级融合、特征级融合和BEV级融合。 融合后的BEV特征可以支持不同的任务头,包括语义分割、实例编码和方向预测,最后进行后处理生成高清地图预测,它是来自ICRA 2024的。 会讲解…...

富格林:梳理正规本领远离虚假套路

富格林悉知,黄金投资者在从事黄金交易之前,必须先了解黄金交易的风险。因为投资虽然能给你带来一定的收益,但往往也有亏损的风险。在进场后投资者可通过正规经验指导有效避免因为虚假诱导带来的异常亏损,增加安全做单盈利机会。以…...

fastadmin学习01-windows下安装部署

下载源代码 官网 安装 解压,然后使用phpstorm打开 修改配置文件 创建数据库 -- drop database fastadmin01; create database fastadmin01;这样fastadmin就部署好了 访问主页也能看到前台页面...

JAVA学习-网络编程.TCP

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它在Java网络编程中被广泛应用。TCP通信可以确保数据的可靠传输,并且具有一定的顺序性。 一、Java中实现TCP通信主要有以下几种方式: 1. Socke…...

[Android]创建Google Play内购aab白包

开发时需要调试Google内购,需要先往Google商店传一个白包上去。确定包名,然后进行内购产品创建。 1.创建一个空项目,填写正式名称和正式包名。 如果你只是为一个测试开发账号打白包,然后进行内购测试,这时包名随便写…...

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解,让大家熟练虚拟机的安装使用,Linux系统的安装配置,学习掌握linux系统常用命令的使用,常用的软件安装方法,制作快照,克隆,完成免密登录&…...

unity中 鼠标按下移动端与pc端的位置

if (Input.GetMouseButtonDown(0)) { Vector2 V Input.touchCount > 0 ? Input.GetTouch(0).position : new Vector2(Input.mousePosition.x, Input.mousePosition.y); } 射线检测 if (Input.GetMouseButtonDown(0)) { …...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...