0%

Mac 系统实用工具:系统信息查看与问题诊断

Mac 系统内置了多款实用工具,用于监控系统状态、查看硬件信息和诊断问题。其中 System Profiler(系统信息)Console(控制台)Activity Monitor(活动监视器) 是最常用的三款,分别对应系统信息查询、日志分析和进程监控功能。

System Profiler(系统信息):硬件与软件详情查询

System Profiler(在 macOS 10.12 及以上版本中名为 “系统信息”)是查看 Mac 硬件配置、软件环境和网络信息的核心工具。

主要功能

  • 硬件信息:详细列出处理器(CPU)、内存(RAM)、硬盘(SSD/HDD)、显卡、主板等硬件参数。
  • 网络信息:显示网络接口(Wi-Fi、以太网)的 IP 地址、MAC 地址、连接速度等。
  • 软件信息:已安装的操作系统版本、应用程序、系统扩展(如驱动)等。
  • 外设信息:连接的外部设备(如打印机、U 盘、显示器)的型号和状态。

如何打开

  1. 点击 Dock 栏的 启动台(Launchpad),进入 其他 文件夹,找到 系统信息
  2. 或使用 Spotlight:按下 Command + 空格,输入 系统信息 并回车。

系统信息

实用场景

阅读全文 »

ARP 协议详解

ARP 协议(Address Resolution Protocol,地址解析协议)是 TCP/IP 协议栈中网络层的关键协议,其核心功能是实现IP 地址到 MAC 地址的映射转换,这是数据在局域网内传输的基础。

为什么需要 ARP 协议?

  • 网络层使用 IP 地址进行逻辑寻址(如 192.168.1.100),用于确定数据包的最终目的地
  • 数据链路层使用 MAC 地址进行物理寻址(如 00:1A:2B:3C:4D:5E),用于在局域网内实际传输帧
  • 当主机需要发送数据给同一局域网内的其他设备时,必须知道目标设备的 MAC 地址,ARP 协议就是解决这一转换问题的机制

ARP 的工作流程

  1. 发送 ARP 请求
    • 源主机广播发送一个 ARP 请求帧,帧中包含源 IP、源 MAC 以及目标 IP
    • 该广播帧会被同一局域网内的所有设备接收
  2. 接收 ARP 响应
    • 只有目标 IP 对应的设备会处理该请求,其他设备会忽略
    • 目标设备发送 ARP 响应帧(单播),包含自己的 MAC 地址
  3. 更新 ARP 缓存
    • 源主机收到响应后,将目标 IP 与 MAC 的映射关系存入本地 ARP 缓存表
    • 同时,目标设备也会将源主机的 IP 与 MAC 映射存入自己的缓存表
  4. 直接通信
    • 后续通信时,源主机可直接从缓存表中获取目标 MAC 地址,无需再次发送 ARP 请求

ARP 缓存表

  • 是主机或路由器中存储 IP 与 MAC 映射关系的临时表格

  • 表项有过期时间(通常为 2-10 分钟),过期后会被自动删除

  • 可通过命令查看和管理:

阅读全文 »

LongAdder:高并发下的高效原子累加器

在高并发场景中,AtomicLong虽然能保证原子性,但大量线程竞争同一个变量时,CAS 操作的失败重试会导致CPU 自旋开销激增。JDK 8 引入的LongAdder通过分散热点的设计,显著提升了高并发下的累加性能,成为计数器场景的首选工具。

LongAdder 的核心设计思想

LongAdder的核心是分而治之:将一个全局计数器拆分为多个局部计数器(Cell数组),线程优先操作自己对应的局部计数器,最后通过累加局部计数器的值得到全局结果。

  • 低并发场景:直接操作base变量(类似AtomicLong);
  • 高并发场景:线程分散到不同的Cell中进行累加,减少竞争。

LongAdder 的内部结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class LongAdder extends Striped64 implements Serializable {
// 存储局部计数器的数组(延迟初始化)
transient volatile Cell[] cells;
// 基础值(低并发时直接使用,或作为备用)
transient volatile long base;
// 自旋锁标识(0:无锁;1:被占用,用于初始化/扩容cells或创建Cell)
transient volatile int cellsBusy;

// 局部计数器Cell类(使用@Contended避免伪共享)
@sun.misc.Contended
static final class Cell {
volatile long value; // 存储局部累加值
Cell(long x) { value = x; }
// CAS操作更新value
final boolean cas(long cmp, long val) {
return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val);
}
// 省略Unsafe相关代码...
}
}

关键细节:

  • @Contended 注解:避免Cell数组元素因 CPU 缓存行共享导致的伪共享问题(提升缓存利用率);
  • volatile 修饰cellsbaseCell.value均用volatile保证可见性;
  • cellsBusy:通过 CAS 控制cells数组的初始化、扩容和Cell创建的原子性。

核心方法解析:add (long x)

add方法是LongAdder的核心,逻辑是优先操作 Cell,失败则退化为操作 base

阅读全文 »

Spring Cloud 容器机制:父子容器的协同与隔离

在 Spring Cloud 中,为了满足微服务架构中配置隔离、早期初始化等需求,并非只存在一个 Spring 容器,而是通过多次创建容器形成父子容器层级结构。这些容器各司其职,协同完成微服务的初始化、配置加载和组件管理。

Spring Cloud 容器的层级关系

Spring Cloud 的容器体系由三个核心上下文(容器)构成,形成 “祖先→父→子” 的层级:

  • Bootstrap 上下文:最顶层的祖先容器,负责早期初始化和核心配置加载。
  • Spring Boot 上下文:中间层的父容器,即我们日常开发中最常接触的应用容器。
  • 微服务配置上下文:底层的子容器,为 Feign、Ribbon 等组件提供配置隔离。

它们的关系如下:

1
2
3
4
5
Bootstrap 上下文(祖先)
↓(作为父容器)
Spring Boot 上下文(主应用容器)
↓(作为父容器)
微服务配置上下文(如 FeignContext、LoadBalancerClientFactory 等,隔离组件配置)

核心容器详解

Bootstrap 上下文:祖先容器,早期初始化的基石

作用
阅读全文 »

MySQL 中 COUNT 函数的用法与区别详解

COUNT() 是 MySQL 中用于统计记录行数的聚合函数,但其参数不同(如 COUNT(*)COUNT(1)COUNT(列名))时,行为和性能存在差异。理解这些差异有助于写出更高效、准确的统计语句。

COUNT 函数的三种常见用法

1. COUNT(*)

  • 作用:统计所有记录的行数,包括 NULL 值(无论字段是否为 NULL,只要行存在就计数)。
  • 特点:
    • 不忽略任何行,包括包含 NULL 的行。
    • InnoDB 引擎对 COUNT(*) 进行了优化,会自动选择最小的索引(非主键索引优先)来加速统计,性能较好。

示例

1
2
-- 统计表中所有记录(包括字段为NULL的行)
SELECT COUNT(*) FROM doc; -- 结果:188(包含所有行)

2. COUNT(1)

  • 作用:统计所有记录的行数,原理与 COUNT(*) 类似(用常量 1 代替字段,只要行存在就计数)。
  • 特点:
    • 同样包含 NULL 值的行(因为 1 是常量,永远非 NULL)。
    • 在 InnoDB 中,COUNT(1)COUNT(*) 性能几乎一致,优化方式相同(优先使用最小索引)。

示例

1
2
-- 结果与 COUNT(*) 相同
SELECT COUNT(1) FROM doc; -- 结果:188(与 COUNT(*) 一致)

3. COUNT(列名)

  • 作用:统计指定列中非 NULL 值的行数(自动忽略 NULL 值)。
  • 特点:
    • 仅计数该列值不为 NULL 的行(若列允许 NULL,结果可能小于总行数)。
    • 若该列上有索引,会使用索引加速统计;否则会全表扫描,性能可能较差。
阅读全文 »