JVM 思维导图
JVM
Linux内存管理
内存管理
CPU平均负载升高的三个排查角度
1yum install -y man-pages 平均负载 == 平均活跃进程数 != cpu使用率uptime:1 分钟、5 分钟、15 分钟的平均负载(Load Average)。 0.63 不是CPU的使用率,而是单位时间内,系统处于可运行和不可中断的平均线程数。也就是平均活跃进程数。 可运行:ps 显示的进程是R状态的,也就是Running或者Runnable状态的。 不可中断:ps 显示的进程是D状态的,也就是Disk sleep的进程。处于内核态的关键流程,不可中断,否则会出现磁盘和进程的数据不一致。此状态是系统对硬件和进程的的一种保护机制。 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。 平均负载多少合理查看CPU的个数 top 或者 grep 'model name' /proc/cpuinfo | wc -l 根据**系统负载趋...
分布式共识问题、理论、协议和算法
兰伯特有很多关于分布式的理论,这些理论都很经典(比如拜占庭将军 问题、Paxos),但也因为太早了,与实际场景结合的不多,所以后续的众多算法是在这个 基础之上做了大量的改进(比如Raft 等) 两种分布式共识问题是否存在伪造或者篡改的恶意行为。 忠诚的将军,正常运行的计算机节点; 叛变的将军,出现故障并会发送误导信息的计算机节点; 信使被杀,通讯故障、信息丢失; 信使被间谍替换,通讯被中间人攻击,攻击者在恶意伪造信息和劫持通讯。 拜占庭问题 以及容错算法概述分布式共识问题,是分布式系统领域最复杂的**分区容错一致性模型的**情景化描述 问题 它描述了如何在存在恶意行为(如消息篡改或伪造)的情况下使分布式系统达成一致 将军可能是叛徒,信使也可能是叛徒 口信消息型解决方案(A solution with oral message)有m个将军叛变,要有3m+1个将军才可以实现最终达成一致。 从另外一个角度理解:n 位将军,最多能容忍 (n - 1) / 3 位叛将 原则:副官相互交流时候,少数服从多数 步骤: 1。第一轮**指挥官先发送,不管指挥官是不是叛徒,不是...
JSON字符串转换为Map
利用阿里巴巴封装的FastJSON来转换json字符串 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.util.Map; public class JsonToMapTest01 { public static void main(String[] args){ String str = "{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wan...
进程间的通信⽅式有哪些?区别是什么,为什么需要?
进程间的通信⽅式有哪些?区别是什么,为什么需要?导图有笔记 https://www.processon.com/view/link/60ef10dae0b34d06fba96f3d 进程的通信有 6 种,分别是:管道、消息队列、共享内存、信号量、socket,信号。 他们的区别,有哪些应⽤,为什么需要这些? 管道匿名管道: Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。并且这种通信方式是**单向**的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 命名****管道: 下面我们来创建一个命名管道。 执行之后会卡住 在另一个进程里面执行输出管道内容就可以了 从上面的例子可以看出,管道的通知机制类似于缓存,就像一个进程把数据放在某个...
观察者模式Observer
观察者接口:Observer接口、Listener接口、Hook、Callback 具体观察者:实现Observer接口 事件类 :不仅仅包含时间,事件,还包含事件源。这样观察者拿到事件知道是谁发的才可以做有区别的处理 事件源对象:被观察者Object, 事件源对象,新建事件对象。事件源自己会维护很多监听器。可以调用监听器接口的方法, **事件对象 **穿过 Observer的链条 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485package com.deltaqin.designPattern.d09_observer;import java.util.ArrayList;import java.util.List;/** * @author deltaqin * @date 2021/3/27 12...
设计模式、设计原则、重构与编码规范(设计模式之美笔记)
设计模式要干的事情就是对复杂解耦。利用更好的代码结构将一大坨代码拆分成职责更单一的小类,让其满足高内聚低耦合等特性。 创建型模式是将创建和使用代码解耦,结构型模式是将不同的功能代码解耦,行为型模式是将不同的行为代码解耦。 而解耦的主要目的是应对代码的复杂性。设计模式就是为了解决复杂代码问题而产生的。 为什么设计模式? 面试会问 提高复杂代码的设计和开发能力。避免只是框架用的溜。 如何分层、分模块、分类 每个类应该有哪些属性和方法 怎么设计类之间的交互,用继承还是组合 使用接口还是抽象类,怎么做到解耦、高内聚和低耦合 该用单例模式还是静态方法 用工厂模式创建对象还是直接new出来 如何避免使用了设计模式提高扩展性的同时降低了可读性 告别写被人吐槽的烂代码,团队里面的代码标杆,不经意间写出来的代码,都能作为同事学习、临摹的范例。 读源码的时候根据设计模式推测作者的思路,做到事半功倍。 如何评价代码质量的好坏?即使一段代码的可扩展性很好,但可读性很差,那我们也不能说这段代码质量高。常见的评价指标: 可维护性:分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设...
Linux的IO知识总结
文件系统,是对存储设备上的文件进行组织管理的一种机制。为了支持各类不同的文件系 统,Linux 在各种文件系统上,抽象了一层虚拟文件系统 VFS。 它定义了一组所有文件系统都支持的数据结构和标准接口。这样,应用程序和内核中的其他 子系统,就只需要跟 VFS 提供的统一接口进行交互。 在文件系统的下层,为了支持各种不同类型的存储设备,Linux 又在各种存储设备的基础 上,抽象了一个通用块层。 通用块层,为文件系统和应用程序提供了访问块设备的标准接口;同时,为各种块设备的驱 动程序提供了统一的框架。此外,通用块层还会对文件系统和应用程序发送过来的 I/O 请 求进行排队,并通过重新排序、请求合并等方式,提高磁盘读写的效率。 通用块层的下一层,自然就是设备层了,包括各种块设备的驱动程序以及物理存储设备。 文件系统、通用块层以及设备层,就构成了 Linux 的存储 I/O 栈。存储系统的 I/O ,通常 是整个系统中最慢的一环。所以,Linux 采用多种缓存机制,来优化 I/O 的效率,比方说, 为了优化文件访问的性能,采用页缓存、索引节点缓存、...
雪花算法
原文连接: https://blog.csdn.net/lq18050010830/article/details/89845790 SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的 这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号 1 bit:是不用的,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。 41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。 10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^1...
