- 博客(13)
- 收藏
- 关注
原创 字符编码详解
字符“严”的 Unicode 是4E25(100111000100101),根据上表可以发现 4E25 处于第三行的范围,因此从“严”的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补0。U+XXXXXX 是码点的表示形式,X 代表一个十六进制数字,u 后面可以有4-6位,不足4位往前补0,所以码点的取值范围为 U+0000 ~ U+10FFFF,但实际 unicode 至今才扩展到二进制21位,而且21位代表的1114112个码点中并不是都代表着一个字符,只有大约10%的空间被使用。
2023-03-31 17:18:23 1804
原创 JVM 运行时栈帧结构
Java 虚拟机以方法作为最基本的执行单位,栈帧支持着方法调用和方法执行,是虚拟机栈的栈元素,虚拟机栈在下面这篇文章中已经介绍过:[post cid=“31” cover=“” size=“”/]栈帧的结构如下图:局部变量表是一组变量值的存储空间,存放方法参数和方法内部定义的局部变量。在编译的时候该方法的局部变量表的最大容量已经确定。局部变量表存放了编译期可知的各种 Java 虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(refe
2023-03-29 19:31:44 168
原创 JVM 类加载机制
在 Java 语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略让 Java 语言进行提前编译会面临额外的困难,也会让类加载时稍微增加一些性能开销,但是却为 Java 应用提供了极高的扩展性和灵活性。
2023-03-29 19:28:29 55
原创 JVM 内存区域
如果 Java 堆中内存是绝对规整的,可以使用“指针碰撞”的分配方式(所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离)如果 Java 堆中的内存不是规整的,就需要使用“空闲列表”的分配方法(维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录)Java 通过栈上的 reference 数据来操作堆上的具体对象。
2023-03-29 19:28:27 55
原创 JVM 垃圾收集器与内存分配策略
更具体的处理思路是让G1收集器去跟踪各个 Region 里面的垃圾堆积的 价值(和回收获得的空间和回收所需时间有关),然后在后台维护一个优先级列表,每次根据用户设定允许的收集停顿时间,优先处理回收价值收益最大的那些 Region。如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销,但对于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可。
2023-03-29 19:27:00 107
原创 Spring装配Bean
使用默认的 bean ID 作为限定符有时候可能发生问题,当 bean 的类名改变时,bean 的 ID 和其限定符都会发生变化,导致对应的注入的设置也得修改。因此可以自定义限定符将其固定下来,当 bean 的类名改变时其限定符也不会改变@Component @Qualifier("cold") //设置 bean 的限定符 public class IceCream implements Dessert {. . . }
2023-03-29 19:26:23 217
原创 Jenkins+Gitlab搭建CI/CD环境
scode type=“yellow” size=“”]这里建议不要选择自动安装,因为自动安装在任务中使用到相应命令才会触发,对项目类型也有要求,不能保证一定可以使用,建议使用本地安装好的路径[/scode]这里选择Jenkinsfile放在项目文件中,根据自身情况如下图配置,仓库填入ssh链接,凭据选择之前配置过的全局ssh私钥凭据,指定脚本在项目中的路径。在安装gitlab plugin以后系统配置中会出现gitlab项,前两项根据实际填写,凭据需要使用gitlab的个人访问令牌。
2023-03-29 19:24:42 532 1
原创 NASM汇编语言基础
要执行加载到内存中的程序,我们使用全局标签_start: 告诉操作系统在内存中可以找到和执行我们的程序的位置。操作系统的内核跳转到内存中的该地址并执行它。我们知道我们的slen函数正在寻找一个零字节,所以除非我们的msg2变量以零字节开头,否则它一直在计数,就好像它是同一个字符串一样(就程序集而言,它们是同一个字符串)。因此,在调用sys_write之后,程序继续按顺序执行内存中的下一个地址,我们不知道内核试图执行什么,但它导致其终止了我们的进程, 留下了"Segmentation faul"的错误消息。
2023-03-29 19:22:05 1569
原创 汇编入门知识
作用就是记住一些特殊的CPU状态,比如前一次运算的结果是正还是负、计算过程有没有发生进位、计算结果是不是零等信息,而后续的跳转指令,就是根据eflags寄存器中的状态,来决定是否要进行跳转的。上面的代码表示,取出 Stack 最近写入的值(即 EBX 寄存器的原始值),再将这个值写回 EBX 寄存器(因为加法已经做完了,EBX 寄存器用不到了)。上面的代码将 EAX 寄存器的值(即2)加上 EBX 寄存器的值(即3),得到结果5,再将这个结果写入第一个运算子 EAX 寄存器。也就是,当前函数的帧将被回收。
2023-03-29 18:11:48 356
原创 Sakura主题添加waline评论系统
四个环境变量是用来自定义回复邮件标题和内容的。不过一般而言,邮件回复的时候,标题和内容都不是固定的。比如说 A 回复了某条评论,系统发送邮件通知评论作者 B 的时候,标题最好含有 B 的名字。内容也应该含有 A 对 B 的什么评论作出了什么评论。这些内容会随着评论作者和评论内容的不同进行改变,所以不能直接简单的设置成固定的内容,需要设定一个回复模板。**找到 GitHub 上自动创建的和Vercel项目同名的私人仓库,仓库中有一个名为 **的文件,修改代码为以下。才代表是当前生产环境。
2023-03-29 18:07:33 142
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人