码出高效:Java开发手册-第1章(3)

简介: 本书源于影响了全球250万名开发工程师的《阿里巴巴Java开发手册》,作者静心沉淀,对Java规约的来龙去脉进行了全面而彻底的内容梳理。本书以实战为中心,以新颖的角度全面阐述面向对象理论,逐步深入地探索怎样成为一位优秀开发工程师。比如:如何驾轻就熟地使用各类集合框架;如何得心应手地处理高并发多线程问题;如何顺其自然地写出可读性强、可维护性好的优雅代码。 本书旁征博引、文风轻松,秉持“图胜于表,表胜于言”的理念,深入浅出地将计算机基础、面向对象思想、JVM探源、数据结构与集合、并发与多线程、单元测试等知识客观、立体地呈现出来。紧扣学以致用......

1.4 CPU 与内存

      CPU(Central Processing Unit)是一块超大规模的集成电路板,是计算机的核心部件,承载着计算机的主要运算和控制功能,是计算机指令的最终解释模块和执行模块。硬件包括基板、核心、针脚,基板用来固定核心和针脚,针脚通过基板上的基座连接电路信号,CPU 核心的工艺极度精密,达到10 纳米级别。

      和其他硬件设备相比,在实际代码的运行环境中,CPU 与内存是密切相关的两个硬件设备,本节对CPU 和内存简单介绍一下。开发工程师在实际编程中,对这两个部件有一定的掌控性,熟悉CPU 和内存的脾气,让它们以自己期望的方式执行相关指令。在CPU 的世界里,没有缤纷多彩的图像、悦耳动听的音乐,只有日复一日地对0 与1 电流信号的处理。但CPU 内部的处理机制是十分精密而复杂的,总的来说,就是由控制器和运算器组成的,内部寄存器使这两者协同更加高效。CPU 的内部结构如图1-8 所示。

2.jpg

图1-8 CPU 的内部结构

1. 控制器

      控制器由图1-8 中所示的控制单元、指令译码器、指令寄存器组成。其中控制单元是CPU 的大脑,由时序控制和指令控制等组成;指令译码器是在控制单元的协调下完成指令读取、分析并交由运算器执行等操作;指令寄存器是存储指令集,当前流行的指令集包括X86、SSE、MMX 等。控制器有点像一个编程语言的编译器,输入0 与1 的源码流,通过译码和控制单元对存储设备的数据进行读取,运算完成后,保存回寄存器,甚至是内存。

2. 运算器

      运算器的核心是算术逻辑运算单元,即ALU,能够执行算术运算或逻辑运算等各种命令,运算单元会从寄存器中提取或存储数据。相对控制单元来说,运算器是受控的执行部件。任何编程语言诸如a+b 的算术运算,无论字节码指令,还是汇编指令,最后一定会以0 与1 的组合流方式在部件内完成最终计算,并保存到寄存器,最后送出CPU。平时理解的栈与堆,在CPU 眼里都是内存。

3. 寄存器

      最著名的寄存器是CPU 的高速缓存L1、L2,缓存容量是在组装计算机时必问的两个CPU 性能问题之一。缓存结构和大小对CPU 的运行速度影响非常大,毕竟CPU的运行速度远大于内存的读写速度,更远大于硬盘。基于执行指令和热点数据的时间局部性和空间局部性,CPU 缓存部分指令和数据,以提升性能。但由于CPU 内部空间狭小且结构复杂,高速缓存远小于内存空间。

      CPU 是一个高内聚的模块化组件,它对外部其他硬件设备的时序协调、指令控制、存取动作,都需要通过操作系统进行统一管理和协调。所谓的CPU 时间片切分,并非CPU 内部能够控制与管理。CPU 部件是一个任劳任怨的好公民代表,只要有指令就会马不停蹄地执行,高级语言提供的多线程技术和并发更多地依赖于操作系统的调配,并行更多依赖于CPU 多核技术。多核CPU 即在同一块基板上封装了多个Core。还有一种提升CPU 性能的方式是超线程,即在一个Core 上执行多个线程,如图1-9所示为2 个Core,但是有4个逻辑CPU,并有对应独立的性能监控数据。

3.jpg

图1-9 多核CPU

      CPU 与内存的执行速度存在巨大的鸿沟,如图1-8 所示的L2 和L3 分别是256KB 和4MB,它们是CPU 和内存之间的缓冲区,但并非所有的处理器都有L3 缓存。曾几何时,内存就是系统资源的代名词,它是其他硬件设备与CPU 沟通的桥梁,计算机中的所有程序都在内存中运行,它的容量与性能如果存在瓶颈,即使CPU 再快,也是枉然。内存物理结构由内存芯片、电路板、控制芯片、相关支持模块等组成,内存芯片结构比较简单,核心是存储单元,支持模块是地址译码器和读写控制器,如图1-10 所示。

4.jpg

图1-10 计算机存储方式

      从图1-10 中可以看出,越往CPU 核心靠近,存储越贵,速度越快。越往下,存储越便宜、速度越慢,当然容量也会更大。云端存储使得应用程序无须关心是分布式还是集中式,数据如何备份和容灾。在本地磁盘与CPU 内部的缓存之间,内存是一个非常关键的角色,但它很敏感,内存颗粒如果有问题无法存储,或控制模块出现地址解析问题,或内存空间被占满,都会导致无法正常地执行其他应用程序,甚至是操作系统程序。程序员们最害怕的OOM 通常来源于由于不恰当的编码方式而导致内存的资源耗尽,虽然现代内存的容量已经今非昔比,但仍然是可以在秒级内耗尽所有内存资源的。

      图1-10 中的存储单元都有一个十六进制的编号,在32 位机器上是0x 开始的8位数字编号,就是内存存储单元的地址,相当于门牌号。以C 和C++ 为代表的编程语言可以直接操作内存地址,进行分配和释放。举个例子,要写一份数据到存储单元中,就像快递一个包裹,需要到付并且当面签收,到了对应的住址,发现收件人不在,就抛出异常。如图1-11 所示的经典错误,估计很多人都遇到过,选择要调试程序,单击【取消】按钮,并无反应,也不会出现调试界面。内存的抽象就是线性空间内的字节数组,通过下标访问某个特定位置的数据,比如C 语言使用malloc() 进行内存的分配,然后使用指针进行内存的读与写。

5.jpg

图1-11 内存出错警告

      而以Java 为代表的编程语言,内存就交给JVM 进行自动分配与释放,这个过程称为垃圾回收机制。这就好像刚才的快递员并不直接访问内存单元,只是把包裹放在叫JVM 的老大爷家里。付出的代价是到货速度慢了,影响客户体验。毕竟老大爷并不是实时立马转交的,而是要攒到一定的包裹量再挨家挨户地给收件人送过去。虽然垃圾回收机制能为程序员减负,但如果不加节制的话,同样会耗尽内存资源。

相关文章
|
11天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
33 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
9天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
23 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
10天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
10天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
11天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的房产销售管理系统
基于Java+Springboot+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
25 3
基于Java+Springboot+Vue开发的房产销售管理系统
|
12天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的反诈视频宣传系统
基于Java+Springboot+Vue开发的反诈视频宣传系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的反诈视频宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
41 4
基于Java+Springboot+Vue开发的反诈视频宣传系统
|
13天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的健身房管理系统
基于Java+Springboot+Vue开发的健身房管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的健身房管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
42 5
基于Java+Springboot+Vue开发的健身房管理系统
|
10天前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
12天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
基于Java+Springboot+Vue开发的医院门诊预约挂号系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的门诊预约挂号管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
33 2
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
|
13天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的家具管理系统
基于Java+Springboot+Vue开发的家具管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的家具管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
32 2
基于Java+Springboot+Vue开发的家具管理系统
下一篇
无影云桌面