自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 断点续传服务端处理(http206)

断点续传1.思路:分客户端和服务端,客户端发给服务端时的Get请求,带Range:bytes=0-500 字段服务端判断Get请求中带Range字段就为断点续传。服务端处理:获取到Get请求的Range字段后进行解析:对Range字段进行分段(客户端带来的字段多种多样)。然后添加响应206消息的头域等所需要的头域字段,进行续传。//判断是否为断点续传,分析Range字段,并进行头域拼装。 var range_ext = r.Header.Get("Range") //断点续传标志

2021-04-01 16:19:12 1070

原创 工作中常用的命令(Linux、Docker、K8S、Wireshark)

linuxssh 用户名@ip通过一台服务器连接另一台服务器cat打印某一文件tail -f持续打印某一文件scp -r需要发送的文件目录 root@ip:/目标文件目录ssh 用户名@ip通过一台服务器连接另一台服务器route -n查看网络路由配置scp -r需要发送的文件目录 root@ip:/目标文件目录netstat -anp |grep 8071查看端口端口uname --all显示设备配置mkdir -p创

2021-04-01 15:45:31 238

原创 go语言实现日志统计工具(分类、计算)

1.将各服务的日志分类,并计算各服务的日志大小。2.只分类出自己所需的服务日志。3.只统计各服务的日志大小。package mainimport ( "bufio" "fmt" "io" "io/ioutil" "log" "os" "sort" "strconv" "strings" "time")var strArr []stringvar path1 = "./logclass"var path2 = "./logsize"var path3 = "./l.

2021-04-01 15:00:57 755

原创 go语言TCP学习

TCP Server端流程:1.监听端口2.接收客户端请求建立连接3.创建goroutine处理连接func process(conn net.Conn) { //net.conn可以在多个线程中同时安全读写 defer conn.Close() //关闭连接 for ; ; { reader := bufio.NewReader(conn) var buf [128]byt...

2020-02-27 17:55:26 200

原创 go语言文件基本操作

文件打开操作const ( O_RDONLY int = syscall.O_RDONLY //只读模式打开文件 O_WRONLY int = syscall.O_WRONLY //只写模式打开文件 O_RDWR int = syscall.O_RDWR //读写模式打开文件 O_APPEND int = syscall.O_APPEND //写操作时将数据附加到文件尾部 O_...

2020-02-27 11:03:36 222

原创 goroutine泄漏发生的情况

发生情况:发送到一个没有接受者的channel。从没有发送者的channel中接收数据向已满的 buffered channel 写,但是没有读select操作在所有case上阻塞.死循环。...

2020-02-26 13:33:18 376

原创 .go语言是否存在内存泄露问题?发现go语言内存泄漏的2种方法

为什么会发生?1、给系统压力,内存占用增大,但停止打压后,内存不能降低,则可能有内存泄漏。2、top不能实时反映程序占用内存,因Go向系统申请内存不使用后,并不立即归还系统。3、程序占用系统内存、Go的堆内存、实际使用内存:从系统申请的内存会在Go的内存池管理,整块的内存页,长时间不被访问并满足一定条件后,才归还给操作系统。又因为有GC,堆内存也不能代表内存占用,清理过之后剩下的,才是实际...

2020-02-26 13:31:18 895

原创 go语言panic。go语言的panic后,是否可以让其恢复?

Panic:宕机,程序终止运行。代码运行错误或Runtime层手动触发宕机:在go中可以在程序中手动触发宕机,让程序崩溃,可以及时发现错误,同时减少可能的损失。Defer:defer语句会在宕机前被处理。可以用来在宕机发生前进行宕机信息处理。可以让宕机恢复,使用recover:有panic的情况下会捕获,程序不会宕机。...

2020-02-26 13:29:01 625

原创 go语言多线程并发的问题?

竞态问题:当多线程并发运行的程序竞争访问和修改同一块资源时。(解决:互斥锁sync.Mutex,读写互斥锁sync.RWMutex,等待组sync.WaitGroup,原子操作atomic)...

2020-02-26 13:24:26 595

原创 go语言的协程与我们传统的线程的区别?

协程属于线程,即一个线程下面可以开辟多个协程。协程是用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。当多个协程切换时,由于其同属于一个线程,所以可以看作是同步执行的,不存在同时共享资源的情况,可以不加锁的访问全局变量,切换上下文非常快。对于不需要cpu大量参与的业务场景...

2020-02-26 13:23:22 407

原创 RPC远程调用,go语言实现RPC小Demo

RPC(远程过程调用):它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。采用客户机/服务器模式。请求程序是一个客户机、而服务服务提供程序就是一个服务器。**过程:**1.调用客户端句柄;执行传送参数。2.调用本地系统内核发送网络消息。3.消息传送到远程主机。4.服务器句柄得到消息并取得参数。5.执行远程过程。6.执行的过程将结果返回服务器句柄。7.服务...

2020-02-26 13:21:02 361

原创 RPC和MQ

RPC与MQ相同:1、都利于大型系统的解耦;2、都提供子系统之间的交互,特别是异构子系统(如java\node等不同开发语言);不同:1、RPC侧重功能调用,因此多半是同步的;备注:也有基于MQ上实现RPC的,这样的话就是异步的,MQ本身,如rabbitMQ也有提供实现RPC的能力;2、MQ 的使用,一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时...

2020-02-25 16:29:52 441

原创 美团点评、小米、菜鸟等等目前遇到的面试题(更新中)

美团面试题:1.为什么要用SOA?有什么好处?面向服务编程,是一种思想,一种方法论,一种分布式的服务架构,SOA是⼀种软件架构,它⽤于构建由⼀组松耦合,⿊盒组件组成的商业应⽤。每个组件代表 一个独立服务。优点:服务之间松耦合、组织和使用来自不同拥有者的服务能力。统一的方式去发布、发现、交互和调用服务、而不需要知道底层技术细节。、可组合的、可全局访问的功能。用途:SOA解决多服务凌乱问题,...

2019-09-14 20:39:29 973

原创 二叉树前,中,后序遍历的实现

思路分析:前序遍历:先输出父节点,再遍历左子树和右子树。中序遍历:先遍历左子树,再输出父节点,再遍历右子树。后序遍历:先遍历左子树,再遍历右子树,最后输出父节点。小结:看输出父节点的顺序,就确定是前序,中序还是后序。//先创建HeroNode节点class HeroNode { private int no; private String name; pri...

2019-08-22 09:43:08 707

原创 前缀、中缀、后缀表达式(逆波兰表达式)、逆波兰计算的实现。

前缀表达式的计算机求值:eg:- × + 3 4 5 6从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。中缀表达式:就是我们最常见的表达式:(3+4)×5-6后缀表达式:又称逆波兰表达式与前缀表达式相似,只是运算符位于操作符之后。3...

2019-08-16 17:35:23 183

原创 栈实现综合计算器

思路通过一个index值(索引),来遍历我们的表达式。如果我们发现是一个数字,就直接入数栈。如果发现扫描到的是一个符号,就分如下几种情况:(1).如果我们发现当前符号栈为空,就直接入符号栈。(2).如果符号栈有操作符,就进行比较**,如果当前的操作符的优先级小于或等于栈中的操作符,就需要从数栈中pop出两个数**,再从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,...

2019-08-16 15:42:22 171

原创 垃圾回收算法(4种)垃圾回收的方式有哪些

垃圾回收算法(4种)GC算法是内存回收的方法论,垃圾收集器就是算法落地实现。引用计数复制算法标记-清除标记-整理对垃圾回收期的理解:目前为止没有完美的收集器出现,更没有万能的收集器,只有针对具体应用最合适的收集器,进行分代收集。垃圾回收的方式有哪些?黄色的线表示GC线程。1.Serial(串行垃圾回收器)它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线...

2019-08-16 10:57:31 4343

原创 OOM

Java中OOM:- java.lang.StackOverflowError:直接上代码说明public class test { public static void main(String[] args) { stackOverflow(); } private static void stackOverflow() { stac...

2019-08-15 00:45:19 149

原创 栈的介绍和应用场景、用数组实现一个栈

介绍栈(stack):是一个** 先入后出**(FlLO-First ln Last Out)的有序列表。栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。...

2019-08-14 14:46:39 235

原创 约瑟夫(环形链表)问题实现、小孩出圈问题

构建一个单向的环形链表思路操作环形链表思路:构建环形链表(1).先创建第一个节点。让first指向该节点,并形成环形**(first.next=first)。**(2).后面当我们每创建一个新节点,就把该节点,加入到已有的环形链表中即可。遍历环形链表(1).先让一个辅助指针(变量)curBoy,指向first节点(2).然后通过一个while循环遍历该环形链表即可curBoy...

2019-08-14 11:30:39 257

原创 数组实现双向链表、双向链表的操作

分析:思路:遍历:和单链表一样,只是可以向前,也可以向后查找。添加(默认添加到双向链表的最后)(1).先找到双向链表的最后这个节点(temp)(2).temp.next = newHeroNode(3).newHeroNode.pre = temp;修改思路和单链表一样删除(1).以为是双向链表,因此,我们可以实现自我删除某个节点(2).直接找到要删除的这个节点,比...

2019-08-13 23:23:59 1809

原创 强引用、软引用、弱引用、虚引用分别是什么?

整体架构如图:强引用(默认支持模式):当内存不足时,JVM开始垃圾回收,**对于强引用的对象,就算是出现了OOM(out of memory(就是内存用完了))也不会对该对象进行回收,**死都不收。强引用就是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾回收器不会碰这种对象。例如:public class StrongRefDemo { publ...

2019-08-13 19:21:01 695

原创 JVM系统默认值和调优

JVM的参数类型:** 1. 标配参数:**java -version、java -help、java -showversion.** 2.X参数(了解):**-Xint、解释执行。-Xcomp、第一次使用就编译成本地代码。-Xmixed。混合模式。** 3.XX参数:jps -l(查进程号)。jinfo -flag 具体参数 java进程编号(查看配置)**- Bool...

2019-08-13 13:21:25 199

原创 JVM垃圾回收的时候如何确定垃圾?什么是GC Roots?Java中可以作为GC Roots的对象?

1.什么是垃圾?简单的说就是内存中已经不再被使用到的空间就是垃圾。2.要进行垃圾回收,如何判断一个对象是否可以被回收?1.引用计数法判断(已经被淘汰):简单地说,就是给对象添加一个引用计数器,**每当有一个地方引用它,计数器值加1,每当有一个引用失效时,计数器减1。**任何时刻,计数器值为0时,这个对象就是不可能在被使用的,那么这个对象就是可回收对象。2.枚举根节点做可达性分析(根搜索路...

2019-08-12 10:13:33 529

原创 Java类加载全过程

类加载机制-JVM把class文件加载到内存,并对数据进行校验、解析、和初始化,最终形成JVM可以直接使用的Java类型的过程。详细过程:加载------》验证------》准备------》解析------》初始化------》使用------》卸载1.加载将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lan...

2019-08-11 23:39:43 185

原创 JMM内存模型

JMM是Java内存模型,主要目标是定义程序中变量的访问规则,如图所示。所有的共享变量都存储在主内存中。每个线程有自己的工作内存,工作内存中保存的是主内存中变量的副本,线程对变量的读、写等操作必须在自己的工作内存中进行。而不能直接操作主内存的变量。在多线程进行数据交互时,例如线程A给一个共享变量赋值,由线程B来读取这个值,线程A必须在自己的工作内存中修改完后,将这个值写会到主...

2019-08-11 23:24:09 136

原创 JVM内存模型五个部分介绍

JVM内存模型:主要指运行时的数据区,包括五个部分。栈(Stack):也叫方法栈,是线程私有的,线程在执行每个方法时,都会创建一个栈阵,用来存储局部变量表,操作栈、动态链接,方法出口等信息,调用方法时执行入栈,方法返回时执行出栈。本地方法栈:与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行JAVA方法时,使用栈,执行native方法时,使用本地方法栈。程序计数栈:保存当前线...

2019-08-11 19:53:16 1318

原创 三次握手,四次挥手!!!

三次握手:是为了建立双向的连接。将主动发起请求的称为Client端,把被动连接的一端称为Server端。(绿色的字代表建立连接前的状态).首先,建立连接前需要Server端先监听端口,因此初始状态为Listen。这时,Client准备建立连接,发送一个SYN同步包,发送完后Client端的状态变为SYN_SENT。Server端收到SYN后同意建立连接。.Server端同意连接后,向C...

2019-08-11 08:26:36 88

原创 链表,单向链表的创建,插入,更新,删除操作

总结:链表是以节点的方式来存储,是链式存储。每个节点包含data域,next域:指向下一个节点链表的各个节点不一定是连续存储。链表分类:带头节点的链表和没有头结点的。根据实际的需求来确定。单链表(带头结点)逻辑结构示意图:添加(创建)1.先创建一个head头结点,作用就是表示单链表的头。2.后面我们每添加一个节点,就直接加入到链表的最后public class Singl...

2019-08-09 15:26:59 433

原创 数组模拟环形队列案例和思路

思路如下:**1. front:**front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素。front的初始值为0.**2.rear:**rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间作为约定。rear的初始值为03.当队列满时,条件是**(rear+1)%maxSize=front【满】。**4.当队列为空的条件时,rear==front【空...

2019-08-09 11:47:56 583 1

原创 消息队列,消息队列在项目中的使用,消息队列的弊端

背景:在分布式系统中是如何处理高并发的。由于在高并发的环境下,来不及同步处理用户发送的请求,则会导致请求发生阻塞。比如说,大量的insert,update之类的请求同时到达数据库MYSQL,直接导致无数的行锁、表锁,甚至会导致请求堆积很多。从而出发too many connections 错误。使用消息队列中【异步通信】可以解决 。消息队列的同步和异步:并行:排队:在高并发的情况下,很...

2019-08-09 09:13:36 442

原创 JVM垃圾回收机制,GC发生在JVM哪部分,有几种GC,它们的算法是什么?

GC发生在JVM的哪部分:发生在堆(heap)中.GC是什么?分代收集算法。次数上频繁收集-------》在Young区。Minor GC次数上较少收集-------》在Old区。Full GC基本不动Perm区GC4大算法:1.引用计数法 (已经被淘汰):2.复制算法(Copying):**发生在年轻代中:**年轻代中使用的是Minor GC,这种GC算法采用的是复制算法(...

2019-08-08 11:54:40 2436

原创 MySQL什么时候适合建索引,什么时候不适合建索引

索引是什么?MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。你可以理解为“排好序的快速查找的数据结构”。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。优势类似大学图书馆建数目索引,提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本...

2019-08-08 11:33:57 1956

原创 Redis持久化的类型?他们有什么区别?

Redis提供了2个不同形式的持久化方式:RDB(Redis DataBase):在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot块照,它恢复时是将快照文件直接读到内存里。(备份是如何执行的?:Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是...

2019-08-08 11:03:13 233

原创 Git相关命令:

分支:创建分支:git branch <分支名> //这两个很少用,基本都是用下面的一步完成的命令。git branch -v 查看分支切换分支:git checkout <分支名>- 一步完成:git checkout -b <分支名>合并分支:先切换到主干 git checkout maste...

2019-08-08 10:38:15 140

原创 MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办?

解决方案:1.写SQL语句时起别名。2.在MyBatis的全局配置文件中开启驼峰命名规则。例如:last_name可以映射为lastName。<settings> <setting name="mapUnderscoreToCamelCase" value="true"/></settings>3.在Mapper映射文件中使用resultMap来自...

2019-08-08 09:37:52 366

原创 数组模拟队列的实现

队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。因为队列的输出、输入是分别从前后段来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变,如图所示:...

2019-08-07 14:27:19 208

原创 稀疏数组的简介,数组和稀疏数组的装换的实现代码

基本介绍:当一个数组中大部分元素为0,或者为同一个值的数组是,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:1. 记录数组一共有几行几列,有多少个不同的值。2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。如图所示:将一个数组转换为习稀疏数组。数组和稀疏数组的互相转换二维数组转稀疏数组的思路:1.遍历原始的二维数组,得到有效数据的个数sum。...

2019-08-07 11:27:11 143

原创 什么是死锁?产生死锁的主要原因?死锁的编码及定位分析。死锁的小Demo。

1.什么是死锁:死锁是指两个或两个以上的进程在执行进程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。2.产生死锁的主要原因:2.1 系统资源不足2.2 进程运行推进的顺序不合适2.3 资源分配不当死锁demo演示,以及死锁分析排查!!...

2019-08-06 17:51:24 900

原创 合理配置线程池,corePoolSize的合理设置

如何配置线程池中的线程数(corePoolSize):分为两种:依据:根据机器的硬件:**System.out.println(Runtime.getRuntime().availableProcessors());**查看自己机器的CPU核心数。1.cpu密集型:CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。CPU密集任务只有在真正的多核CPU才可能得到加速(通...

2019-08-06 17:00:06 17028 4

空空如也

空空如也

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

TA关注的人

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