计算机存储模型(CPU、寄存器、高速缓存、内存、外存)
现代计算机系统CPU和内存之间其实是有一个cache的层级结构的。比内存速度更快的存储介质(SRAM),普通内存一般是DRAM,这种读写速度更快的介质充当CPU和内存之间的Cache,这就是缓存。当CPU写cache时,cache中没有相应的内存数据需要把该数据从内存加载到cache中,然后更新cache,再更新内存。
寄存器
CPU的一部分,空间在kb级别,用来暂存指令、数据和地址。CPU处理数据时先把数据取到寄存器中,再作处理。
内存
计算机运行过程中的存储主力,存储指令(编译好的代码段),运行中的各个静态,动态,临时变量,外部文件的指针等。程序的运行都是在内存中进行,内存的大小决定可运行程序的大小。
硬盘
机械硬盘(HDD): 磁性碟片 机械硬盘主要由磁盘盘片、磁头、主轴与传动轴等组成,数据就存放在磁盘盘片中,与留声机上的唱片相似(硬盘是上下双磁头)。 固态硬盘: 闪存颗粒、DRAM 闪存的固态硬盘(SSD): 可以移动,数据保护不受电源控制,寿命较长,能适应于各种环境:笔记本硬盘、微硬盘、存储卡、U盘等。 DRAM: 仿效传统硬盘的设计,高性能的存储器,理论上可以无限写入,需要独立电源来保护数据安全。可被大部分操作系统的文件系统工具进行卷设置和管理,非主流的设备。
数据与二进制的对应规则
计算机编码: ASCII: 一个字节byte有八个二进制位可组合出256种状态,每个状态对应一个符号,有256个符号。ASCII规定了128个字符(对英语字符与二进制位间做了统一规定) 非ASCII码: 不同国家,使用的字符不一致,仅128个字符不够用,所以针对本国字符特点,使用了256个字符。 Unicode: 该数字码全球统一,属于字符编码的标准,即字符集。nicode并未明确编码规则,根据Unicode字符集有常用的编码规则: UTF-8、UTF-16等。 UTF-8: 作为Unicode一种实现方式,使用1-4个字节进行编码。UTF-8与ASCII码表示的二进制数完全一致。
JVM
JVM内存模型
堆:
堆: 分为两块,新生代和老年代。
老年代(Old)占2/3,年轻代(Young)占1/3,
年轻代中包含Eden区和Survivor区,Survivor区包含From(S0区)区和To(S1区),默认Eden区、From区、To区的比例为8:1:1,当Eden区内存不足时会触发Minor gc,没有被回收的对象进入到Survivor区,同时分代年龄+1,再次触发Minor gc时,From区中的对象会移动到To区,Minor gc会回收Eden区和From区中的垃圾对象,对象的分代年龄会再次增加,当分代年龄增加到15以后,对象会进入到老年代。当老年代内存不足时,会触发Full gc,如果Full gc无法释放足够的空间,会触发OOM内存溢出,在进行Minor gc或Full gc时,会触发STW(Stop The World)即停止用户线程。
非堆(永久代/元空间区):
常量、静态变量、类信息、运行时常量池,操作的是直接内存。