深入理解Java基础概念的高级应用(1/5)
目录
1. Java内存模型:堆、栈与方法区
示例代码:对象存储位置
2. 类加载器的工作原理
示例代码:自定义类加载器
3. JVM如何执行字节码
字节码指令示例
4. Java基础数据类型的存储与操作
自动装箱与拆箱
示例代码:基础类型性能对比
总结
深入理解Java基础概念的高级应用(1/5)
Java是一门强大且灵活的编程语言,而真正从精通到完全掌握它的关键在于对基础概念的深入理解和应用。这篇文章将深入探讨Java内存模型、类加载器的工作原理、JVM字节码的执行机制以及基础数据类型的存储与操作,帮助你理解Java在底层的工作方式。
1. Java内存模型:堆、栈与方法区
Java内存模型是理解Java程序运行方式的基础。Java的内存结构主要分为以下几个部分:
-
堆(Heap):用于存储对象实例,几乎所有对象都在堆上分配。
-
栈(Stack):用于存储方法调用过程中的局部变量及操作数。
-
方法区(Method Area):存储类的元信息、静态变量及JIT编译后的代码。
示例代码:对象存储位置
以下代码展示了局部变量和对象的存储位置:
public class MemoryModelExample {public static void main(String[] args) {int localVariable = 10; // 存储在栈中Person person = new Person("Alice"); // 对象存储在堆中System.out.println(person.getName());}
}class Person {private String name;public Person(String name) {this.name = name;}public String getName() {return name;}
}
在上述代码中,localVariable
是一个局部变量,存储在栈中,而person
指向的Person
对象存储在堆中。
内存区域 | 存储内容 |
---|---|
堆 | 对象实例 |
栈 | 局部变量、方法调用过程 |
方法区 | 类信息、静态变量、常量 |
2. 类加载器的工作原理
类加载器负责将类字节码加载到内存中,是Java动态性的重要保证。类加载器的工作流程主要包括:加载(Loading)、链接(Linking)和初始化(Initialization)。
-
加载:从文件系统或网络中读取类的二进制字节码,生成Class对象。
-
链接:验证字节码的合法性,准备类的静态变量,并为其分配内存。
-
初始化:执行类构造器
<clinit>
方法,完成静态变量的赋值操作。
Java提供了多种类加载器:
-
Bootstrap类加载器:加载JDK核心类库,如
java.lang.*
。 -
扩展类加载器(ExtClassLoader):加载扩展目录中的类。
-
系统类加载器(AppClassLoader):加载应用程序类路径下的类。
示例代码:自定义类加载器
以下示例展示了如何创建一个自定义类加载器:
import java.io.*;public class CustomClassLoader extends ClassLoader {@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {if (!name.startsWith("com.example")) {return super.loadClass(name);}try {String fileName = name.replace('.', '/') + ".class";InputStream is = getClass().getClassLoader().getResourceAsStream(fileName);if (is == null) {return super.loadClass(name);}byte[] bytes = new byte[is.available()];is.read(bytes);return defineClass(name, bytes, 0, bytes.length);} catch (IOException e) {throw new ClassNotFoundException(name, e);}}
}
该自定义类加载器会尝试加载com.example
包中的类,并将其他类委托给系统类加载器。
3. JVM如何执行字节码
Java源码在编译后会生成字节码(.class
文件),这些字节码由JVM执行。JVM将字节码转化为机器指令,通过解释执行或JIT编译优化来提高性能。
字节码指令示例
以下是一个简单的Java方法及其对应的字节码:
public int add(int a, int b) {return a + b;
}
使用javap
命令查看字节码:
$ javap -c MemoryModelExample
Compiled from "MemoryModelExample.java"
public int add(int, int);Code:0: iload_11: iload_22: iadd3: ireturn
上述字节码展示了如何将两个整数加载到操作数栈,然后执行加法操作并返回结果。
4. Java基础数据类型的存储与操作
Java的基础数据类型(如int
、float
、double
等)在性能优化中扮演着重要角色。基础数据类型直接存储在栈中,因此访问速度较快,而对象类型则存储在堆中。
自动装箱与拆箱
Java提供了自动装箱和拆箱的功能,以简化基础类型和对象类型之间的转换。
public class BoxingExample {public static void main(String[] args) {Integer boxedInt = 10; // 自动装箱int unboxedInt = boxedInt; // 自动拆箱System.out.println("装箱后的值: " + boxedInt);System.out.println("拆箱后的值: " + unboxedInt);}
}
尽管自动装箱与拆箱非常方便,但频繁的装箱与拆箱可能带来性能问题,应尽量避免在循环中使用它们。
示例代码:基础类型性能对比
以下代码比较了基础类型和包装类型在大量计算中的性能:
public class PrimitiveVsWrapper {public static void main(String[] args) {long startTime = System.nanoTime();long sum = 0;for (int i = 0; i < 1000000; i++) {sum += i; // 使用基础类型}long endTime = System.nanoTime();System.out.println("基础类型用时: " + (endTime - startTime) + " 纳秒");startTime = System.nanoTime();Long wrapperSum = 0L;for (int i = 0; i < 1000000; i++) {wrapperSum += i; // 使用包装类型}endTime = System.nanoTime();System.out.println("包装类型用时: " + (endTime - startTime) + " 纳秒");}
}
通过运行该代码,可以清楚地看到基础类型的性能远优于包装类型。
总结
在本篇文章中,我们深入探索了Java内存模型、类加载器、JVM字节码的执行以及基础数据类型的存储和性能差异。理解这些核心概念对于掌握Java至关重要,因为它们直接影响到代码的执行效率和程序的稳定性。
在接下来的文章中,我们将进一步探讨面向对象的高级特性和设计模式,帮助你掌握Java中的设计思想和架构原则。希望本篇内容能帮助你对Java的基础概念有更深刻的理解,从而为更高阶的应用打下坚实的基础。
相关文章:

深入理解Java基础概念的高级应用(1/5)
目录 1. Java内存模型:堆、栈与方法区 示例代码:对象存储位置 2. 类加载器的工作原理 示例代码:自定义类加载器 3. JVM如何执行字节码 字节码指令示例 4. Java基础数据类型的存储与操作 自动装箱与拆箱 示例代码:基础类型…...

高可用HA软件
高可用HA(High Availability)软件在分布式系统架构设计中至关重要,它们能够减少系统停机时间,确保应用程序持久、不间断地提供服务。以下是四款常用的高可用HA软件介绍: Keepalived Keepalived起初是为LVS(…...
《近似线性可分支持向量机的原理推导》 拉格朗日函数 公式解析
本文是将文章《近似线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式 9-41 解释: L ( w , b , ξ , α , μ ) 1 2 ∥ w ∥ 2 C ∑ i 1 N ξ i − ∑ i 1 N α i ( y i ( w T x i b ) − ( 1 − ξ …...
9.指针和字符串string类型
指针和字符串string类型 1.指针2.字符串string类型 1.指针 C完全兼容C语言指针,C多出一个this指针 交换两数 #include <iostream>using namespace std;void swap(int *a,int *b){int temp;temp *a;*a *b;*b temp; }int main() {//交换前int a 50;int b …...

八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive
Linux基础环境搭建(CentOS7)- 安装Mysql和Hive 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Orac…...

海量数据面试题
⭐️前言⭐️ 本篇文章主要针对在面试时可能涉及到的海量数据的面试题,该类型面试题常常考虑通过位图、布隆过滤器或者哈希的方式来解决。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何…...

基于SSM积分商城管理系统的设计与实现(源码+lw+部署文档+讲解等)
前言 伴随着基础网络设施的不断进步和终端电子设备的高度普及,互联网用户规模越来越大。现在人们越来越离不开计算机网络、互联网所带来的好处了,现如今不同的网站系统遍地都是,现在已经不同于以往的传统的管理方式了,只有跟上时代…...
MLP预售开启,革新去中心化通信生态:智能手机与AI Agent齐上阵
2024年10月22日,Matrix Layer Protocol(MLP)宣布其备受期待的第一期产品正式进入预售阶段。随着Web3世界的不断发展,去中心化技术已经深入到我们日常生活的方方面面。作为Web3世界中炙手可热的创新项目,Matrix Layer P…...
js获取浏览器指纹
Canvas指纹法 来源:https://www.cnblogs.com/leijing0607/p/8044218.html 从根本上来说,每一种浏览器都会使用不同的图像处理引擎,不同的导出选项,不同的压缩等级,所以每一台电脑绘制出的图形都会有些许不同…...
乐尚代驾的项目问题
订单状态如果在流转的过程中卡住了,怎么办? 卡住的原因有可能是: 网络问题 网络不稳定或中断可能导致订单状态更新的请求无法及时发送或接收。例如,司机端在更新代驾车辆信息时,如果网络出现故障,可能无法…...
uniapp app.onshow 和 onMounted一样用吗
在uni-app中,onShow和onMounted并不完全相同,它们分别属于应用生命周期和组件生命周期。 应用生命周期中的onShow 在uni-app中,onShow是应用生命周期的一部分,它会在应用启动或从后台进入前台时触发。这意味着它不仅仅局限于页…...

基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)
源码地址:https://download.csdn.net/download/2302_79553009/89933699 项目简介 本项目旨在构建一个基于MBTI(迈尔斯-布里格斯性格分类指标)理论的在线平台——“16Personalities”。该平台利用PHP、MySQL、JavaScript等技术栈开发…...

【问题解决】连接mysql时报错caching_sha2_password can not load
一, 问题 在连接Mysql时报错, caching_sha2_password can not load 二,问题原因 报错信息 "caching_sha2_password can not load" 通常出现在尝试连接到使用 MySQL 8.0 或更高版本的数据库时,因为从 MySQL 8.0 开始&a…...

【瑞吉外卖】-day01
目录 前言 第一天项目启动 获取资料 创建项目 编辑 连接本地数据库 连接数据库 修改用户名和密码 编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…...

钉钉与金蝶云星空数据集成:提高企业付款申请单处理效率
钉钉数据集成到金蝶云星空:付款申请单的自动下推生成 在企业日常运营中,如何高效地管理和处理付款申请单是一个关键问题。为了提升这一流程的效率,我们采用了轻易云数据集成平台,将钉钉中的付款申请单数据无缝对接到金蝶云星空系…...

GIT使用list
清空当前commit区 方法 1:软重置到初始状态 如果希望保留文件内容,但清空所有 commit 历史,可以使用以下命令: git reset --soft $(git rev-list --max-parents0 HEAD)解释: --soft 表示重置 commit 历史ÿ…...
JavaSE:数组深入学习与复习
学习参考 1、可变参数传递 数组可以是int等基本数据类型,也可以是String等引用类型 package com.test;public class Main {public static void main(String [] args){int [] a {1,2,3,4,5};test(78,90,12,34,56,78,90,12,34,56,78);}public static void test(i…...

Redis 事务 总结
前言 相关系列 《Redis & 目录》(持续更新)《Redis & 事务 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 事务 & 总结》(学习总结/最新最准/持续更新)《Redis & 事务…...
go sdk的安装或者升级
背景 由于 go 语言的官方sdk还在不断的更新迭代中,有的时候相对应的生态相关的依赖包也在不断的升级,如果很长一段时间不升级自己的本地的go sdk 那么就有可能在拉取代码的时候出现错误,因此有的时候可能需要我们适当的升级下自己的sdk&…...
mongo实操笔记
这个链接我用了其在Windows下的下载安装 是可以的 ,不过我太懒了,没有弄成自启动 Windows安装MongoDB_mongodb windows安装-CSDN博客 下面这个链接就更好了,我用了其与springboot整合的测试。可以直接操作mongodb了。 SpringBoot整合Mongo…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...