再见,我的四年生活

不需要也不想说太多,只想记录下这个特殊的日子。 再见,一起奋斗的团队;再见,回不去的岁月,希望一切安好,相信时间会给出最好的答案!

JVM 类加载机制

类的生命周期 通常类的声明周期包括以下 7 个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。 类初...

JVM 垃圾收集 - 垃圾收集器

以上是 HotSpot 虚拟机中的 7 个垃圾收集器,连线表示垃圾收集器可以配合使用。 Serial 收集器 Serial 收集器是单线程的收集器,不仅意味着只会使用一个线程进行垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停所有其他工作线程,往往造成过长的等待时间。 它的优点是简单高效,对于单个 CPU 环境来说,由于没有线程交互的开销,因此拥有最高的单线程收集效率。 ...

JVM 垃圾收集 - 垃圾收集算法

JVM中,垃圾收集算法主要分为复制、标记清除、标记整理、分代收集几种: 标记-清除算法 将需要回收的对象进行标记,然后清除 不足: 标记和清除过程效率都不高 会产生大量碎片 之后的算法都是基于该算法进行改进。 复制算法 将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。 优...

JVM 垃圾收集 - 对象可回收判断

在 JVM 内存模型[1] 中, 程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行。 引用计数 给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。当两个对象出现循环引用时,引用计数器永远...

JVM 内存模型

Jvm 内存模型主要包括程序计数器(寄存器)、虚拟机栈、本地方法栈、堆、方法区、运行常量池、直接内存几部分组成。 程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是 Native 方法则为空)。 当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址会被保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。 为了线程切换后能恢复到...

重温 C 语言 (四)

存储分配与回收 动态存储分配 内存分配函数 为了动态分配存储空间,需要调用三种分配函数中的一种,这些函数都是声明在 <stdlib.h> 头中。 malloc 函数:分配内存块,但是不对内存块进行初始化; calloc 函数:分配内存块,并且对内存块清零; realloc 函数:调用先前分配的内存块大小。 三种函数中,malloc 函数是最常用的一种, 因为 ...

重温 C 语言 (三)

编写大型程序 源文件 根据惯例,源文件的扩展名为 .c,每个源文件包含程序的部分内容,主要是函数和变量的定义。其中一个源文件必须包含一个名为 main 的函数,此函数作为程序的起始点。 头文件 通常, #include 指令告诉预处理器打开指定的文件,并且把此文件内容插入到当前文件中。因此,如果想让几个源文件可以访问相同的信息,可以把此信息放入同一个文件中,然后利用 #include 指令...

重温 C 语言 (二)

指针 指针可以说是 C 语言中最让人迷惑也是最迷人的特性了。 指针变量 现代计算机将内存分为字节(byte),每个字节存储8位(bit)信息。每个字节都有其唯一的地址,程序中的每个变量占有一个或多个字节的内存,把第一个字节的地址称为变量地址。 指针变量被用来存储地址信息,例如:用指针变量 p 存储变量 i 的地址信息,我们就说”p 指向 i”。更通俗点,指针就是地址,而指针变量就是存储地址...

重温 C 语言 (一)

作为第一门接触的语言,C 语言在工作以后相对接触的就比较少。随着工作研究的不断深入,接触到的底层知识逐渐增多, 最近花时间重温了一下《C程序设计语言: 现代方法》这本书,对 C 语言相关知识做一个复习,在此也做一些整理。 Hello World 创建 hello.c 文件 #include <stdio.h> int main() { printf("Hello wor...