openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接
symbols-unix 文件部分内容
JVM_IHashCode
JVM_InitClassName
JVM_InitStackTraceElement
JVM_InitStackTraceElementArray
JVM_InitializeFromArchive
JVM_InternString
要理解在 symbols-unix 文件中包含 JVM_InternString 方法的原因,我们需要从构建过程、符号解析、链接以及符号表管理的角度来分析。
1. 构建系统和符号管理
在构建过程中,make 工具会根据不同的操作系统和目标架构进行条件编译。通过在 make/hotspot/lib/JvmMapfile.gmk 中设置的条件判断,特定的源文件和符号会被包含进来。例如,SYMBOLS_SRC 变量用于指定包含符号定义的文件,这些符号定义最终会被链接器使用,确保程序中的函数能够被正确解析和链接。
make
ifeq ($(call isTargetOsType, unix), true)SYMBOLS_SRC += $(TOPDIR)/make/data/hotspot-symbols/symbols-unix
endif
这段代码表明,当构建目标是 UNIX 系统时,symbols-unix 文件会被添加到 SYMBOLS_SRC 中。SYMBOLS_SRC 中的文件通常包含符号的定义,告诉链接器在链接时需要包含哪些符号。
2. 符号表的作用
在编译链接过程中,链接器依赖符号表来识别程序中的函数和变量。符号表包含了程序中所有函数、变量以及其他符号的名称和地址。JVM_InternString 方法是一个 JNI(Java Native Interface)方法,它在 Java 层调用时会映射到本地方法 JVM_InternString,该方法由 HotSpot 虚拟机提供。
JVM_InternString是 HotSpot 中的本地方法,它的实现通常位于 JVM 相关的 C/C++ 源代码中。Java_java_lang_String_intern是 Java 层的方法,它调用了本地方法JVM_InternString。
为了确保 Java_java_lang_String_intern 在 Java 代码中能正确调用 JVM_InternString,在构建时必须确保 JVM_InternString 在符号表中可见。这就是为什么 symbols-unix 文件中需要包括 JVM_InternString 的符号。
3. JNI 方法调用和符号解析
在 JNI 中,Java 和本地代码通过符号来进行交互。当 Java 方法(如 String.intern)调用本地方法时,它会通过符号解析找到对应的本地方法实现。JVM_InternString 是本地方法的实现,它负责处理字符串的内存管理和字符串常量池的管理。
JNIEXPORT jobject JNICALL
Java_java_lang_String_intern(JNIEnv *env, jobject this)
{return JVM_InternString(env, this); // 调用本地方法
}
在这个代码段中,JVM_InternString 是本地方法的实现,它负责执行字符串的内存管理等任务。为了确保这个方法能正确链接到 Java 层调用的 String.intern 方法,JVM_InternString 必须在符号表中存在。如果它没有出现在符号表中,链接器就无法找到该方法的实现,导致编译错误或运行时错误。
4. 符号表中的定义
symbols-unix 文件正是为此目的存在的,它包含了所有需要在 UNIX 系统上链接的符号定义。这些符号可能是内置的(如 JVM_InternString)或者是外部库中提供的。在构建过程中,symbols-unix 文件会作为一个符号文件被链接器加载,确保所有需要的符号在最终的二进制文件中被正确解析和链接。
5. 总结
通过在 symbols-unix 文件中添加 JVM_InternString 的符号,确保了链接器能够在编译时正确地解析和链接 JVM_InternString 方法。JVM_InternString 是本地方法,它在 JNI 中被调用,并且在符号表中必须存在,以便链接器能找到它的实现。这是构建和链接过程中的一个重要步骤,尤其是在跨平台(如 UNIX 和 Windows)构建时,不同的符号管理方法和符号文件会根据操作系统类型而有所不同。
相关文章:
openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接
symbols-unix 文件部分内容 JVM_IHashCode JVM_InitClassName JVM_InitStackTraceElement JVM_InitStackTraceElementArray JVM_InitializeFromArchive JVM_InternString 要理解在 symbols-unix 文件中包含 JVM_InternString 方法的原因,我们需要从构建过程、符号…...
day16 python(4)——UnitTest
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、UnitTest框架介绍 1.1 UnitTest框架 1.2 unitTest的组成(5部分) 1.2.1 TestCase(测试用例) 1.2.2 TestSuit 和 TestRunner 【方法1】 【方法2】 1…...
Kafka快速扫描
Architecture 系统间解耦,异步通信,削峰填谷 Topic 消息主题,用于存储消息 Partition 分区,通过扩大分区,可以提高存储量 Broker 部署Kafka服务的设备 Leader kafka主分区 Follwer kafka从分区 高性能之道:…...
python打包时候遇到问题:ImportError: DLL load failed while importing _ufuncs: 找不到指定的模块
问题:python打包时候遇到问题:ImportError: DLL load failed while importing _ufuncs: 找不到指定的模块 解决方法 pip uninstall scipy pip install scipy总结:卸载出问题的库并重新安装,再次通过pyinstaller -F -w xxx.py 打包…...
【6】期末复习C#第6套
1.两个指针变量不能 2.函数可以有也可以没有形参 3.开始执行点是程序中的main函数 4.调用函数时形参和实参各占一个独立的存储单元 5.给指针赋NULL值和地址值 6.函数头和函数体 7.(C)形式参数是局部变量 8.在C语言中,一维数组的定义方…...
开源轮子 - EasyExcel01(核心api)
EasyExcel01 - 核心api 本文整理自掘金大佬 - 竹子爱熊猫 https://juejin.cn/post/7405158045662576640 文章目录 EasyExcel01 - 核心api一:初相识EasyExcel1:写入excel入门2:读取Excel入门 二:数据模型注解1:读写通用…...
SpringBoot3+Vue3开发在线考试系统
项目介绍 项目分为3种角色,分别为:超级管理员、老师、学生。超级管理员,负责系统的设置、角色的创建、菜单的管理、老师的管理等功能,也可以叫做系统管理员;老师角色,负责系统业务的管理,包括学…...
2. Kafka入门-开发环境准备
Kafka入门-开发环境准备 1. 环境准备2. Centos7安装2.1 镜像安装2.2 初始化配置2.3 JDK1.8安装 ---------------------------------------------------------------------------------------------- 1. 环境准备 2. Centos7安装 2.1 镜像安装 2.2 初始化配置 设置系统时区 …...
Halcon中histo_2dim(Operator)算子原理及应用详解
在Halcon中,histo_2dim算子是一个用于计算双通道灰度值图像的直方图的工具。以下是对该算子的原理及应用的详细解释: 一、原理 histo_2dim算子的函数原型为:histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )。 输入参数ÿ…...
TCP 与 UDP
TCP与UDP的区别分析 TCP(传输控制协议)和UDP(用户数据报协议)是互联网协议族(TCP/IP)中的两种重要传输层协议。它们在数据传输的方式、特性以及应用场景方面存在显著差异。以下将从多个方面详细分析TCP与U…...
ubuntu 安装更新 ollama新版本
ubuntu 安装更新 ollama新版本 我这里是 2024-12-18 ollama 版本是 0.5.3 1手动下载 ollama-linux-amd64.tgz https://github.com/ollama/ollama/releases 2下载脚本 https://ollama.com/install.sh install.sh 和 ollama-linux-amd64.tgz 在相同路径下 修改:…...
Numpy基本操作
目录 1、生成数组的方法 1.1、生成0和1的数组 1.2、从现有数组生成 1.2.1、生成方式 1.3、生成固定范围的数组 1.4、生成随机数组 1.4.1、使用模块介绍 1.4.2、均匀分布 1.4.3、正态分布 1.4.4、正态分布创建方式 1、生成数组的方法 1.1、生成0和1的数组 import numpy…...
本地部署webrtc应用怎么把http协议改成https协议?
环境: WSL2 Ubuntu22.04 webrtc视频聊天应用 问题描述: 本地部署webrtc应用怎么把http协议改成https协议? http协议在安卓手机浏览器上用不了麦克风本,来地应用webrtc 本来是http协议,在安卓手机上浏览器不支持使…...
基于xiaothink对Wanyv-50M模型进行c-eval评估
使用pypi安装xiaothink: pip install xiaothink1.0.2下载模型: 万语-50M 开始评估(修改模型路径后即可直接开始运行,结果保存在output文件夹里): import os import json import pandas as pd import re from tqdm import tqdm i…...
使用k6进行kafka负载测试
1.安装环境 kafka环境 参考Docker搭建kafka环境-CSDN博客 xk6-kafka环境 ./xk6 build --with github.com/mostafa/xk6-kafkalatest 查看安装情况 2.编写脚本 test_kafka.js // Either import the module object import * as kafka from "k6/x/kafka";// Or in…...
Unity A*算法实现+演示
注意: 本文是对基于下方文章链接的理论,并最终代码实现,感谢作者大大的描述,非常详细,流程稍微做了些改动,文末有工程网盘链接,感兴趣的可以下载。 A*算法详解(个人认为最详细,最通俗易懂的一…...
浏览器要求用户确认 Cookies Privacy(隐私相关内容)是基于隐私法规的要求,VUE 实现,html 代码
Cookie Notices and Cookie Consent | Cookiepedia 1. 法律法规要求 许多国家和地区的隐私法律要求网站在存储或处理用户数据(包括 Cookies)之前必须获得用户的明确同意: GDPR(欧盟通用数据保护条例) 要求ÿ…...
如何设计高效的商品系统并提升扩展性:从架构到实践的全方位探索
在现代电商、零售及企业资源管理系统中,商品管理无疑是核心模块之一。随着市场的变化与企业规模的扩展,商品系统需要具备强大的功能支持以及高效的扩展能力,以应对日益复杂的业务需求。一个设计良好的商品系统不仅仅是一个商品信息的容器&…...
使用计算机创建一个虚拟世界
创建一个虚拟世界是一项复杂而多方面的工作,它涉及多个领域的知识,包括计算机图形学、编程、物理模拟、声音设计、艺术设计等。以下是创建虚拟世界的基本步骤和工具建议: 1. 确定虚拟世界的目标和范围 目标:明确这个虚拟世界的用…...
datasets笔记:两种数据集对象
Datasets 提供两种数据集对象:Dataset 和 ✨ IterableDataset ✨。 Dataset 提供快速随机访问数据集中的行,并支持内存映射,因此即使加载大型数据集也只需较少的内存。IterableDataset 适用于超大数据集,甚至无法完全下载到磁盘或…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
