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

相关文章
|
4月前
|
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
621 10
一天成为Java开发高手:用飞算JavaAI实现十倍提效
“一天成为Java开发高手”曾被视为天方夜谭,但飞算JavaAI的出现改变了这一局面。这款AI开发助手通过智能引导、需求分析、自动化逻辑处理和完整代码工程生成,大幅简化了Java开发流程。它不仅帮助新手快速上手,还让资深开发者提高效率,减少调试时间。现在,参与“飞算JavaAI炫技赛”,展示你的开发实力,赢取丰厚奖品!
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
44 12
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
46 6
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
47 5
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
70 2

热门文章

最新文章