自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入剖析Linux内核IA32体系地址映射

前言:本文来剖析一个虚拟地址到真实的物理地址的映射过程。因为一旦牵扯到内核,则比较令人头疼,有未分析到的或者有误之处欢迎讨论。 我们知道,进程一旦被创建出来,操作系统会给进程分配4G的虚拟地址空间(32位体系),Linux在用户申请内存的时候,只是分配给了它一个线性区(虚拟地址),并没有分配实际的物理内存,只有当用户使用内存的时候,内存才会分配具体的物理页面给用户。我们就来剖析一下这个过程。 基

2017-12-07 22:25:26 388

原创 glibc内存管理ptmalloc底层实现

前言:本文剖析了glibc内存管理ptmalloc的底层实现原理,以及用到的各种数据结构的分析。源码在本文中暂未剖析,接下来会学习。如果你想了解ptmalloc的底层实现,欢迎阅读。 一、基础知识: X86平台Linux进程内存布局 32位模式下进程内存经典布局 32位模式进程默认内存布局 从上图可以看到,栈至顶向下扩展,并且栈是有界的。堆至底向

2017-11-27 20:01:50 1056

原创 CAS操作实现并发的优势、以及实现一个无锁队列、怎样解决ABA 问题

一、CAS(Compare and set)简介 1.概念:直译:比较和替换。简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值。 2.特点:CAS是一种系统原语也就是所谓的原子操作,由若干条指令完成,用于完成一个功能的过程,原语的执行过程必须是连续的,不允许被中断。CA

2017-10-31 23:20:00 1495

原创 **系统调用**

本文只是自己学习总结,当然欢迎大家阅读,要想更好的了解系统调用以及windowsAPI(推荐去看程序员自我修养第12章)系统调用的介绍:简而言之,就是用户写的程序进行调用内核中的方法。 用户程序没有权限直接进行访问多少系统资源的,因为由于系统的有限资源有可能被多个应用进程进行同时访问,所以如果不进行对系统资源的保护,那么各个应用程序难免会产生冲突。所以只能在内核的权限上才能访问系统资源,因为这时已

2017-10-22 16:48:45 303

原创 三、网络编程-NIO

一、NIO是什么1、概念NIO 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。NIO 翻译成 no-blocking io 或者 new io 都说得通。2、和BIO的区别2.1 面向流&面向缓冲BIO面向流Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节, 它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后 移动从流中读取的数据,需要先将它缓存到一个缓冲区

2021-03-01 23:00:54 204 1

原创 二、网络编程

一、linux网络I/O模型1、同步和异步、阻塞和非阻塞1.1、同步和异步关注的是消息的通知机制同步调用方主动等待结果的返回异步调用方不需要主动等待结果的返回,通过其他方式:回调函数、状态通知等通知1.2 阻塞和非阻塞关注的是等待结果返回调用方的状态阻塞结果返回之前,当前线程被挂起,不做任务事情非阻塞结果返回之前,当前线程不阻塞,可做其他事情1.3 组合含义同步阻塞主动等待调用返回,期间不做任何事情,调用方被挂起同步非阻塞主动等待调用方返回,期间可以做其他事情,

2021-02-22 19:28:24 154

原创 一、计算机网络体系结构

一、OSI/TCP模型Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。协议采用了4层的层级结构。然而在很多情况下,它是利用 IP 进行通信时所必须用到的协议群的统称。1、应用层1⃣️ 作用文件传输、电子邮件、文件服务。数据格式化,数据加密,建立和接触于别的接点的联系。定义数据格式,并按照对应的格式

2021-01-21 20:29:29 305

原创 六、缓存方案实战

一、缓存读取数据public Provinces detail(String provinceid) { Provinces provinces = null; //在redis查询 provinces = (Provinces)redisTemplate.opsForValue().get(provinceid); if (null != provinces){// redisTemplate.expire(pr

2020-11-08 13:23:27 337

原创 五、redis高可用模式解读

一、主从模式1、主从复制方式一、新增 redis6380.conf, 加入 slaveof 192.168.42.111 6379, 在 6379 启动完后再启 6380,完成配置;方式二、redis-server --slaveof 192.168.42.111 6379查看状态:info replication断开主从复制:在 slave 节点,执行 6380:>slaveof no one断开后再变成主从复制:6380:> slaveof 192.168.42.111 637

2020-11-04 14:09:26 285 2

原创 四、redi性能测试、协议、事务

一、redis慢查询慢查询的作用:通过慢查询分析,找到有问题的命令进行优化。Redis slowlog是Redis用来记录查询执行时间的日志系统。查询执行时间指的是不包括像客户端响应(talking)、发送回复等IO操作,而单单是执行一个查询命令所耗费的时间。1、慢查询配置动态设置: config set slowlog-log-slower-than 10000 //10 毫秒使用 config set 完后,若想将配置持久化保存到 redis.conf,要执行 config rewrite

2020-10-19 23:06:37 185

原创 三、redis实战

一、Redis高并发投票网站1、需求背景用户可以发表文章,发表时默认给自己的文章投了一票用户在查看网站时可以按评分进行排列查看用户也可以按照文章发布时间进行排序为节约内存,一篇文章发表后,7天内可以投票,7天过后就不能再投票了为防止同一用户多次投票,用户只能给一篇文章投一次票2、关系数据库设计文章基本信息表文章票数于分值表文章投票详情表3、redis数据结构设计使用hash存储文章的基本信息key: article:00xvalue:title “标题”li

2020-10-16 20:42:15 87

原创 一、redis简介和基础入门

一、基础入门1、简介redis 是一种基于键值对(key-value)数据库,其中 value 可以为 string、hash、list、 set、zset 等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务, 流水线,等附加功能。流水线: Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器, 并将 被执行的多个命令请求的结果在一个命令回复中全部返回给客户端,使用这个功能可以 有效地减少客户端在执行多个命令时需要与服务器进行通信的次数。2、特性速度快数据存储在内

2020-09-21 20:58:27 157

原创 五、duubo的服务订阅发布过程源码剖析

前言dubbo消费端是如何拿到服务端的url的呢,上节我们讲过服务暴露和消费过程是按照消费方直接拿到的服务端url,但是在实际的dubbo源码中是不会直接拿到服务端的url,我们本章节就主要剖析将duubo的服务订阅和发布嵌套到服务的暴露和消费中的.在上节的 dubbo 服务暴露和引入过程中,核心动作是两个,通过 protocol.export(serviceInvoker)将服务暴露出去,通过 protocol.refer(DemoService.class, registryUrl)将网络上的服务

2020-07-25 23:37:32 191

原创 四、dubbo的服务暴露与消费过程

一、通过dubbo协议来将服务暴露出去1、暴露过程接下来就到了服务暴露的这行代码里面了。protocol.export(invoker)反射逻辑最终调用的是我们自己实现的simpleInvoker的invoke方法思考:为什么要这样实现?可以结偶具体的网络服务和业务接口,如果没有invoken,不同的网络协议要针对不通的业务类来进行服务的暴露和消费,这很难做到,也很费事。2、消费端:...

2020-07-21 22:18:29 272

原创 三、dubbo的SPI机制原理

一、JAVA的SPI机制1、简介SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或 者扩展的 API,它可以用来启用框架扩展和替换组件可以看到,SPI 的本质,其实是帮助程序,为某个特定的接口寻找它的实 现类。而且哪些实现类的会加载,是个动态过程(不是提前预定好的)。有点类似 IOC 的思想,就是将装配的控制权移到程序之外,在模块化设 计中这个机制尤其重要。所以 SPI 的核心思想就是解耦。常见例子:数据库驱动加载接口实现类的加载,

2020-07-19 11:26:18 446

原创 二、dubbo高级特性使用

1、启动时检查check=true,检测到某接口没有提供者时,抛异常,阻止系统启动, reference对象置null,在系统测试阶段,开启可快速发现问题。reference对象为空,则即使后续补进了provider,也不能补救2、 check=false,不检测接口是否有提供者,直接为reference生成代理对象只要后续补入provider,程序会自动探测到,线上正式环境使用2、集群容错配置Failover :当出现失败,重试其它服务器。 retries=“2” 来设置重试次数(不含第一次

2020-07-18 14:45:37 273

原创 一、RPC场景和实现过程+dubbo的基础配置使用

一、RPC场景和过程+实现原理1、rpc场景在微服务环境下,存在大量的跨 JVM 进行方法调用的场景,如下图:具体到某一个调用来说,希望 A 机器能通过网络,调用 B 机器内的某个服 务方法,并得到返回值。2、rpc如何实现我们知道调用一个服务的方法最基本的是获取到jvm中的bean实例,jdk还提供了一种通过反射的方式来调用,只需要提供:反射需要的目标对象、方法名称、参数即可。传递这些信息的桥梁有很多,例如:webService、Http、Rmi等等。实现一个远程调用所需要的组件:反射所需要

2020-07-18 13:58:38 284

原创 五、ZK实战之高性能分布式锁

前言:数据库和redis也可实现分布式锁,本文只将三者做一个对比,不实现数据库和redis,将实现ZK的分布式锁1、数据库、redis、zk实现分布式锁的特点2、ZK实现高性能分布式锁2.1实现思路2.2 具体实现codelock接口package cn.enjoy.zk;/* * @author wangle25 * @description lock接口 * @date 20:38 2020-07-12 * @param * @return **/publi

2020-07-12 20:48:58 415

原创 四、Zookeeper集群一致性协议ZAB解析和领导选举算法实现

前言:之前第一部分讲解过CAP、BASE理论,基本上可以概述为:致力于打造一个,平时系统要求是基本可用,除开成功失败,运行有可容忍的延迟状 态,但是,无论如何经过一段时间的延迟后系统最终必须达成数据是一致的。一、2pc : 两阶段提交首先第一阶段叫准备阶段,事务的请求都发送给一个个的资源,这里的资源可以是数据库,也可以是其他支持事务 的框架,他们会分别执行自己的事务,写日志到 undo 与 redo,但是不提交事务。当事务管理器收到了所以资源的反馈,事务都执行没报错后,事务管理器再发送 comm

2020-07-12 19:58:53 301

原创 三、ZK客户端框架

一、Zookeeper原生客户端1、jdk包引入<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org

2020-07-12 11:16:26 128

原创 二、ZK命令行操作

一、服务端常用命令启动 ZK 服务: sh bin/zkServer.sh start查看 ZK 服务状态: sh bin/zkServer.sh status停止 ZK 服务: sh bin/zkServer.sh stop重启 ZK 服务: sh bin/zkServer.sh restart二、客户端常用命令使用 zkCli.sh -server ip:port 连接到 ZooKeeper 服务,连接成功后,系统会输 出 ZooKeeper 的相关环境以及配置信息。 命令行工具的一些简

2020-07-11 22:30:33 2677

原创 一、zk基础-分布式系统存在的问题以及解决方式+ZK是什么

1、单机的优缺点2、分布式优点、存在的问题3、解决分布式存在的问题的理论-cap、base4、zk在分布式起了哪些作用,怎么做到保证cap的,使用的什么算法(zab算法)5、zk各个客服端使用6、客户端源码阅读7、5、zk可以做那些事,怎么实现的...

2020-07-08 17:10:31 730

原创 六、mysql性能优化

一、慢查询1、慢查询日志是指 mysql 记录所有执行超过long_query_time参数设定的时间阈值的 SQL 语句的日志。2、慢查询配置# 默认 10 秒,这里为了演示方便设置为 0 set global long_query_time=0;#W开启慢查询日志set GLOBAL slow_query_log = 1; # 项目开发中日志只能记录在日志文件中,不能记表中set global log_output='FILE,TABLE' # 查看慢查询日志信息cat /usr/

2020-06-07 21:58:11 223

原创 五、mysql之业务设计

一、逻辑设计1、范式设计1.1第一范式数据库表中的所有字段都只具有单一属性,单一属性的列是由基本数据类型所构成的,设计出来的表都是简单的二维表1.2第二范式要求表中只具有一个业务主键,也就是说符合第二范式的表不能存在非主键列只对部分主键的依赖关系举例来说: 有两张表:订单表,产品表一个订单有多个产品,所以订单的主键为【订单 ID】和【产品 ID】组成的联合主键,这样 2 个组件不符合第二范式,而且产品 ID 和订单 ID 没有强关联,故把订单表进行拆分为订单 表与订单与商品的中间表。1

2020-06-06 22:43:40 300

原创 四、mysql核心-锁与事务

前言:关于什么是锁,为什么需要锁等概念这里不做解释了,可以看下我的另一谝关于jdk中并发的栏目,其中介绍了并发的各种只是框架,包括锁以及jdk的锁实现等等。并发编程、锁等知识框架一、mysql中的锁本章节讲述表锁和行锁,gap锁在本文后边事务中会讲到因为MyISAM支持表锁,InnoDb支持表、行锁。所以按照引擎来讲述下这两个锁1、表锁特性开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发 度最低。适用场景表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如

2020-06-04 16:30:23 211

原创 一、Mysql 架构体系

前言了解Mysql的架构体系,对mysql的学习以及性能优化有很大的帮助。比如很多查询优化工作实际上就是遵循服务层的一些原则让mysql优化器能够按照预想的合理方式运行。mysql整体架构分为4层,如下图。自顶向下分别为:网络连接层、服务层、存储引擎层、系统文件层一、网络连接层1、功能主要负责连接管理、授权认证、安全等。当 MySQL 启动(MySQL 服务器就是一个进程),等待客户端连接,每一个客户端连接请求, 服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独

2020-06-02 22:44:55 223

原创 三、Mysql数据类型

一、Int类型/前后分别为有符号和无符号大小类型字节最小值最大值TINYINT1-128/0127/255SMALLINT2-32768/032767/65535MEDIUMINT3-8388608/08388607/16777215INT4-2147483648/02147483647/4294967295BIGINT8-9223372036854775808/09223372036854775807/18446744073

2020-06-01 22:10:22 190

原创 二、mysql权限系统

前言:Mysql重要性、安装等本大章节不做阐述。主要讲述mysql使用mysql权限、架构与存储引擎、业务设计、mysql优化一、简单的权限使用grant SELECT on mall.* TO 'dev'@'192.168.244.%' IDENTIFIED BY '123' WITH GRANT OPTION;对dev用户加上mall库中所有表的查询权限,只能在192.168.0.*的 网段进行查询操作。二、深入理解mysql权限1、用户标识是什么在 mysql 中的权限不是单纯的赋予给用

2020-06-01 13:51:27 277

原创 七、编写高效优雅的java程序

一、面向对象1、构造器参数太多如果参数很多,会导致构造方法非常多,拓展性差,代码难编写,且难以看懂。 用 JavaBeans 模式,get 和 set 一行构造编程多行代码实现,需要使用额外机制确保一致性和线程安全。用 builder 模式:1、5 个或者 5 个以上的成员变量 2、参数不多,但是在未来,参数会增加。2、不需要实例化的类应该构造器私有如,一些工具类提供的都是静态方法,这些类是不应该提供具体的实例的。可以参考 JDK 中的 Arrays。好处:防止使用者 new 出多个实例。3、

2020-05-26 09:56:21 232

原创 六、JVM调优(GC调优)

前言JVM调优的本质:并不是为了显著的提升系统的性能,不是说调优过后,性能就能提升几倍或者十几倍,主要调的是稳定性。如果系统出现了频繁的垃圾回收,这个系统是不稳定的,所以就需要我们来进行jvm调优,调整垃圾回收的频次一、GC调优原则1、调优的原则大多数的 java 应用不需要 GC 调优大部分需要 GC 调优的的,不是参数问题,是代码问题在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多;GC 调优是最后的手段2、调优的目的GC 的时间够小GC 的次数够少发生 Ful

2020-05-11 16:20:17 1246

原创 5、JVM性能优化(内存泄漏、内存溢出、各种JVM命令、定位内存问题)

一、内存溢出、内存泄露1、内存溢出程序在申请内存时,没有足够的内存空间栈溢出虚拟机栈(线程独享的栈空间)StackOverflowError栈溢出:不断创建线程,使得栈空间被打满,OutOfMemoryError堆溢出不断的创建对象使得堆大小小于要创建的对象大小OutOfMemoryError直接内存溢出分配的本地内存大小大于 JVM 的限制方法区溢出在经常动态生产大量 Class 的应用中2、内存泄漏程序在申请内存后,无法释放已申请的内存,导致可用内存变少长生命周期对象

2020-05-11 14:52:44 640

原创 4、JVM执行子程序

一、class文件结构1、魔数与 Class 文件的版本每个 Class 文件的头 4 个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接受的 Class 文件。使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑,因为文件扩展名可以随意地改动。文件格式的制定者可以自由地选择魔数值,只要这个魔数值还没有被广泛采用过同时又不会引起混淆即可紧接着魔数...

2020-05-06 16:02:48 231

原创 3、垃圾回收算法与垃圾回收器

一、GC回收对象时,怎么判断对象的存活1、引用计数法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。c++中的智能指针就是利用引用计数来实现的。优点是快,方便,实现简单,但是存在一个循环引用的问题。缺陷:对象相互引用时(A.instance=B 同时 B.instance=A),很难判断对象是否该回收。2、可达性分析(JDK...

2020-05-04 19:57:16 245

原创 2、jvm中的对象

一、对象的分配虚拟机遇到一条new指令时:在常量池中定位到需要new的对象的符号引用,如果未找到,则抛出异常:classNotFoundException检查还在先执行相应的类加载过程,如果没有就进行加载内存分配根据方法区的信息确定为该类分配的内存空间大小指针碰撞 (java 堆内存空间规整的情况下使用)如果 Java 堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的...

2020-04-29 22:31:15 188

原创 1、深入理解JVM内存区域

一、为什么要了解虚拟机JVM 不单单只支持 Java 语言,也支持其他语言(Scala、Kotlin、Groovy 等等)区块链 2.0–以太坊(比特币是区块链 1.0) 中提供了 EVM 的虚拟机,它的实现和 JVM 类似,基于栈、生成脚本编译成字节码来执行。知 识通用。(理论大于实际)二、虚拟机的内存区域运行时数据区这个是抽象概念,内部实现依赖寄存器、高速缓存、主内存(具体要分析 J...

2020-04-27 22:23:56 181

原创 JMM和底层实现原理

一、JMM 基础-计算机原理1、概念Java 内存模型即 Java Memory Model,简称 JMM。JMM 定义了 Java 虚拟机 (JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM 是隶属于 JVM 的。Java1.5 版本对其进行了重构,现在的 Java 仍沿用了 Java1.5 的版本。Jmm 遇到的问题与现代计算机中遇到的问题是差不多的。2...

2020-04-22 16:01:50 323

原创 java.util.concurrent并发学习总结(本章节目录)

为了加深学习能力和后来复习,总结了自己学习java.util.concurrent包的一些笔记,欢迎同学们进行阅读和给出批评建议。一、线程基础1、操作系统进程与线程之定义及区别2、java线程的共享与协作、synchronized使用3、线程间共享于协作-等待通知机制、等待超时机制二、线程并发工具类1、fork/join2、countdownlatch、cyclebarrier3、...

2020-04-16 16:05:43 208

原创 8、实战项目-性能优化实战

一、需求解析为学生考试后从题库中抽取题目生成大量的离线练习册文档并打印。题目在数据库中存储形式,平均长度800字节:“下图是Diameter协议中的那部分?</p><img src=“http://......./......./...../01.jpg”></img>存在的问题一份PDF文档的生成平均时长在50~55秒左右,耗时太久,一个年级有20...

2020-04-15 22:24:46 247

原创 7、并发任务执行框架

一、需求分析举例互联网教育中,会定期为每个班级或者年级的学生生成近期成绩考核的execl表单用来分析教育的质量,为每个学生生成表单是一个比较费时间的操作,假如一个任务需要3s,如果需要给一个年级1000名学生批量生成,单线程耗时可能会超过1小时,响应已经非常慢了。对于不熟悉java并发编程的开发人员或者刚开始接触java的小伙伴可能不会使用并发来解决类似的问题,这时候就需要提供一种并发框架来...

2020-04-12 23:08:31 523

原创 6.2 并发安全-性能和思考、线程安全的单例模式

一、性能和思考前言:使用并发的目的是要提高性能,引入多线程之后,其实会带来其他额外开销,如线程间的协作、增加的上下文的切换、线程的创建和销毁、线程的调度等等。过度的或对多线程的使用不当会导致多线程甚至没有多线程的效率高。衡量应用程序性能的标准:服务时间、延迟时间(多块)、吞吐量(处理能力的指标、完成工作的多少)、可伸缩性等。对于服务器应用程序:可伸缩性、吞吐量这个方面往往是比较看重的。开发...

2020-04-11 16:03:02 133

空空如也

空空如也

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

TA关注的人

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