自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 02—怎么理解内存中的Buffer和Cache?

02基础篇:怎么理解内存中的Buffer和Cache?1. Buffer和Cache区别 在读写普通文件时,I/O 请求会首先经过文件系统,然后由文件系统负责,来与磁盘进行交互。而在读写块设备文件时,会跳过文件系统,直接与磁盘交互,也就是所谓的“裸 I/O”。这两种读写方式使用的缓存自然不同。文件系统管理的缓存,其实就是 Cache 的一部分。而裸磁盘的缓存,用的正是 Buffer。 总而言之,Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,...

2021-03-15 10:40:23 177

原创 01-Linux的内存是如何工作的?

Linux的内存是如何工作的?1. 内存映射 (1)物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。 (2)Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。虚拟地址空间的内部又被分为内核空间和用户空间两部分。 (3)所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来...

2021-03-15 10:35:36 110

原创 08—怎么理解linux软中断

怎么理解linux中断 其实除了 iowait,软中断(softirq)CPU 使用率升高也是最常见的一种性能问题。1. 从“外卖”看中断 说到中断,我在前面关于“上下文切换”的文章,简单说过中断的含义,先来回顾一下。中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。 你可能要问了,为什么要有中断呢?我可以举个生活中的例子,让你感受一下中断的魅力。 比如说你订了一份外卖,但是不确定外卖什么时候送到...

2021-03-15 10:19:34 225 1

原创 07—不可中断进程和僵尸进程怎么办(下)

系统出现大量不可中断进程和僵尸进程怎么办(下) 上一节,我给你讲了 Linux 进程状态的含义,以及不可中断进程和僵尸进程产生的原因,我们先来简单复习下。使用 ps 或者 top 可以查看进程的状态,这些状态包括运行、空闲、不可中断睡眠、可中断睡眠、僵尸以及暂停等。其中,我们重点学习了不可中断状态和僵尸进程:不可中断状态,一般表示进程正在跟硬件交互,为了保护进程数据与硬件一致,系统不允许其他进程或中断打断该进程。 僵尸进程表示进程已经退出,但它的父进程没有回收该进程所占用的资源。两个问题:..

2021-03-15 10:14:46 171

原创 06—不可中断进程和僵尸进程怎么办?(上)

系统中出现大量不可中断进程和僵尸进程怎么办?(上)1. 进程状态 top 和 ps 是最常用的查看进程状态的工具,我们就从 top 的输出开始。下面是一个 top 命令输出的示例,S 列(也就是 Status 列)表示进程的状态。从这个示例里,你可以看到 R、D、Z、S、I 等几个状态,它们分别是什么意思呢? 我们挨个来看一下:R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。 D 是 Disk Sleep 的...

2021-03-15 10:00:25 135

原创 05—如何找到CPU利用率高的应用?

如何找到CPU利用率高的应用?1. 上节回顾 上一节介绍了CPU 使用率是什么,并通过一个案例教你使用 top、vmstat、pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题。不过就有人留言了,说似乎感觉高 CPU 使用率的问题,还是挺容易排查的。 那是不是所有 CPU 使用率高的问题,都可以这么分析呢? 你的答案应该是否定的。回顾前面的内容,我们知道,系统的 CPU 使用率,不仅包括进程用户态和内核态的运行,还...

2021-03-15 09:54:57 170

原创 04—CPU利用率过高怎么办?

某个应用的CPU利用率达到100%,我该怎么办?1. CPU使用率 Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。 节拍率 HZ 是内核的可配选项,可以设置为 100、250、1...

2021-03-15 09:43:46 487

原创 03—CPU上下文切换(下)

CPU上下文切换是什么意思(下)1. 怎么查看上下文切换情况? 通过前面学习我们知道,过多的上下文切换,会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶。在这里,我们可以使用 vmstat 这个工具,来查询系统的上下文切换情况。 vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。 下面是一个vmstat示例: 图...

2021-03-15 09:38:56 96

原创 02—CPU上下文切换(上)

CPU上下文切换是什么意思(上)1. CPU上下文我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU上下文。CPU上下文包括了寄存器和程序计数器。寄存器:是 CPU 内置的容量小、但速度极快的内存。程序计数器:则是用来

2021-03-15 09:33:32 182

原创 01—如何理解CPU的平均负载

到底如何理解“平均负载”1. 平均负载概念平均负载又可以理解成:单位时间的“平均活跃进程数”。这里的活跃进程,主要指可运行状态的进程和不可中断状态的进程。它和CPU使用率没有直接的关系。2. 可运行状态和不可中断状态进程可运行状态进程:可运行状态的进程是指正在使用CPU或者等待CPU的进程,也就是我们通过ps命令能查看到的Running或者Runnable状态的进程。不可中断状态进程:不可中断进程是指正处于内核关键的进程,这些是不能打断的。也就是我们通过ps命令能查看到的D状态的进.

2021-03-15 09:28:09 479

转载 理解java的interrupt机制

本文转载于http://xiezhaodong.me/2017/02/19/%E7%BA%BF%E7%A8%8B%E7%9A%84%E4%B8%AD%E6%96%AD(interrupt)%E6%9C%BA%E5%88%B6/取消/关闭的场景    我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种情况,比如...

2018-03-30 13:38:58 1561

原创 B树的java实现

1. B树基本概念      关于B树的基本概念、定义可以参考这篇博客:http://blog.csdn.net/kalikrick/article/details/27980007,本文侧重于B树的java代码实现。1.1 B树性质B树T有如下性质:      1. 每个节点x有如下属性:x.n表示节点当前key的个数。x中key满足:x.key1 <= x.key2<= x.key...

2018-03-19 16:31:03 1375 1

原创 jdk1.8 HashMap的源码解析

Hashmap    基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文将结合源码,具体分析HashMa...

2018-02-23 19:06:16 552

转载 String对象创建的过程详解

String对象创建的过程详解本文主要摘自于http://blog.csdn.net/xiabing082/article/details/49759071这篇博客。public class Class Test {private String itemS ="我们 ";private final int itemI =100 ;public void setItemS (String para ...

2018-02-23 14:34:20 736

原创 jdk1.8的Hashtable源码解析

Hashtable声明public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable    Hashtable继承于Dictionary类(Dictionary类声明了操作键值对的接口方法),实现Map接口(定义键值对...

2018-02-14 20:13:59 1840

原创 JVM类加载机制和创建对象的过程

1、JVM运行和类加载过程一、类的加载机制类加载机制:JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM 可以直接使用的Java类型的过程。主要有三步:加载、连接、初始化。其中连接又可以细分为:验证、准备和解析。加载:类的加载是指把.class文件中的二进制数据读入到内存(方法区)中,将字节流代表的静态存储结构转化成方法区的运行时数据结构,之后在堆区创建一个(java...

2018-02-13 14:29:39 1952

转载 详解单例设计模式的线程安全问题

1. 饿汉模式/** * 饿汉模式 */public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return in...

2018-02-13 13:11:56 229

原创 深入理解Spring IOC和集合注入

一、什么是Ioc/DI?IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等。先从我们自己设计这样一个视角来考虑:  所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。对象和对象关系怎么表示?  可以用 xml , pro...

2018-02-12 14:33:16 365

原创 深入了解Java“双亲委派”模型

一、三种类加载器 JVM并不是把所有的类一次性全部加载到JVM中的,也不是每次用到一个类的时候都去查找,对于JVM级别的类加载器在启动时就会把默认的 JAVA_HOME/lib里的class文件加载到JVM中,因为这些是系统常用的类,对于其他的第三方类,则采用用到时就去找,找到了就缓存起来的, 下次再用到这个类的时候就可以直接用缓存起来的类对象了。    AppClassLoader的Parent...

2018-02-07 18:13:03 460

原创 Proxy动态代理机制的Java实现

动态代理Proxy    代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。    通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性。下面,举一个简单例子(在小猫

2018-01-29 19:38:09 206

原创 算法导论学习笔记—红黑树最全的Java实现

红黑树(red-black-tree)是许多“平衡”搜索树的一种,它可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lgn)。除遍历外,其余的方法的时间复杂度都为O(lgn),如INSERT, SEARCH, MAXIMUM, MINIMUM, DELETE等。本章 将依次介绍一些比较重要的方法,并赋予其Java代码的实现。详细的红黑树理论,可以参考《算法导论》中P174-192。注

2018-01-24 15:24:31 404

原创 最大二叉堆的Java实现

二叉堆的介绍二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。二叉堆一般都通过"数组"来实现,下面是数组实现的最大堆和最小堆的示意图: 二叉堆的图文解析图文解析是以"最大堆"来进行介绍的。最大堆的核心内容是"添加"和"

2017-12-08 21:13:06 307

原创 判断N维矩阵是否是Monge矩阵的Java实现

Monge阵列的概念    在一个m*n的矩阵中,任意选中两行两列,其交叉点的4个元素会构成一个二维矩阵,并且在该矩阵中:(左上+右下)利用“分而治之”思想遍历n*n维矩阵(n为2的幂)    首先,将一个n*n维矩阵拆成4个子矩阵:A11,A12,A21,A22    其次,判断每个子矩阵是否为Monge矩阵   然后,判断越过“垂直中线”的二维矩阵是否是Monge矩阵

2017-12-01 15:17:44 509

原创 算法导论学习笔记—Strassen算法的Java实现

Strassen算法    Strassen算法的核心思想是令递归树稍微不那么茂盛,相比于简单的“分而治之”的矩阵递归计算,其递归的分支由8条减少到7条。其时间复杂度为O(n的lg7次方)。虽然,它的算法中需要新增10个(n/2 * n/2)的中间矩阵S1-S10。每次子矩阵的加减运算会增加O(n平方/4)的时间消耗,所以代码在执行S1-S10时,这部分的时间复杂度为10*O(n平方/4),但

2017-11-29 16:27:28 358

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除