HangZhou Java Journey P1
Java程序运行时类加载机制
下面是对这个流程的详细说明:
-
JVM启动:当Java程序开始执行时,JVM首先启动。JVM的启动涉及到操作系统级别的进程创建和资源分配。
-
Bootstrap ClassLoader:JVM启动后,首先会初始化Bootstrap ClassLoader(启动类加载器)。Bootstrap ClassLoader是虚拟机的一部分,通常不继承自java.lang.ClassLoader,而是直接用C/C++代码实现。它的主要作用是加载Java核心库,也就是位于JVM安装目录下的rt.jar(或在后续版本中被分解为多个文件)以及其他依赖的库。
-
ExtClassLoader(扩展类加载器):在Bootstrap ClassLoader加载完核心API之后,它会创建并启动ExtClassLoader(扩展类加载器)。ExtClassLoader负责加载JVM的扩展目录(如java.ext.dirs系统属性指定的目录)中的类库。这些类库通常是由Sun/Oracle或其他厂商提供的扩展API。
-
AppClassLoader(应用程序类加载器):接下来,Bootstrap ClassLoader会创建AppClassLoader(应用程序类加载器)。AppClassLoader负责加载CLASSPATH环境变量或在应用中通过Classpath属性指定的类路径上的用户类和包。这是大多数Java应用程序中类的主要来源。
这个类加载流程的设计有几个重要的考虑点:
-
分层的类加载机制:通过这种层次化的加载方式,可以确保Java核心库的稳定性和安全性。如果用户定义的类和Java核心库中的类有冲突,JVM会选择核心库中的类,从而避免潜在的兼容性问题。
-
封装和隔离:每个类加载器只负责加载特定范围的类,这样可以在一定程度上隔离不同来源的类,减少类之间的冲突。
-
委托模型:类加载器在尝试加载一个类时,会先委托给其父类加载器去尝试加载。这种委托模型确保了Java核心库的类总是由Bootstrap ClassLoader加载,扩展类由ExtClassLoader加载,而用户类由AppClassLoader加载。如果父类加载器无法完成加载任务,子类加载器才会尝试自己加载。
-
热部署:由于类加载器的这种设计,可以实现类的热部署,即在运行时可以动态加载和卸载类,这在开发和测试阶段非常有用。
Java中间缓存变量机制
Java中间缓存变量机制通常指的是Java编译器在编译过程中对变量进行优化的一种技术。这种机制主要体现在Java的热点代码优化(也称为JIT编译器的优化)中,目的是为了提高程序的执行效率。
在Java中,中间缓存变量机制主要涉及以下几个方面:
-
逃逸分析(Escape Analysis): 逃逸分析是Java JIT编译器中的一个优化技术,它会分析对象的生命周期和作用域,以确定对象是否被外部方法或线程引用。如果一个对象没有逃逸出方法或线程的作用域,那么它就被认为是“不逃逸”的。对于这样的对象,JIT编译器可以进行一些优化,比如将其分配到栈上而不是堆上,这样可以减少垃圾收集器的工作负担,提高内存访问速度。
-
标量替换(Scalar Replacement): 标量替换是逃逸分析的一个延伸。如果逃逸分析确定一个对象不会被其他线程访问,并且它的字段也不会被其他对象或方法引用,那么JIT编译器可能会将这个对象的字段拆分开来,直接在CPU寄存器中存储和操作这些字段,而不是操作整个对象。这种优化可以减少内存访问次数,提高程序的执行速度。
-
循环展开(Loop Unrolling): 循环展开是一种通过减少循环控制开销来提高循环执行效率的优化技术。编译器会将循环体中的代码复制多份,以减少循环迭代次数和循环控制的开销。例如,一个循环原本需要执行8次,编译器可能会将其展开为执行2次,每次执行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)) { …...

增强现实(AR)在广告中的力量
The Power of AR in Advertising 写在前面 增强现实(AR -Augmented Reality)是指借助软件、应用程序和智能手机、平板电脑或耳机等设备,为日常生活添加视觉和音频元素的技术。如今,品牌和广告商可以在营销活动中使用AR࿰…...

日志收集监控告警平台的选型思考
目前市面上比较常见的日志收集系统有:ELK,Grafana Loki,OpenObserve,SigNoz,Graylog ,Syslog-ng,Highlight,接下来我会对这几个一一做分析。 1. ELK ELK 是 Elasticsearch、Logsta…...

苹果Find My产品需求增长迅速,伦茨科技ST17H6x芯片供货充足
苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、Ai…...

题目:忐忑楼梯Ⅱ
问题描述: 解题思路: 利用差分,当第一个以后的差分元素都为零时就代表楼梯高度等于第一个楼梯的高度。为什么是第一个呢,因为以第一个为标准的区间操作数最少。 注意点:每次都只能加一或减一,ans开ll 题解&…...

TS函数类型
函数类型表达式 function hello(x: string) {console.log(x) } //greeter函数的参数是一个函数fn,fn也有一个string类型参数,无返回值。 function greeter(fn: (a: string) > void) {fn(hello) } greeter(hello)也可以把定义参数类型的语句单独提取出…...

数据链路层(四):数据链路层协议
目录 1 数据链路层协议1.1 异步协议1.2 同步协议1.3 局域网数据链路层协议1.4 广域网数据链路层协议 1 数据链路层协议 数据链路层“协议”也称为“规程”,数据链路控制协议也称数据链路控制规程。 数据链路控制协议主要分为异步协议和同步协议两大类。 1.1 异步协…...

#Linux系统编程(孤儿进程及僵尸进程以及wait函数)
(一)发行版:Ubuntu16.04.7 (二)记录: (1)概述 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的ÿ…...

苍穹外卖项目-01(开发流程,介绍,开发环境搭建,nginx反向代理,Swagger)
目录 一、软件开发整体介绍 1. 软件开发流程 1 第1阶段: 需求分析 2 第2阶段: 设计 3 第3阶段: 编码 4 第4阶段: 测试 5 第5阶段: 上线运维 2. 角色分工 3. 软件环境 1 开发环境(development) 2 测试环境(testing) 3 生产环境(production) 二、苍穹外卖项目介绍 …...

学习笔记(16)函数防抖和节流
JavaScript 中的函数防抖(Debounce)和函数节流(Throttle)是两种优化频繁触发事件回调函数执行的技术,它们主要用于限制函数调用的频率,尤其是在处理高频率触发且响应开销较大的用户交互场景时。 函数防抖 …...

【揭秘】空号检测平台挑选秘籍:让每一分钱都花在“刀刃”上
在数字化营销时代,精准的数据是企业制胜的关键。而空号检测平台作为数据清洗的重要工具,其选择的正确与否直接影响到营销效果与成本效益。如何在众多平台中慧眼识珠,找到最适合自己的“黄金搭档”?今天,就跟着企讯通一…...