码出高效: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 的老大爷家里。付出的代价是到货速度慢了,影响客户体验。毕竟老大爷并不是实时立马转交的,而是要攒到一定的包裹量再挨家挨户地给收件人送过去。虽然垃圾回收机制能为程序员减负,但如果不加节制的话,同样会耗尽内存资源。

相关文章
|
人工智能 前端开发 Java
2025年WebStorm高效Java开发全指南:从配置到实战
WebStorm 2025不仅是一款强大的JavaScript IDE,也全面支持Java开发。本文详解其AI辅助编程、Java特性增强及性能优化,并提供环境配置、高效开发技巧与实战案例,助你打造流畅的全栈开发体验。
978 4
|
前端开发 JavaScript Java
Java 开发中 Swing 界面嵌入浏览器实现方法详解
摘要:Java中嵌入浏览器可通过多种技术实现:1) JCEF框架利用Chromium内核,适合复杂网页;2) JEditorPane组件支持简单HTML显示,但功能有限;3) DJNativeSwing-SWT可内嵌浏览器,需特定内核支持;4) JavaFX WebView结合Swing可完美支持现代网页技术。每种方案各有特点,开发者需根据项目需求选择合适方法,如JCEF适合高性能要求,JEditorPane适合简单展示。(149字)
1470 1
|
10月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
安全 Java 领域建模
Java 17 探秘:不容错过的现代开发利器
Java 17 探秘:不容错过的现代开发利器
1292 0
|
11月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
504 3
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
521 2
|
11月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
412 0