自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 GIS面积计算

GIS面积计算

2023-02-06 11:27:43 1284

原创 jvm内存分代

新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其中一块Survivor(From),在经过一次Minor GC后,将Eden和Survivor中还存活的对象一次性地复制到另一块Survivor空间上(这里使用的复制算法进行GC),最后清理掉Eden和刚才用过的Survivor(From)空间。将此时在Surviv

2021-02-25 23:48:19 173

原创 asm指令

一勺思想We are all in the gutter, but some of us are looking at the stars. (我们都生活在阴沟里,但仍有人仰望星空 )- 王尔德 《温德米尔夫人的扇子》举世混浊我独清,众人皆醉我独醒 - 屈原 《楚辞》前言ASM是一种通用Java字节码操作和分析框架。它可以用于修改现有的class文件或动态生成class文件。ASM is an all purpose Java bytecode manipulation and analysis

2021-02-18 00:04:55 878

原创 lru算法

Redis作为缓存使用时,一些场景下要考虑内存的空间消耗问题。Redis会删除过期键以释放空间,过期键的删除策略有两种:惰性删除:每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。另外,Redis也可以开启LRU功能来自动淘汰一些键值对。LRU算法当需要从缓存中淘汰数据时,我们希望能淘汰那些将来不可能再被使用的数据,保留那些将来还会频繁访问的数据,但最大的问题是缓存并不能预言未来

2021-02-17 23:51:49 460

原创 MYSQL脏页落盘

mysql启动后buffer pool会初始化。buffer pool也会初始化好n多个空白的缓存页,以及它们的描述数据会被组织成lru链表以及freelist 双向链表。这时你从磁盘中读取一个数据页,会先从free list中找出一个空闲缓存页的描述信息,然后将你读出的数据页中加载进缓存页中。同时将缓存页的描述信息从free list中剔除,此外该描述信息块还会被维护进lru链表中。数据页被加载进buffer pool后你就可以对其进行变更操作了。二、flush list为了加快响应客户端的速度,

2021-02-17 23:44:03 242

原创 jvm dup指令

作者:RednaxelaFX链接:https://www.zhihu.com/question/52749416/answer/132831920来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。这个表达式的作用是:创建并默认初始化一个Test类型的对象调用Test类的signature为 ()V 的构造器表达式的值为一个指向这个新建对家的引用。对应到字节码,我们可以看到:new Test 对应上面的(1)invokespecial Test.()V 对应上面的(2)然而

2021-02-17 22:09:42 919

原创 缓存行 分页机制

在硬件工程师和普通用户看来,内存就是插在或固化在主板上的内存条,它们有一定的容量——比如64 MB。但在应用程序员眼中,并不过度关心插在主板上的内存容量,而是他们可以使用的内存空间——他们可以开发一个需要占用1 GB内存的程序,并让其在OS平台上运行,哪怕这台运行主机上只有128 MB的物理内存条。而对于OS开发者而言,则是介于二者之间,他们既需要知道物理内存的细节,也需要提供一套机制,为应用程序员提供另一个内存空间,这个 内存空间的大小可以和实际的物理内存大小之间没有任何关系。我们将主板上的物理内存条所

2021-02-17 22:06:00 227

原创 dma磁盘

当我们在应用程序中编写write系统调用,向磁盘中写入数据时,写入请求会先调用底层写函数,将请求先写入内存中的页高速缓存(page cache)中,写入成功则立刻返回,真正的写入磁盘操作会延迟执行。Page cache是硬盘在内存中的一个缓存,是linux内核所使用的主要磁盘高速缓存,在绝大多数情况下,内核在读写磁盘时都引用page cache(极少数应用会绕过页高速缓存,如数据库软件)。当把page cache中的一页数据写到块设备之前,内核首先检查对应的页是否已经在高速缓存中,如果不在,就要先在其中增

2021-02-17 18:08:25 266

原创 lru刷盘

1、Buffer Pool的缓存页以及几个链表Buffer Pool在运行中被使用的时候,实际上会频繁的从磁盘上加载数据页到他的缓存页里去,然后free链表、flush链表、lru链表都会在使用的时候同时被使用。比如数据加载到一个缓存页,free链表里会移除这个缓存页,然后lru链表的冷数据区域的头部会放入这个缓存页。然后如果你要是修改了一个缓存页,那么flush链表中会记录这个脏页,lru链表中还可能会把你从冷数据区域移动到热数据区域的头部去。如果你是查询了一个缓存页,那么此时就会把这个缓存页在lru链

2021-02-17 17:57:04 115

原创 4k内存页

windows和unix处理内存时,一个内存页的大小都为4k。测试代码int main(){while (1) {int *p = (int *)malloc(1024);getchar();}return 0;}回车四次,程序内存增加一次,每次增加4k。

2021-02-17 14:21:14 236

原创 redis哨兵发布订阅

订阅频道首先进入客户端 (以下所有操作都是在进入客户端的前提下)redis-clisubscribe test //test为频道号11这里写图片描述上图第二个参数表示订阅的频道名称 第三个参数表示该客户端订阅的频道总数发布频道后,订阅频道客户端收到如下内容这里写图片描述订阅模式psubscribe test* //匹配 testf test开头到所有频道11这里写图片描述发布频道后,订阅模式客户端收到如下内容这里写图片描述发布频道publish test ‘redis

2021-02-17 02:57:07 272

原创 写时复制

如果大家学习了内核中进程的部分就会听说过‘写时复制’ 。但是从来没有想过在用户态和内核态上‘写时复制’判断的前提条件都不一样。在进程创建之初,父子进程的数据段和代码段共享并且设置为只读,直到他们之一要将代码和数据段进行修改时才会进行复制即写时复制。但是,这种判断条件只能用于用户态,因为8086cpu, 在执行特权0代码时不会理会用户空间中页面是否为有保护,用户空间中数据页面保护标志不起任何作用的。这样将违背了进程的独立性。用户态的写时复制:在对页面进程修改时会受到用户空间页面标志的影响。在用户态上的

2021-02-16 00:43:27 334

原创 save bgsave

Redis Save 与 BGSAVE 的区别一,save保存数据到磁盘的方式:Redis Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。语法redis Save 命令基本语法如下:redis 127.0.0.1:6379> SAVE返回值保存成功时返回 OK 。二,BGSAVE保存数据到磁盘的方式:BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redi

2021-02-16 00:08:23 205

原创 aof

AOF三种写入策略always客户端的每一个写操作都保存到aof文件当,这种策略很安全,但是每个写请注都有IO操作,所以也很慢。everysecappendfsync的默认写入策略,每秒写入一次aof文件,因此,最多可能会丢失1s的数据。noRedis服务器不负责写入aof,而是交由操作系统来处理什么时候写入aof文件。更快,但也是最不安全的选择,不推荐使用。AOF重写AOF将客户端的每一个写操作都追加到aof文件末尾,指将多个指令相同的key进行重写,生成一个最少命令集两种重

2021-02-15 23:39:23 189

原创 bg fg

linux下我们如果想一个任务或者程序还后台执行可以使用&,实际上linux还提供了其他任务调度的命令。bg将一个在后台暂停的命令,变成继续执行fg将后台中的命令调至前台继续运行jobs查看当前有多少在后台运行的命令ctrl + z可以将一个正在前台执行的命令放到后台,并且暂停nohup 命令用途:不挂断地运行命令。语法:nohup Command [ Arg … ] [ & ]描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽

2021-02-15 23:15:36 509

原创 布谷鸟过滤器

前言昨天聊到了 Redis 的位图, 那今天就顺带聊聊位图的最常见场景之一: 大数据下去重过滤功能.正文最常见的例子: 十亿邮箱去重. 无论用Redis哪种格式, 内存的消耗都是极大的. HyperLogLog 的 0.81%的错误率, 在这种场景又显得太高.所以就有了布隆过滤器.布隆过滤器原理是通过多个 hash 函数, 将结果对应的位设为1, 所以它能做到 100%的去重. 虽然会误判, 但是在合理的设计的前提下, 误判率是可以接受的.但布隆过滤器也不是完美无缺的.首先它的查询性能相对较弱

2021-02-15 00:50:07 670

原创 Counting Bloom Filter

Bloom Filter的出现,使得海量数据搜索的效率提高了非常多,大家针对简单的Bloom Filte存在的各种局限进行分析,从而得到了不同的演化版本,本文针对这些演化版本进行粗略分类与介绍,简要说明各类演化版本的优缺点。1.Counting Bloom Filter简单的Bloom Filter中位向量中的各个位由于只有0,1两种数值,而不同的元素经过Hash后可能得到相同的位编号,这样一来多个元素都把该位置的值置为1,这种情况在数据量很大的情况下非常普遍,所以,如果表达的元素集合经常发生删除等变动

2021-02-14 23:51:11 433

原创 multi事务

Redis中的Multi和Pipleline都可以一次性执行多个命令,但是Pipeline只是把多个redis指令一起发出去,redis并没有保证这些指令执行的顺序,且减少了多次网络传递的开销,因而其执行效率很高;Multi相当于一个redis的transaction,保证整个操作的有序性,通过watch这些key,可以避免这些key在事务的执行过程中被其它的命令修改,从而导致得的到结果不是所期望的。官方介绍MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令,事务

2021-02-14 23:34:50 101

原创 socket

1、网络中进程之间如何通信?2、Socket是什么?3、socket的基本操作3.1、socket()函数3.2、bind()函数3.3、listen()、connect()函数3.4、accept()函数3.5、read()、write()函数等3.6、close()函数4、socket中TCP的三次握手建立连接详解5、socket中TCP的四次握手释放连接详解6、一个例子(实践一下)7、留下一个问题,欢迎大家回帖回答!!!1、网络中进程之间如何通信?本地的进程间通信(IPC)

2021-02-14 22:55:57 81

原创 epoll

后台开发,网络交互是必须的,而epoll基本绝大多数网络框架的必备武器,本文对epoll进行详细的介绍,包括epoll的作用,优点,接口,实现原理等。一. epoll是什么epoll是一种IO多路转接技术,在LINUX网络编程中,经常用来做事件触发,即当有特定事件到来时,能够检测到,而不必阻塞进行监听。epoll有两种工作方式,ET-水平触发 和 LT-边缘触发(默认工作方式),主要的区别是:LT,内核通知你fd是否就绪,如果没有处理,则会持续通知。而ET,内核只通知一次。二. epoll的优点

2021-02-14 21:31:28 67

原创 mmap

共享内存映射之mmap()函数详解共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的

2021-02-14 21:20:34 104

原创 AtomicStampedReference

AtomicReference底层:AtomicReference原子应用类,可以保证你在修改对象引用时的线程安全性,比较时可以按照偏移量进行怎样使用AtomicReference:AtomicReference ar = new AtomicReference();ar.set(“hello”);//CAS操作更新ar.compareAndSet(“hello”, “hello1”);AtomicReference的成员变量:private static final long serial

2021-02-12 15:08:43 134

原创 工作七年技术总结

1 定位fullgc方法,以现在的硬件一般单机tps基本在上千,如果tps降到几十,并且jstat —gcutil fullgc一直持续上升,表示有大对象频繁创建,需要分析具体哪个对象在频繁创建,先使用dump命令导出内存文件,用mat分析,一般是看最大的那块区域分析对象也是看最大的内存占用,点进去即可分析到具体对象,结合实际业务解决即可。2 countdownlatch使用:new一个当前需要处理集合大小的对象,每处理一个countdown一次,集合处理完毕wait2S。3 自定义注解,定义一个@in

2021-02-10 17:27:32 85

原创 nomn

首先下载nmon及nmon analysernmon用来采集信息,nmon analyser用来生成图表nonm的使用命令为:./nmon -f -s 10 -c 60-f 表示生成的数据文件名中有时间;-s 10 表示每 10 秒采集一次数据;-c 60 表示采集 60 次,10*60=600 秒;执行命令之后会在nomn的同级目录下生成以.nmon后缀结尾的文件采集完数据之后,将生成的文件使用nmon analyser进行分析生成图表nmon analyser报错“输入超出文件尾”的解

2021-02-09 11:22:55 685

原创 skiplist

前几天在看Redis的时候,看到网上说,Redis采用的是 Skiplist 而不是红黑树,但当时就给我整懵了。啥子东西叫Skiplist,一查,翻译还挺直白——跳表。看起来很高级啊,于是嗖嗖嗖马上查资料0X 10 Skiplist的设计初衷在看到Skiplist庐山真面目之前,我们先来了解它是怎么出现的,或者说为何要出现链表想必大家都熟悉,一般来讲,它长这样:在这里插入图片描述上面是一个有序链表,我们知道链表有一个好处就是在删除和插入的时候很方便。但是,美中不足的就是,查询是它的一个软肋。

2021-01-29 00:35:54 79

原创 condition

1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从***整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Cond

2021-01-29 00:23:04 105

原创 locksupport

LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数:[java] view plain copypublic native void unpark(Thread jthread); public native void park(boolean isAbsolute, long time); isAbsolute参数是指明时间是绝对的,还是相对的。仅仅两个

2021-01-29 00:08:16 47

原创 priorityqueue

先讲使用,再讲原理队列是遵循先进先出(First-In-First-Out)模式的,但有时需要在队列中基于优先级处理对象。举两个例子:作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。每日交易时段生成股票报告的应用程序中,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处理优先客户再处理普通用户。在这种情况下,Java的PriorityQueue(优先队列

2021-01-28 23:51:47 127

原创 aqs clq

ConcurrentLinkedQueue(简称clq)头尾节点的更新使用懒更新因为clq使用cas操作更行tail和head,CAS即乐观锁,而只有在真正乐观的时候(竞争不够激烈)使用CAS才比加锁 park线程要快。为了避免竞争太激烈而造成cas一直失败,即让情况更加符合所谓的乐观情况,懒更新就可以起到一定作用。AQS的锁获取也是先尝试几次CAS,如果都失败了则把线程加入等待队列,避免了极端情况(cas一直失败cpu一直空转)的发生。clq没有这样做,他只是使用懒更新来尽量避免出现竞争太激烈的c

2021-01-28 23:47:26 177

原创 copyonwritearraylist

CopyOnWriteArrayList详解可以提前读这篇文章:多读少写的场景 如何提高性能写入时复制(CopyOnWrite)思想  写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者(Callers)同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持

2021-01-28 23:26:39 189

原创 forkjoin分而治之

1.什么是Fork/join框架?从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务。它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果。如下图:分而治之思想2.什么是分而治之思想可以简单的理解为:将规模为N的问题,当N<阈值,直接解决;当N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解。3. 工作窃取(work-stealing)在这里插入图片描述假如我们需要做一个比较大的任务,我们

2021-01-28 00:30:50 63

原创 forkjoinpool

本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码。说在前面可以说是说明,也可以说下面是结论:ForkJoinPool 不是为了替代 ExecutorService,而是它的补充,在某些应用场景下性能比 ExecutorService 更好。ForkJoinPool 主要用于实现“分而治之”的算法,特别是分治之后递归调用的函数,例如 quick sort 等。ForkJoinPool 最适合的是计算密集型的任务,如果存在 I/O,线程间同步,sleep() 等会造成

2021-01-28 00:24:16 192

原创 aqs流程

2021-01-26 00:44:32 110

原创 线程池ctl源码

线程池ctl源码打开ThreadPoolExecutor的源码(我裁剪掉了一部分),一开始就会发现:public class ThreadPoolExecutor extends AbstractExecutorService {/** 我以一个字节8位来简化解释线程池对运行状态和当前有效线程个数的原子管理方案 * 线程池当中,用一个ctl原子变量包装了高3位的运行状态和低5位的线程个数 * * 运行状态: 线程池初始化后,就处于该状态:此时,线程池可以接受新任务并且处理任务 * 关

2021-01-25 23:39:33 366 1

原创 线程池addwork

ctl属性:其前三位是运行状态位,后29位是线程个数注:增加work时有重入锁主要步骤获取当前线程池的状态,如果是STOP,TIDYING,TERMINATED状态的话,则会返回false,如果现在状态是SHUTDOWN,只有在要运行的任务为空且还有还有工作任务时才可以添加线程,其他shutdown时不允许创建线程(线程池的状态不符合直接返回)通过自旋的方式,判断要添加的Worker是否是corePool,如果是的话,那么则判断当前的workerCount是否大于corePoolsize,否则则判断

2021-01-25 23:25:42 271

原创 线程池hash算法

hash算法选择1 rotatehash 算法2 add hash算法3 选择hash结果1 rotatehash 算法static int hash_rotate(const char key, int prime){int hash, i;int len = strlen(key);for (hash = len, i = 0; i < len; i++){hash = (hash<<4>>28)^key[i];return (hash % pri

2021-01-24 14:26:43 269

原创 futuretask

FutureTask源码解析第一部分:What在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。本文会简要的介绍使用方法,然后会从源代码角度分析下具体的实现原理。本文以Java 1.7的代码进行分析。第二部分:HowCallable接口对于需要执行的任务需要实现Callable接

2021-01-24 12:49:08 89

原创 虚引用对外内存管理

1.什么是堆外内存?堆外内存和堆内内存是两个相对的概念,其中堆内内存(on-heap memory)是我们平常工作中接触比较多的。Java中分配的非空对象都是由Java虚拟机的垃圾收集器管理的,都是放在堆内内存。我们可以通过jvm参数-Xms,-Xmx等设置堆的大小和最大值。jvm会采用垃圾回收器(GC)统一进行内存管理,GC会在某些特定的时间点进行一次彻底回收,也就是Full GC,Full GC会对所有分配的堆内内存进行扫描,在这个过程中会对JAVA应用程序的性能造成一定影响,还可能会产生Stop

2021-01-24 00:49:01 470

原创 acquire release

Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量。关于信号量Semaphore的acquire与release的说明1、Semaphore信号量作为一种流控手段,可以对特定资源的允许同时访问的操作数量进行控制,例如池化技术(连接池)中的并发数,有界阻塞容器的容量等。2、Semaphore中包含初始化时固定个数的许可,在进行操作的时候,需要先acquire获取到许可,才可以继续执行任务,如果获取失败,则进入阻塞;处理完成之后需要release释放许可。3、acqui

2021-01-22 01:13:28 221

原创 信号量

介绍  信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。概念  Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许

2021-01-22 01:08:25 85

空空如也

空空如也

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

TA关注的人

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