阿烫的后花园

烫烫烫烫烫烫

主内存与工作内存

  Java内存模型规定了所有变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。三者的关系如下图。

image.png

阅读全文 »

  在部分的商用虚拟机中, Java 程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或者代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的效率,在运行时,虚拟机会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler, JIT 编译器)

阅读全文 »

运行时栈帧结构

  栈帧是虚拟机用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息。每一个方法从调入开始到执行完成的过程,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

  在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的 Code 属性中,因此,一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现,

阅读全文 »

  文章参考虚拟机规范Chapter 4. The class File Format,这篇文章只说常量池相关部分。常量池中主要存放两大类常量:字面量(Literal)和 符号引用(Symbolic References)。字面量比较接近于 Java 语言层面的常量概念,如文本字符串、声明为 final 的常量值等。而符号引用则属于编译原理方面的概念,包括了下面三类常量:

  • 类和接口的全限定名(Full Qualified Name)
  • 字段的名称和描述符(Descriptor)
  • 方法的名称和描述符
阅读全文 »

类加载过程

  类从被加载到虚拟机内存开始,到卸载出内存位置,它的整个生命周期包括以下 7 个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)其中验证、准备、解析 3个部分统称为链接(Linking)

图1 类的生命周期

阅读全文 »

  Java中,short 、byte、char 类型的数据在做运算的时候,都会默认提升为 int,如下面的代码,需要将等于号右边的强制转为 short 才可以通过编译。

1
2
3
4
5
6
7
public static void main(String[] args) {
short a = 1;
short b = 2;
a = a + b; // 编译不过
short c = a + b; // 编译不过
short d = (short) (a+b); // 编译通过
}

  为什么两个 short 相加会变成 int,有的解释说,两个 short 相加可能溢出,所以用 int 来接就不会溢出,那这样的话,两个 int 相加岂不应该是 long 类型吗?其实本质的原因要从字节码开始讲起。

本文出现了一些字节码指令,如果想详细查看,请参考Java虚拟机规范 Chapter 6. The Java Virtual Machine Instruction Set

阅读全文 »

垃圾回收算法需要考虑三件事情:

  • 哪些内存需要回收?
  • 什么时候回收?
  • 如何回收?

先奉上 Java平台标准版HotSpot虚拟机垃圾收集调优指南

对象已死?

  哪些对象需要回收,就是那些死了的对象,即不可能再被任何途径所使用的对象。有两种主流的方法可以判断对象是否需要回收,引用计数法可达性分析法

阅读全文 »

  链路层的主体是在网络适配器中实现的,有时也称为网络接口卡。位于网络适配器核心的是链路层控制器,该控制器通常是一个实现了许多链路层服务(成帧、链路接入、差错检测等)的专用芯片,因此链路层的许多功能是由硬件实现的。

  有两种类型的网络链路:点对点链路和广播链路。点对点链路由链路一段的单个发送方和链路另一端的单个接收方组成,如点对点协议(point-to-point protocol,PPP)就是这样的协议。广播链路能够让多个发送和接收结点都连接到相同的、单一的、共享的广播信道上。当任何一个结点传输一个帧时,信道广播该帧,每个其它结点都收到一个副本。广播信道通常用于局域网中。

阅读全文 »

转发和路由选择

  在网络中的每一台主机和路由器中都有一个网络层部分。网络层为了将分组从一台发送主机移动到另外一台接收主机,需要两个重要功能:

  • 转发:当一个分组到达路由器的一条输入链路时,路由器必须将该分组移动到适当的输出链路。
  • 路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采取的路由或路径。计算这些路径的算法被称为路由选择算法

    转发是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。路由选择是指网络范围的过程,以决定分组从源到目的地所采取的的端对端路径,是一种宏观上的策略。

  每台路由器都有一张转发表。路由器通过检查到达分组首部字段的值来转发分组,然后使用该值在转发表索引查询该分组的输出链路接口。

阅读全文 »

最近在阅读 spring 源码,学到很多原来没用过的 java api,如果未来自己要实现某些框架,将非常有用。

阅读全文 »
0%