每日学习Java之一万个为什么

JVM的加载过程

  • 启动阶段:启动JVM实例,设置初始配置参数,加载核心类库如java.lang
  • 类加载器:自举加载器,扩展加载器,系统加载器,自定义加载器。分别负责- 1.核心类库rt.jar等 2.扩展目录下的类库ext目录 3.应用类路径下的类库 classpath
  • 类加载:加载二进制数据存储方法区,检查安全性,准备分配内存并设置初始默认值,解析常量池中的符号引用转换为直接引用,执行静态变量赋值和静态代码块,完成类的初始化工作。
  • 字节码执行:解释执行,即时编译,垃圾回收
graph TD;A[启动JVM] --> B[初始化JVM];B --> C[加载核心类库];C --> D[类加载器];D --> E[Bootstrap ClassLoader];D --> F[Extension ClassLoader];D --> G[System ClassLoader];D --> H[自定义类加载器];E --> I["加载核心类 (rt.jar, etc.)"];F --> J["加载扩展类 (ext目录)"];G --> K["加载应用类 (classpath)"];H --> L["加载自定义类"];I --> M[验证];J --> M;K --> M;L --> M;M --> N[准备];N --> O[解析];O --> P[初始化];P --> Q[字节码执行];Q --> R[解释执行];Q --> S[JIT 编译];Q --> T[垃圾回收];subgraph 初始化JVMB1[设置系统属性]B2[加载安全管理器]B3[初始化内存管理]B4[初始化线程调度]B5[初始化信号处理]B6[初始化JNI接口]B --> B1 & B2 & B3 & B4 & B5 & B6endsubgraph 加载核心类库C1[加载 rt.jar]C2[加载其他核心库]C --> C1 & C2endsubgraph 类加载器E1[加载 java.lang.Object 等核心类]F1[加载 javax.swing 等扩展类]G1[加载用户应用程序类]H1[加载特定位置或方式的类]E --> E1F --> F1G --> G1H --> H1endsubgraph 验证M1[文件格式验证]M2[元数据验证]M3[字节码验证]M4[符号引用验证]M --> M1 & M2 & M3 & M4endsubgraph 准备N1[为静态变量分配内存]N2[设置默认初始值]N --> N1 & N2endsubgraph 解析O1[将常量池中的符号引用转换为直接引用]O --> O1endsubgraph 初始化P1[执行静态变量赋值]P2[执行静态代码块]P --> P1 & P2endsubgraph 字节码执行R1[逐条解释执行字节码指令]S1[将热点代码编译为本地机器码]T1[识别并回收不再使用的对象]Q --> R1 & S1 & T1end

Java中的本地方法native

在Java中,本地方法是一种机制,允许java代码调用非java代码。这些代码被编译成共享库如Windows上的DDL文件,通过JNI java native interface 与JVM虚拟机交互。

通过这种方式,java程序可以利用底层操作系统的功能,提高性能和访问特定硬件资源。

本地方法实现:

  • native声明
public class MyClass {public native void myNativeMethod();
}
  • 头文件生成
javac -h . MyClass.java
  • 使用System.loadLibrary(“libName”)加载共享库
  • 实现本地方法并通过JNI与JVM通信
#include "MyClass.h"
#include <jni.h>JNIEXPORT void JNICALL Java_MyClass_myNativeMethod(JNIEnv *env, jobject obj) {// C/C++ 实现
}gcc -shared -o libmylib.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux MyClass.cpublic class Main {static {System.loadLibrary("mylib");}public static void main(String[] args) {MyClass myClass = new MyClass();myClass.myNativeMethod();}
}

Java中的常见native方法

  • System类中的arraycopy currenTimeMillis
// 声明本地方法
public native static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
public native static long currentTimeMillis();// 实现本地方法
JNIEXPORT void JNICALL Java_java_lang_System_arraycopy(JNIEnv *env, jclass cls, jobject src, jint srcPos, jobject dest, jint destPos, jint length) {// C/C++ 实现
}JNIEXPORT jlong JNICALL Java_java_lang_System_currentTimeMillis(JNIEnv *env, jclass cls) {// C/C++ 实现
}
  • java.io.FileInputStream 中的 readBytes
// 声明本地方法
private native int readBytes(byte b[], int off, int len) throws IOException;// 实现本地方法
JNIEXPORT jint JNICALL Java_java_io_FileInputStream_readBytes(JNIEnv *env, jobject thisObj, jbyteArray bytes, jint offset, jint length) {// C/C++ 实现
}
  • java.util.zip.ZipFile :open 和 getNextEntry
// 声明本地方法
private native long open(String name, boolean shared, long lastModified, FileDescriptor fdobj) throws IOException;
private native ZipEntry getNextEntry(long jzfile);// 实现本地方法
JNIEXPORT jlong JNICALL Java_java_util_zip_ZipFile_open(JNIEnv *env, jobject zipFileObj, jstring name, jboolean shared, jlong lastModified, jobject fdObj) {// C/C++ 实现
}JNIEXPORT jobject JNICALL Java_java_util_zip_ZipFile_getNextEntry(JNIEnv *env, jobject zipFileObj, jlong jzfile) {// C/C++ 实现
}

编程中的Entry出处

entry有两个意思,代码中的entry通常就有两类方法,一个指的是入口。
例如汇编程序中的伪指令 ENTRY 指的是程序入口
一个指的是条目例如键值对,数据行。

Java中的Entry 接口

参考文章

为什么流的toString 有 $ 号

常规toString,Object类下的实现

public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}

在Java中,$ 符号出现在类名中通常是因为该类是内部类或辅助类。具体到ReferencePipeline$Head,这里的 $用于区分外部类和内部类的名字。ReferencePipeline是一个实现流(Stream)操作的基础抽象类,而Head是它的一个静态内部类。

ReferencePipeline.Head代表了流的头部或者说是起始点,它是流的第一个处理阶段,负责从数据源获取元素,并开始一系列中间操作和终端操作。使用内部类可以帮助组织代码,使代码更加模块化和清晰,同时也有助于封装实现细节,避免不必要的暴露。

在Java编译器生成的字节码文件中,内部类的名字通常会包含一个 $符号,以示区分。例如,如果有一个名为OuterClass的外部类和一个名为InnerClass的内部类,那么编译后的字节码文件可能会被命名为OuterClass $InnerClass.class。这是Java语言规范的一部分,用以确保不同类之间的名字空间隔离。因此,在查看类名或调试时看到 $符号是正常的,它指示了一个内部类的存在。

参考文章

静态内部类Head源码:

   static class Head<E_IN, E_OUT> extends ReferencePipeline<E_IN, E_OUT> {/*** Constructor for the source stage of a Stream.** @param source {@code Supplier<Spliterator>} describing the stream*               source* @param sourceFlags the source flags for the stream source, described*                    in {@link StreamOpFlag}*/Head(Supplier<? extends Spliterator<?>> source,int sourceFlags, boolean parallel) {super(source, sourceFlags, parallel);}/*** Constructor for the source stage of a Stream.** @param source {@code Spliterator} describing the stream source* @param sourceFlags the source flags for the stream source, described*                    in {@link StreamOpFlag}*/Head(Spliterator<?> source,int sourceFlags, boolean parallel) {super(source, sourceFlags, parallel);}@Overridefinal boolean opIsStateful() {throw new UnsupportedOperationException();}@Overridefinal Sink<E_IN> opWrapSink(int flags, Sink<E_OUT> sink) {throw new UnsupportedOperationException();}// Optimized sequential terminal operations for the head of the pipeline@Overridepublic void forEach(Consumer<? super E_OUT> action) {if (!isParallel()) {sourceStageSpliterator().forEachRemaining(action);}else {super.forEach(action);}}@Overridepublic void forEachOrdered(Consumer<? super E_OUT> action) {if (!isParallel()) {sourceStageSpliterator().forEachRemaining(action);}else {super.forEachOrdered(action);}}}

Object类下的本地方法

  • getClass
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface IntrinsicCandidate {
}@IntrinsicCandidatepublic final native Class<?> getClass();
  • hashCode
    @IntrinsicCandidatepublic native int hashCode();
  • clone
    @IntrinsicCandidateprotected native Object clone() throws CloneNotSupportedException;
  • notify
    @IntrinsicCandidatepublic final native void notify();
  • notifyAll
    @IntrinsicCandidatepublic final native void notifyAll();
  • wait
    public final native void wait(long timeoutMillis) throws InterruptedException;

stream()方法

参考

    default Stream<E> stream() {return StreamSupport.stream(spliterator(), false);}
    public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel) {Objects.requireNonNull(spliterator);return new ReferencePipeline.Head<>(spliterator,StreamOpFlag.fromCharacteristics(spliterator),parallel);}

java.util.function 中的 consumer 以及 Stream接口中的接口Builder

Java中的自我类型引用

interface BaseStream<T, S extends BaseStream<T, S>> 

这种设计在Java的流式APi中被广泛使用,例如Stream IntStream接口。

T 是第一个泛型参数,代表流中的元素类型。例如,在Stream< String> 中,T就是String。

S 是第二个泛型参数,它表示一个具体的子类型,并且必须是BaseStream的某个实现类或者子接口。

S extends BaseStream <T,S> 这种设计允许你在接口中返回当前类型的实例,从而实现链式调用。

也就是说,我这个接口的实现类支持返回自己,从而再次调用stream中的方法。

参考

如果没有子类型引用会是这样:

public interface BaseStream<T> {BaseStream<T> filter(Predicate<? super T> predicate);BaseStream<T> map(Function<? super T, ? extends T> mapper);
}

那么我方法返回值就无法进行链式调用,因为无法访问stream的特有方法

今日灵感(文字功底有限)

到底什么是学习:无论是Spring轻量级框架,数据库,还是中间件八股文算法。这些东西的本质好像都没有变过,就是解决问题。所以学习就是一个不断解决问题的过程,如果你看到了问题却没有解决,选择安于现状或者取捷径,这无疑会毁了你自己。如果你对陌生问题急切地寻求答案,也许你需要冷静一下。如果你决定去寻找经典问题、母题,亲身体验解决过程后再附上一个小故事,这样,史书上的一页就轻轻印刻在我们后来人的灵魂中。

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

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

相关文章

每日一题---

深拷贝和浅拷贝的区别是什么&#xff1f; null 浅拷贝是指只复制对象本身和其内部的值类型字段&#xff0c;但不会复制对象内部的引用类型字段。换句话说&#xff0c;浅拷贝只是创建一个新的对象&#xff0c;然后将原对象的字段值复制到新对象中&#xff0c;但如果原对象内部有…

Chrome 扩展开发 API实战:Sessions (六)

1. 引言 chrome.sessions 是 Chrome 扩展开发者工具的一部分&#xff0c;提供了对最近关闭的标签页和窗口的访问&#xff0c;以及对会话恢复功能的支持。现代浏览器的一个显著特点是为用户提供更多的便利性&#xff0c;比如快速恢复意外关闭的页面。通过 chrome.sessions API&…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息&#xff0c;您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南&#xff0c;帮助您完成这一过程&#xff1a; 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户&#xff08;如果您还没有的话&#xff09;。在Twi…

学习15天:pytest

1、.pytest强大的插件 pytest-html(生成html格式的自动化测试报告) pytest-xdist测试用例分布式执行。多CPU分发。 pytest-ordering 用于改变测试用例的执行顺序 pytest-rerunfailures用例失败后重跑 allure-pytest 用于生成美观的测试报告。 2、规则&#xff1a; 模块…

Springboot+mybatis实现增删改查操作

继续写一下删除操作&#xff0c;删除有些不一样&#xff0c;首先在controller里面&#xff0c;我们需要改一下路由&#xff0c;我们后面要写/{id}传入路径参数&#xff0c;用PathVariable注解绑定id&#xff0c;剩下的都一样&#xff0c;传入id&#xff0c;然后写service和mapp…

Visual Studio里的调试(debugging)功能介绍

参考 1- Introduction to Debugging | Basic Visual Studio Debugging&#xff08;这是一位印度博主视频&#xff0c;我下面做到笔记也主要参考她的视频&#xff0c;但不得不说口音太重了&#xff0c;一股咖喱味&#xff09; 目录 个人对调试浅显的认识和对调试的介绍逐行调…

Java多线程与高并发专题——原子类和 volatile、synchronized 有什么异同?

原子类和 volatile异同 首先&#xff0c;通过我们对原子类和的了解&#xff0c;原子类和volatile 都能保证多线程环境下的数据可见性。在多线程程序中&#xff0c;每个线程都有自己的工作内存&#xff0c;当多个线程访问共享变量时&#xff0c;可能会出现一个线程修改了共享变…

c语言笔记 作用域

目录 作用域的基本概念 1.函数声明的作用域 2.局部变量的作用域 3.全局作用域 4.static修饰后的作用域 作用域的基本概念 在c语言中&#xff0c;我们的标志符是具有一定的可见范围的&#xff0c;我们称这个可见范围为作用域 在软件开发中&#xff0c;我们要确定好标识符的作…

MySQL数据库知识总结

MySQL数据库知识总结 一、基本概念及其介绍二、数据库中的数据类型&#xff08;一&#xff09;数值类型&#xff08;二&#xff09;字符串类型&#xff08;三&#xff09;日期类型 三、数据库基础语法&#xff08;一&#xff09;数据库的常用操作&#xff08;二&#xff09;数据…

SpaceSync智能排班:重构未来办公空间的神经中枢

文心智能体平台可免费使用DeepSeek 满血版啦&#xff0c;使用DeepSeek模型创建并提交智能体&#xff0c;即有机会瓜分万元奖金&#xff01;有这等好事还不快冲&#xff01; 文心智能体官网&#xff1a;文心智能体平台AgentBuilder | 想象即现实 本片文章为作者参加文心智能体平…

Blender-MCP服务源码3-插件开发

Blender-MCP服务源码3-插件开发 Blender-MCP服务源码解读-如何进行Blender插件开发 1-核心知识点 1&#xff09;使用Blender开发框架学习如何进行Blender调试2&#xff09;学习目标1-移除所有的Blender业务-了解如何MCP到底做了什么&#xff1f;3&#xff09;学习目标2-模拟MC…

每日一题---dd爱框框(Java中输入数据过多)

dd爱框框 实例&#xff1a; 输入&#xff1a; 10 20 1 1 6 10 9 3 3 5 3 7 输出&#xff1a; 3 5 这道题要解决Java中输入的数过多时&#xff0c;时间不足的的问题。 应用这个输入模板即可解决&#xff1a; Java中输入大量数据 import java.util.*; import java.io.*;pu…

Qlik Sense New Install with Restore

Background In case you meet the upgrade issue like us , you can follow the below step to recover the existing data to new installed Qlik Sense . Powered by Moshow郑锴-CSDN博客 please follow below steps: pgsql dump backupbackup table into sql by DBeaverst…

大数据-spark3.5安装部署之standalone模式

真实工作中还是要将应用提交到集群中去执行&#xff0c;Standalone模式就是使用Spark自身节点运行的集群模式&#xff0c;体现了经典的master-slave模式。集群共三台机器&#xff0c;具体如下 u22server4spark&#xff1a; master worker u22server4spark2&#xff1a; worke…

Uniapp 开发 App 端上架用户隐私协议实现指南

文章目录 引言一、为什么需要用户隐私协议&#xff1f;二、Uniapp 中实现用户隐私协议的步骤2.1 编写隐私协议内容2.2 在 Uniapp 中集成隐私协议2.3 DCloud数据采集说明2.4 配置方式3.1 Apple App Store3.2 Google Play Store 四、常见问题与解决方案4.1 隐私协议内容不完整4.2…

【C++】 —— 笔试刷题day_5

刷题day_5 一、游游的you 题目链接&#xff1a;游游的you 题目解析 题目要求&#xff1a; 输入a&#xff0c;b&#xff0c;c表示y、o、u三个字母的个数&#xff1b; 将这些字母连成字符串&#xff0c;并且这里you三个字母相邻获得2分&#xff0c;两个o字母相邻获得1分。 让我…

78. Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 懒加载数据源实现解析&#xff1a;BasicDataSource与CommonLazyDataSourceModel详解 文章目录 Harmonyos NEXT 懒加载数据源实现解…

如何打包数据库mysql数据,并上传到虚拟机上进行部署?

1.连接数据库&#xff0c;使得我们能看到数据库信息&#xff0c;才能进行打包上传 2. 3. 导出结果如下&#xff0c;是xml文件 4.可以查询每个xml文件的属性&#xff0c;确保有大小&#xff0c;这样才是真实导出 5跟着黑马&#xff0c;新建文件夹&#xff0c;并且把对应的东西放…

Springboot+mabatis增删改查,设置不可重复字段

今天又学会了一个操作&#xff0c;我们数据库中&#xff0c;可能要求一个字段名字不可以重复&#xff0c;我们就进行这样的操作&#xff01;设计表&#xff0c;然后点击索引&#xff0c;选择字段&#xff0c;加入索引类型和索引方法&#xff0c;然后ctrlS保存!即可 如果一旦还…

C# NX二次开发:矩形阵列和线性阵列等多种方法讲解

大家好&#xff0c;今天讲一些关于阵列相关的UFUN函数。 UF_MODL_create_linear_iset (view source)&#xff1a;这个函数为创建矩形阵列。 intmethodInputMethod: 0 General 1 Simple 2 Identicalchar *number_in_xInputNumber in XC direction.char *distance_xInputSpac…