自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

阿达King哥的博客

如何看透了生活的本质依然热爱生活

  • 博客(285)
  • 资源 (13)
  • 问答 (1)
  • 收藏
  • 关注

原创 JVM openjdk原理和源码分析目录

逐步深入JVM核心原理

2025-11-07 16:24:23 314

原创 hotspot中的Java类对象如何保存注解

摘要:HotSpot虚拟机通过Annotations类保存Java类对象的注解信息,包括类注解(_class_annotations)、字段注解(_fields_annotations)及其类型注解(_class_type_annotations/_fields_type_annotations)。注解在字节码解析阶段被提取,其中类注解作用于类声明,类型注解作用于泛型等类型声明。InstanceKlass类通过_annotations字段维护所有注解信息,支持运行时通过反射获取。这种机制实现了JDK5.0引

2026-01-18 10:10:13 58

翻译 Java模块化之旅

Java 9模块化系统(JPMS)是Java平台的重要革新,它通过模块描述文件(module-info.java)实现了代码的强封装和更好的组织管理。本文全面介绍了模块的概念、结构(包含包、资源和描述文件)以及四种模块类型。重点解析了10种模块指令的用法,包括依赖声明(requires)、API导出(exports)、服务提供(provides...with)和反射控制(opens)等。同时介绍了默认模块分类和命令行操作,帮助开发者理解如何将现有项目迁移到模块化架构。通过模块化,Java应用可以获得更好的封

2026-01-10 19:49:35 46

原创 在Windows11下编译openjdk 21

本文介绍了在Windows 11系统下编译OpenJDK 21的详细步骤。主要流程包括:1)下载OpenJDK 20作为boot JDK;2)安装Cygwin并配置必要工具包;3)安装Visual Studio 2022及C++开发组件;4)调整系统语言设置为英文;5)通过VS命令行启动Cygwin环境;6)编写并执行编译脚本,区分debug和release两种版本。文中提供了完整的配置脚本,包含路径设置、工具链指定等关键参数,并说明了编译过程中的注意事项。该方法利用Windows下的Cygwin模拟UNI

2026-01-07 19:44:42 159

原创 如何禁止C++类对象的禁止拷贝操作

本文介绍了在C++中禁止类对象拷贝操作的两种方法:1) 通过将拷贝构造函数声明为delete来禁止对象拷贝;2) 通过删除赋值运算符来防止对象赋值导致的指针问题。文章通过具体代码示例展示了如何实现这两种禁止操作,并详细分析了如果不禁止赋值操作可能引发的内存泄漏问题。最后给出了正确的实现方式,确保类对象不会被错误拷贝或赋值,从而避免潜在的内存管理问题。

2025-12-26 14:11:52 377

原创 关于C++中的typedef typename的含义

本文解释了C++中typedef typename的用法,主要用于模板编程中声明依赖类型。通过示例展示了如何在模板类Table中使用typedef typename CONFIG::Value VALUE来定义类型别名,并说明了当模板参数为IntConfig或SymbolTableConfig时,编译器如何解析这些类型定义。文章还提到现代C++更推荐使用using VALUE = typename CONFIG::Value的语法,并以JVM hotspot中的符号表实现为例,演示了这种技术在实践中的应用场

2025-12-23 11:26:49 152

翻译 深入理解JVM工具:Dynamic Attach和Serviceability Agent

本文深入探讨了JVM诊断工具Dynamic Attach和Serviceability Agent的核心特性与差异。Dynamic Attach支持实时监控和动态加载代理,适合低开销的实时诊断;而Serviceability Agent则提供对JVM内部结构的深度访问,适用于事后分析和复杂问题排查。文章通过内存泄漏案例展示了二者如何互补使用,并总结了各自适用场景:Dynamic Attach适合运行中监控,Serviceability Agent则擅长深度分析和事后调试。这些工具共同增强了JVM的性能分析和

2025-11-21 15:11:10 54

原创 详解PCA9685的PWM编程原理

摘要:PCA9685是一款通过I2C控制产生PWM信号的芯片,支持2.3-5.5V供电。它内置12位计数器(0-4095)和25MHz晶振,利用预分频寄存器(PRE_SCALE_REG)调整输出频率。频率计算公式为pre_scale_val = (25MHz/4096freq)-1。编程流程包括:I2C连接→设置MODE1寄存器→进入休眠模式→写入预分频值→唤醒芯片。典型应用如设置50Hz伺服电机频率,通过计算得到预分频值30。该芯片最多可寻址8个I2C从设备,默认地址0x40。

2025-10-29 20:37:45 636

原创 Arduino的TIMSK编码

2025-08-30 21:21:39 127

原创 Arduino的CS编码

2025-08-30 21:08:13 159

原创 Arduino的WGM编码

2025-08-30 20:53:44 142

原创 C++虚函数表

本文介绍了使用Visual Studio和GDB调试工具分析C++类内存布局的方法。通过在VS中配置/d1 reportAllClassLayout命令,可以输出类的内存结构。文章重点分析了三种情况:无虚函数类、带虚函数类以及继承类。通过反汇编和内存监视,展示了虚函数表(__vfptr)的结构,说明虚函数调用机制。对于继承类,详细演示了基类函数被覆盖时的内存布局变化。调试结果表明,虚函数表指针位于对象首地址,其中保存了虚函数的调用地址。

2025-05-26 10:33:13 513

原创 C#接口的setter或getter的访问性限制

在C#中,可以通过限制setter的访问性来实现只对外提供getter,而属性的赋值只能在内部进行。例如,在LibA命名空间中定义一个接口ITranslation,其中MyDict属性的setter被标记为internal,这样外部只能读取该属性,而不能直接设置。在LibB中实现该接口时,setter只能在内部使用。通过反射动态创建对象时,可以在LibA中访问setter进行赋值。这种设计适用于需要控制属性访问权限的场景,确保属性的安全性。

2025-05-19 15:07:38 390

原创 雅思口语 Part 1 Math

雅思口语King在回答关于数学的问题时,首先强调了数学在日常生活中的重要性,特别是在没有计算器的情况下,乘除法在计算折扣价格时非常有用Math Do you think mathematics is important? Well,Yes. From my personal perspective, mathematic is of great importance for us in our daily lives since it can help us to r...

2025-05-13 15:33:12 1257

原创 C++的构造函数和析构函数

构造函数和析构函数在C++中分别用于对象的初始化和清理。构造函数在对象创建时自动调用,其名称必须与类名相同;析构函数在对象销毁时调用,名称前加~符号。对象的生命周期由{}界定,构造函数在对象声明时调用,析构函数在对象离开作用域时调用。例如,在函数内部,对象的创建和销毁顺序遵循最近{}原则,即先创建的对象后销毁。通过合理使用构造函数和析构函数,可以确保资源的正确分配和释放。

2025-05-12 17:05:20 290

原创 openjdk底层(hotspot)汇编指令调用(一)——汇编指令及指令编码基础

计算机通过识别0和1的电信号执行指令,早期程序员直接使用二进制编程,但易出错且不便记忆。为此,厂商定义了汇编指令,如x64平台的push %rbx对应二进制0x53。

2025-05-11 20:58:23 1092

原创 JVM局部变量表和操作数栈的内存布局

局部变量表(locals)包括了函数内部的临时变量和形参,另外还包括了当前函数的this指针操作数栈实现了Java虚拟机的栈式操作在openjdk的实现中,局部变量表位于解释栈的高地址处,用locals寄存器定位局部变量表并根据偏移值获取值;操作数栈位于解释栈的低地址,用sp寄存器定位实现字节码逻辑。

2025-05-07 11:19:12 574

原创 栈是如此重要——C函数栈传参

可以看到add2的函数栈在构建时,在rbp的高8位是回到main函数的地址(RA)。在C的main函数调用add2函数前,将第一个参数和第二个参数分别放在了rdi和rsi寄存器中,那么在进入add2的汇编片段时,这2个寄存器将会将值放在内存栈中。由于是O0选项进行的gcc编译,因此对C程序不做优化,上述汇编是将内存栈空间作为过渡,将值传递给参数寄存器。,当main调用add2时会传2个参数到add2执行的汇编片段,那么这2个参数是如何在栈上布局的呢?在进入add2之前,栈的形式如下。

2025-04-30 16:46:19 474

原创 栈是如此重要——C函数栈

栈为先进后出的数据结构在《数据结构》中有C的栈实现算法,然而很少看到对于栈有什么作用的描述。考虑一个场景,当CPU在计算时需要将某些值临时保存,待当前需要处理的事情处理完毕之后,重新把这些数据还原。此时应该怎样做?典型的应用就是函数调用,比如add2(2,3);return 0;在上述程序中,add2会调用add3函数,当调用add3函数前,计算机必须保留下add2函数的位置,以便在add3结束之后可以返回到add2处理的位置。此时,栈就起到了记录现场的作用。

2025-04-27 11:22:31 742

原创 字节,字节码,字节码文件,字节码指令

计算机一般是一个字节一个字节的读取数据,使用字节进行编码符合计算机的读取数据的流程。第三,使用通用的字节码指令针对的是纯软件的虚拟机,其内容与平台无关。因此使用字节码的程序很方便移植,甚至可以说不需要任何操作,直接放在有Java虚拟机的机器上运行即可,实现了。这些字节根据Java虚拟机规范的要求在不同的位置表达不同的意思。由于电路实现上的原因,计算机的计数方式为二进制,即由0和1组成。为了方便的表示字节,一般采用16进制的形式。生成的.class文件为01组成的文件,使用vs code的。

2025-04-24 09:43:37 1145

原创 配置openjdk调试环境

如何调试openjdk

2025-04-22 21:02:45 873

原创 关于编译和调试OpenJDK的一些问题

由于`OpenJDK`的编译环境是跟操作系统紧密相关的,所以,当分析`OpenJDK`代码的时候,首先应该阅读`README.md`,确定当前阅读的`OpenJDK`能够在哪些环境下进行编译和调试。这里将一些基本需要解决的问题进行阐述。

2025-04-21 14:25:11 631

原创 在Ubuntu 18.04下编译OpenJDK 11

链接: https://pan.baidu.com/s/1QAdu-B6n9KqeBakGlpBS3Q 密码: 8lho不同版本的jdk会要求在不同版本的Ubuntu下编译,不要用太高版本的Ubuntu或者gcc,特别是gcc,这个跟glibc的版本还绑定,如果gcc版本太高,则glibc版本也高,也会影响openjdk的编译。gcc7,freetype2可以直接使用apt-get install安装先configure,再makeconfigure可以参考openjdk/doc/building.htm

2025-04-21 13:50:36 641

原创 Java虚拟机(JVM)平台无关?相关?

平台无关是因为其执行过程是由纯软件实现的栈式计算机实现,而平台相关是因为Java虚拟机的具体操作跟平台指令和操作系统相关。不仅如此,为了能够实现**“一次编译,处处执行”**,Java虚拟机还能根据不同的操作系统进行适配,对于有些与操作系统和CPU结合的部分,也提供了不同的实现。所以,如果有程序要实现一个加法,那么在计算机底层执行时,其执行的内容是不一样的。上生成的.class文件,其内容是一样的。Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。

2025-04-17 17:25:21 939

原创 C++的*了又*

先看下面一段代码主函数这里首先在堆中创建了一个HeapWord对象的空间,然后其首地址放入heapword中然后又在堆中创建一个HeapWord对象的空间,然后其首地址放入p中然后声明一个变量p1,该对象指向一个指针,该指针指向的是HeapWord类型。

2025-04-11 16:30:30 251

原创 Unable to create an object of type ‘DbContext‘. For the different patterns supported at 原因

如果没有设置为“始终复制”则可能导致其配置文件无法复制到bin目录下,则。有可能是代码中设置数据库连接的文件没有设置为“始终复制”时找不到对应的数据库连接。

2024-08-19 14:00:26 1133

原创 如何在asp.net mvc的视图中判断Model的一个属性为null

假设Model.InstFormatID为空。因为最后渲染成html的时候会变成下面的代码。所以得绕一下,改动代码如下。使用如下代码是不能判断的。

2024-05-20 16:52:50 414

原创 JQuery删除指定行

在增加行的js代码中指定函数delInst进行删除行操作。注意,这里传$(this)参数作为当前行的引用。,然后调用JQuery的remove操作即可。

2024-02-05 09:36:32 771

原创 JQuery的$(this)在if之后会变化

此时用浏览器调试发现,每选择一次下拉框就会导致链接字符串变长。$(this)`了。此时不再有链接长度变长的情况。

2024-01-22 16:47:38 544

原创 JQuery异步加载表格选择记录

首先在页面中定义一个表格对象

2024-01-09 09:07:12 594

原创 在ASP.NET MVC中使用JQuery提供的弹出窗口(模态窗口)

使用图层灵活显示在浏览器的任何位置。默认情况下指定不可见。

2024-01-08 15:35:48 1015

原创 运算符的优先级(规矩是人定的)

先乘除后加减的本质就是运算符的结合性9+5*2等价于9+(5*2)这里要注意一个问题,无论是都是左结合的。因此加减法的产生式为乘除法的产生式为现在问题是如何把上述两个产生式混合在一起,并且符合先乘除后加减。

2024-01-02 22:38:03 791

原创 运算符的结合性(形神兼备)

在编译原理中,产生式就是权威。表达式如果以某产生式进行语法分析,那么就只能按照它的方式进行表达,且不能具有二义性。但是,在表达式中有时会涉及打括号的问题。很多时候,在原表达式中打括号和原表达式等价。比如但有时候却不等价 ,比如在编译原理中,括号代表了运算符的结合性,如果运算符以左侧为标准则被称为左结合的,此时在左侧打括号和不打括号等价。反之亦然。

2023-12-26 23:41:57 982

原创 二义性(说话装X有罪)

上述二者都是二义性表达,在离散数学上来看都不具有唯一表示。在《编译原理(第二版)》中对二义性有这样的定义一个文法可能有多棵语法分析树能够生成同一个给定的终结符号串,这样的文法称为具有二义性(ambiguous)。注:ambiguous,在英文中是模糊的意思。那么反言之,如果表达式不具有二义性则应为一个文法如果有且只有一棵语法分析树可以生成给定的终结符号串,那么该文法不具有二义性。有关语法分析树的内容参见语法分析树(先看例子再看定义)-CSDN博客说话要说明白,意思表达要唯一,不要没事装逼!

2023-12-25 15:17:07 1110

原创 语法分析树(先看例子再看定义)

如果非终结符A有一个产生式A->XYZ,那么在语法分析树种就可能有一个标号为A的内部结,该结点有3个子结点,从左到右标号分别为X、Y、Z。如图给定一个上下文无关文法,则该文法就有一颗语法分析树(parse tree)

2023-12-23 23:16:59 1347

原创 编译器语法推导(1)基本定义(逐句举例对照)

在中,我们讲到了两个概念,分别是终结符号和非终结符号。回忆一下二者。词法单元,不可再变词法变量,尚未确定比如其终结符号为if, (), {}非终结符号为expr, stmt。

2023-12-22 09:46:13 490

原创 什么是文法产生式(尽量写简单了)

一个典型的if-else语句可由下述构造规则表达其中变量名全称stmtstatementexprexpression比如if(i==0){return 1;涉及术语产生式(production)终结符号(terminal)if, (), {}非终结符号(nonterminal)expr, stmt上下文无关文法(context-free grammar)由四部分构成终结符号集合:也被称为”词法单元“非终结符号集合:也称为”语法变量“产生式集合。

2023-12-21 16:10:34 1123

原创 静态单赋值(SSA)(只讲形式不讲实现)

除了三地址代码之外,静态单赋值(SSA)是另一种表现形式。

2023-12-21 14:47:47 748

原创 什么是DAG(只讲概念不讲算法)

编译器的目的是将源程序编程目标代码(汇编)放入计算机执行。这里有一个问题,世界上有很多不同架构的CPU,比如x86,ARM等。不同架构的CPU有不同的汇编。于是上图带来的问题是直接从源程序翻译成不同架构CPU的目标代码工作量太大且容易出错。正确的做法是在和中间加一层作为桥梁,将其衔接起来。

2023-12-21 11:24:15 1356

原创 什么是抽象语法树和三地址表达(通俗理解版)

根据《编译原理(第2版)》第二章用通俗的语言解释什么是抽象语法树和三地址表达

2023-12-20 16:46:16 852 2

VS2005最简单的OpenGL例子

最简单的OpenGL例子。http://www.cnblogs.com/songlotus/articles/965368.html#1406601

2010-02-12

单相全波整流Protues仿真

单相全波整流Protues仿真,大家看看吧。

2012-02-12

CRC16校验程序

自己写的CRC16校验程序,用的是查表法,比计算法速度快。

2015-12-12

NUnit 3.0.1

2015.12.1的版本,用于C#的单元测试。

2015-12-14

桥式电容滤波电路Protues仿真

桥式电容滤波电路Protues仿真,大家看看吧。

2012-02-12

单相半波整流电路Protues仿真

单相半波整流电路Protues仿真,大家看看吧。

2012-02-12

桥式整流电路Protues

桥式整流电路Protues,大家看看吧。

2012-02-12

稳压管Protues仿真

Protues仿真的稳压管,大家可以看看。

2012-02-12

ARM汇编语言的系统号调用例程

使用AArch64的系统调用实现退出功能,这个是学习ARM汇编的第一步arch/ABI instruction syscall # retval arm64 svc #0 x8 x0 arch/ABI instruction syscall # retval arm64 svc #0 x8 x0

2020-09-27

图形学DDA画直线算法

DDA画直线算法,VS2005的C++,OpenGL实现。代码有点问题,需要把x0,y0这些变量的声明类型改为float。我不知道怎么删除重新上传,所以只有让大家自己改了。

2010-02-12

Mapxtreme 2004开发指南中文版

Mapxtreme 2004开发指南中文版,具体开发细节其他版本的大同小异。

2011-07-25

图形学Bresenham算法

VS2005下的C++控制台程序,需要在本地安装OpenGL才可以运行

2010-02-15

TreeBuffer

Lazy Add Item

2007-06-03

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除