当前位置: 首页 > news >正文

硬件与软件的协调,参考b站黑马程序员

你写的 Java 代码,凭什么能让电脑干活?CPU、内存、硬盘这些硬件自己不会思考,全靠软件指挥。但硬件种类那么多,软件怎么统一协调?Java 的办法很简单:中间加个 "翻译官"JVM,让它去跟硬件打交道,你只管写代码就行。
平时我们写的 .java 文件,先编译成 .class 字节码,然后 JVM 把字节码翻译成当前电脑能跑的机器码。好处是你在 Windows 写的代码,拿到 Linux、Mac 上也能跑,因为每个平台都有自己的 JVM,它帮你搞定了底层差异。这就是 Java 常说的 "一次编写,到处运行"。简单说,你面向 JVM 写代码,JVM 面向硬件写代码。
public class JvmInfo {
public static void main(String[] args) {
// CPU核心数
int cores = Runtime.getRuntime().availableProcessors();
System.out.println("CPU核心数:" + cores);
// JVM最大内存(字节转MB)
long maxMem = Runtime.getRuntime().maxMemory() / 1024 / 1024;
System.out.println("JVM最大内存:" + maxMem + " MB");
// JVM已分配内存
long totalMem = Runtime.getRuntime().totalMemory() / 1024 / 1024;
System.out.println("已分配内存:" + totalMem + " MB");
// JVM空闲内存
long freeMem = Runtime.getRuntime().freeMemory() / 1024 / 1024;
System.out.println("空闲内存:" + freeMem + " MB");
}
}
JVM 跑字节码有两种方式,一种是解释执行,跑一句翻译一句,启动快但跑得慢;另一种是编译执行,先全翻译好再跑,启动慢但快。JVM 很聪明,它会盯着哪些方法被反复调用,也就是所谓的 "热点代码",调用次数多了就用 JIT 编译器把它翻译成机器码存起来,下次直接跑,不用再翻译。打个比方,第一次去陌生地方要开导航,去多了路熟了直接走。这就是对 CPU 资源的合理利用,冷门代码省着编译,热门代码直接拉满速度。
C 语言里你要手动申请内存、手动释放,忘了释放就内存泄漏,释放早了程序崩溃。Java 说别操心,对象不用了我自动回收。JVM 把堆内存分成两块,新对象都在新生代,大部分对象用完就丢,回收频率高;活过几次回收的 "老油条" 挪到老年代,回收频率低。常见的垃圾回收器比如 G1,也就是 JDK9 默认的,还有 ZGC 超低延迟,它们帮你自动打扫内存,你只管 new 对象就行。
现在 CPU 都是多核的,一个线程只能用一个核,太浪费。Java 用多线程让多个核同时干活。但多个线程同时改一个数据会出问题,所以 Java 给了几把 "锁",synchronized 加锁后同一时间只让一个线程进,volatile 保证一个线程改了别的线程马上能看到,还有线程池不用每次新建线程,复用已有线程省开销。线程池大小也有讲究,CPU 密集型任务线程数等于核数,IO 密集型可以开两倍核数,因为等 IO 的时候 CPU 闲着,可以让别的线程上。
传统 IO 是阻塞的,你读文件,线程就卡在那等磁盘读完,CPU 闲着没事干。NIO 搞了个 Selector,一个线程盯着好几个通道,哪个数据准备好了就去处理哪个,CPU 不用傻等,效率高多了。像 Tomcat、Netty 这些高性能框架底层都用的 NIO。
说到底,Java 协调硬件就五招:用 JVM 字节码搞定跨平台,用 JIT 让热点代码跑得快,用 GC 自动管内存防泄漏,用多线程吃满多核 CPU,用 NIO 不让 CPU 白等外设。一句话,Java 在 "写得爽" 和 "跑得快" 之间找了个不错的平衡,这也是它能在企业开发里火这么多年的原因。

http://www.jsqmd.com/news/1400818/

相关文章:

  • 2026年8月市场上技术好的采暖炉实力厂家选哪家,空气能锅炉/燃油锅炉/蒸发器/采暖炉/蒸汽锅炉/锅炉,采暖炉厂家找哪家 - 企业权威推荐大使
  • SAM胡诌
  • 第 7 篇:「Fluss 状态外部化」—— Delta Join 与 Aggregation Merge Engine
  • NVIDIA Nemotron 3.5 Lightning:专为高效推理优化的开源大语言模型部署实战
  • Git代码合并与冲突解决实战技巧
  • Dify 中级实验(07):子工作流——如何把公共逻辑做成可复用积木?
  • 基于Human Behavior分析的AI原生应用设计:从行为流协同到工程实践
  • Python开发轻量级员工管理系统的实践与优化
  • 最长公共前缀算法精解:横向与纵向扫描的实战剖析
  • AtCoder Beginner Contest 471 ABCDE
  • 中美Robotaxi“四国杀”:2026,谁在领跑万亿出行终局?
  • Gitee高人气开源项目深度解析:从筛选到源码学习的全链路指南
  • AOSP-- 第 2 章:源码与构建系统
  • IDEA中git stash可视化操作指南:提升多任务开发效率
  • 学习25
  • 从2020亚太赛A题看数学建模:数据驱动与机理分析的融合实践
  • OpenSpec自定义步骤实战:从数据清洗到复杂工作流构建
  • 《ETA1476FT2G 使用笔记|SOT23‑6 2A 同步降压 DC‑DC 芯片》#ETA1476FT2G #钰泰 ETA #DC‑DC 降压 #电源设计 #国产电源芯片
  • SQL GROUP BY 详解:从分类汇总到多维度聚合实战
  • 物流行业GEO优化公司哪家好?2026物流企业AI搜索获客选型全指南 - 科技前沿信息
  • 免费离线OCR软件Umi-OCR完整上手指南:截图、批量、PDF识别一次讲透
  • 无人机维修入门必修课|看懂无人机结构,认识每一个零件 - 湖南阳光技术
  • C++时间处理实战:从time_t到localtime,掌握时间戳与日期转换
  • OpenClaw AI智能体框架:从部署到十大核心Skills实战指南
  • 泰迪狗场选购测评|正规犬舍筛选干货指南 - Full19
  • ArcGIS Pro要素裁剪进阶:从基础操作到自动化工程实践
  • 电动汽车集群优化:Matlab与Yalmip建模实践
  • 小白吃透DeepSeek Harness:新一代AI Agent框架保姆级实战教程
  • 系统重构与现代化改造:从概念到实践的避坑指南
  • 《文明6》DLC解锁补丁技术解析:原理、安装与问题排查