在大多数人观念里,在Java,c#中关于CPU这样的底层是可以不用了解的,那都是从c++/c的事情。但是随着东西深入接触,剖析,结果却非如此。接下来给大家 说下CPU—CPU缓存
CPU一般包括三级缓存分别为一级,二级,三级,随着级别越大速度越慢。
一级缓存,一般比较小,也是靠近CPU最近的,执行速度最快,在CPU一般有两个一级缓存,分别用来存储数据和指令
二级缓存,较之一级缓存来说距离稍远些,容量变大些,具体可能为256k等,一般CPU只有一个二级缓存
三级缓存,又离CPU更远了,不过他却是三个级别中最大,比如12m,也是速度最慢的相较一二级缓存来说,一般一个CPU插槽共享一个三级缓存,而一二级缓存,一般是一个核对应一个二级缓存,和两个一级缓存
所以当CPU运行时,级别越大,距离CPU越远,执行的耗时越明显,一般数据过程,先从一级缓存开始查找数据,没有的话,找到二级缓存,仍没有,则查找三级缓存,最后仍然没有数据,就会从内存中获取数据,这也意味着数据查找的路径越长,执行过程越耗时,所以可以将数据放在一级缓存处,提高执行速度。
关于这三个级别缓存的具体情况,各位还是通过相关工具或者相应的命令具体了解一下。
那么接下来了解一个内容,缓存行
缓存行一般是64个字节,也是缓存读取的最小单位,缓存读取数据,按照一行一行来读取,而非一个字节来读取。举个例子
public class L1CacheMiss {
private static final int RUNS = 10;
private static final int DIMENSION_1 = 1024 * 1024;
private static final int DIMENSION_2 = 6;
private static long[][] longs;
public static void main(String[] args) throws Exception {
Thread.sleep(10000);
longs = new long[DIMENSION_1][];
for (int i = 0; i < DIMENSION_1; i++) {
longs[i] = new long[DIMENSION_2];
for (int j = 0; j < DIMENSION_2; j++) {
longs[i][j] = 0L;
}
}
System.out.println("starting....");
long sum = 0L;
for (int r = 0; r < RUNS; r++) {
final long start = System.nanoTime();
//slow
// for (int j = 0; j < DIMENSION_2; j++) {
// for (int i = 0; i < DIMENSION_1; i++) {
// sum += longs[i][j];
// }
// }
//fast
for (int i = 0; i < DIMENSION_1; i++) {
for (int j = 0; j < DIMENSION_2; j++) {
sum += longs[i][j];
}
}
System.out.println((System.nanoTime() - start));
}
}
}
每次开始内循环时,从内存抓取的数据块实际上覆盖了longs[i][0]到longs[i][5]的全部数据(刚好64字节)。因此,内循环时所有的数据都在L1缓存可以命中,遍历将非常快。
假如,将32-36行‘代码注释而用25-29行代码代替,那么将会造成大量的缓存失效。因为每次从内存抓取的都是同行不同列的数据块(如longs[i][0]到longs[i][5]的全部数据),但循环下一个的目标,却是同列不同行(如longs[0][0]下一个是longs[1][0],造成了longs[0][1]-longs[0][5]无法重复利用)。
一般来说,缓存失效有三种情况:
1. 第一次访问数据, 在cache中根本不存在这条数据, 所以cache miss, 可以通过prefetch解决。
2. cache冲突, 需要通过补齐来解决(伪共享的产生)。
3. cache满, 一般情况下我们需要减少操作的数据大小, 尽量按数据的物理顺序访问数据。
相关推荐
"java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码" 在Windows操作系统中,内存管理是一个非常重要的方面。Windows实现按需调页的虚拟内存机制,使得应用程序可以使用超过...
在Java编程语言中,开发一个绘制CPU使用率图形的程序是一项技术挑战,它涉及到系统监控、图形用户界面(GUI)以及实时数据处理等多方面的知识。这个程序的主要目的是模拟任务管理器的部分功能,显示计算机的CPU使用...
在Java编程环境中,读取系统资源如CPU使用率和内存状态是常见的需求,尤其是在系统监控、性能分析或者优化场景中。下面将详细讲解如何利用Java实现这个功能,并介绍相关的技术点。 首先,Java提供了一个名为`java....
Java程序员了解CPU以及相关的内存模型,对于深入理解...通过分析具体的编程问题,比如Java锁的不同实现方式、CPU缓存的工作机制等,可以帮助程序员更好地理解Java内存模型,在多线程环境下写出更加健壮和高效的代码。
Java 缓存系统实战主要涉及的是使用 Memcached 这一开源缓存框架,它是一个高性能、分布式的内存对象缓存系统。Memcached 提供了 key-value 存储,旨在优化速度差异较大的硬件或软件之间的数据交互。以下是关于 ...
理解MESI协议有助于Java程序员明白在多核处理器上,如何通过缓存一致性协议来管理不同CPU核心上的缓存数据,从而保证数据的正确性。 文件中还提到了其他一些CPU相关的概念,比如QPI代替FSB(快速通道互连替代前端...
枚举进程 线程 模块 句柄 取CPU信息 缓存 页文件信息等等
为了评估和优化缓存性能,可以使用Java的性能分析工具,如JVisualVM、JProfiler等,进行CPU、内存和线程的监控。通过这些工具,我们可以发现潜在的性能瓶颈并进行优化。 在项目中,可能包含了以下核心部分: 1. ...
本项目基于Java语言实现了CPU的5级流水线仿真,旨在帮助学习者深入理解计算机系统结构,尤其是流水线的工作原理。以下是关于这个主题的详细知识讲解: 一、CPU流水线 1. 流水线概念:流水线技术借鉴了工业生产线的...
此外,CPU的缓存大小也会影响性能,L1、L2和L3缓存分别位于不同层次,用于存储常用数据,减少内存访问延迟。 Java是一种广泛使用的编程语言,它具有跨平台的能力,可以在各种操作系统上运行。在硬件信息获取方面,...
缓存行(Cache Line)是CPU缓存存储数据的基本单位,通常包含几十到几百个字节的数据。当多个线程同时访问不同但相邻的数据时,可能会引发竞争条件,导致性能下降,这种现象被称为缓存冲突或缓存不命中。在Java中,...
Java缓存技术是提高应用程序性能的关键技术之一,它通过存储频繁访问的数据,减少了对慢速资源(如磁盘或远程服务)的依赖,从而提升了系统的响应速度。本篇将深入探讨Java缓存技术的原理、分类以及在不同层次的应用...
1. **CPU信息**:CPU-Z能够提供关于处理器的详细信息,如制造商、型号、核心名称、频率、线程数、缓存大小等。这对于识别和优化硬件性能至关重要。 2. **内存信息**:该工具可以显示内存类型(DDR3/DDR4等)、速度、...
本项目就是基于Java利用第三方jar包Sigar(System Information Gatherer and Reporter)来实现服务器系统的实时参数监控,涵盖了CPU、内存、硬盘以及网络流量四大关键指标。 首先,让我们深入理解Sigar库。Sigar是...
在本项目中,我们关注的是一个基于Java编写的CPU资源管理器程序。这个程序能够监控和展示计算机的CPU使用情况,类似于操作系统自带的任务管理器。它由一位知名的Java开发者创建,提供了一次深入理解Java编程语言以及...
本文主要谈谈CPU缓存对Java编程的影响,不涉及具体CPU缓存的机制和实现。 现代CPU的缓存结构一般分三层,L1,L2和L3。如下图所示: 级别越小的缓存,越接近CPU, 意味着速度越快且容量越少。 L1是接近...
浅谈Linux内核之CPU缓存.pdf
在Java应用中,当频繁访问的数据从数据库获取时,缓存系统可以暂时存储这些数据,避免每次请求都直接查询数据库,从而减少系统负载和CPU占用。缓存元素类(Element)是缓存系统的基础,包含了对象的属性和处理这些...
在java开发中如何解决缓存雪崩的问题,因为缓存失效导致数据未加载到缓存中,或者缓存同一时间大面积的失效 从而导致所有请求都去查询数据库,导致数据库CPU和内存负载过高,甚至宕机