自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第三方接口的技术难题

涉及到很多第三方接口,那必然会出现一些技术难题。1.耦合性:(1)如果第三方接口如果性能出现抖动,那必然会导致我们核心流程的性能变差。(异步解耦)(2)如果第三方接口突然升级了,比如说原来只需要5个入参,现在需要6个入参了,那我们本地系统的多个接口也需要跟着第三方接口的升级而升级,必须配合他的新接口进行测试和部署上线,围着它转。(在接口文档中可以看到有很多新老版接口的说明,第三方接口升...

2019-11-29 11:23:09 956

原创 为什么垃圾收集器需要两个S区呢?

如果只有一个S区的话,假设Eden和S现在对象都放满了,需要垃圾回收,此时复制算法需要先把存活对象标记出来,放入一个地方,那此时没有一个空白区域给他放,怎么办呢?所以必须要两个S区来使用...

2019-11-05 15:53:08 358

原创 多态以及原理

1.Java多态概述Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但可具有不同的参数列表、返回值类型。调用方法时通过传递的参数类型来决定具体使用哪个方法,这就是多态性。Java的方法重写,是父类与子类之间的多态性,子类可继承父类中的方法,但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。重写的参数列表和返回类型均不可修改。2...

2019-10-08 16:41:03 159

原创 linux一切都是文件???

对所有文件(目录、字符设备、块设备、 套接字、打印机等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理。屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。这就是“一切皆是文件”的思想。...

2019-10-08 13:58:27 291

原创 HashMap、ConcurrentHashMap1.7和1.8的区别

1.数据结构上:在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成 ;JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作,整个看起来就像是优化过且线程安全的HashMap.2.JDK1.7用的是头插法,而JDK1.8是尾插...

2019-10-08 13:52:01 286

原创 字符串常量池

Java中的字符串常量池Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建...

2019-10-08 10:51:10 104

原创 异常体系

RuntimeException(运行时异常):不需要try...catch...或throws 机制去处理的异常。非RuntimeException:需要try...catch...或throws 机制去处理的异常。常见的RuntimeException:ClassCastExceptionNullPointerExceptionArrayIndexOutOfBound...

2019-09-23 21:42:24 170 1

原创 MySQL索引有哪些,基于数据结构的分类一下?基于hash和B+树的有什么区别、复杂度?

1.全文索引,hash索引,BTree索引。2.(1)HASHHASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及效率不高。Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高哈希索引不支持多列联合索引的最左匹配规则(2)BTREE(平衡多叉树)...

2019-09-20 11:16:48 329 3

原创 进程和线程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度的基本单位在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一进程中的线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。所处环境:在操作系统中能同时运行多个进程;而在同一个进程中有多个线程同时执行...

2019-09-20 09:05:24 113

原创 TCP之四次挥手和timewait状态

为什么是四次挥手?因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。client先发送FIN告知对方我已经完成数据发送了,server回复ack来确定我知道了。这样一个流程,就关闭了client到server的发送信息通道。server此时已经知道接收不到client的数据了,但是还可以给它发送数据。如果server也没有啥数据要发送给对方了,server也会以FIN标...

2019-09-20 08:55:11 341

原创 (七)永久代(方法区)的垃圾回收

方法区里的类会被回收的,但是需要满足一定的条件1.首先该类的所有对象已经从堆内存中回收了2.加载该类的ClassLoader已经被回收了3.对该类的Class对象没有任何引用...

2019-09-15 16:06:32 700

原创 (五)年轻代以及他的垃圾回收算法

为什么要区分年轻代和老年代呢?年轻代里存放的大多数对象是短期存活的对象,需要用复制回收算法。老年代里存放的对象是长期存活的对象,用的是标记-整理算法。所以才需要区分年轻代和老年代。一种不太好的回收思路思路:标记出哪些对象是可以被GC的,然后直接将那块内存区域的对象进行GC。这样的话,对象会在内存中东一个西一个,造成大量的内存碎片。虽然所有的内存碎片加起来是很大的一块内存,但是它们都...

2019-09-15 16:04:21 1318

原创 既然反射可以拿到private里的值,那private的意义在哪里?

1、Java的private修饰符不是为了绝对安全设计的,而是对用户常规使用Java的一种约束。就好比饭店厨房门口挂着“闲人免进”的牌子,但是你还是能够通过其他方法进去。2.private的意义是OOP(面向对象编程)的封装概念。3.setAccessible(true),这行代码取消了java的权限控制检查,会产生安全隐患...

2019-09-05 17:31:58 933

原创 线程的interrupt

interrupt打断一个线程,其实是在修改那个线程里的一个interrupt的标志位,打断他以后,interrupt标志位就会变成true,所以在线程内部,可以根据这个标志位,isInterrupted这个标志位来判断,是否要继续运行。并不是说,直接interrupt一下某个线程,直接就不让他运行了interrupt打断各个工作线程的休眠,让他们判断是否运行的标志位为false,是则就立刻退...

2019-08-08 19:58:36 248

原创 通俗易懂讲解JVM之各个GC名词的含义

MinorGC和YoungGC一般指新生代GC或者年轻代GCOldGC一般指老年代GCFullGCFull即整体的意思,指针对新生代、老年代、永久代的整体内存区域的GCMajorGC有人把它和OldGC或FullGC等价起来,非常容易混淆概念,因此建议不要用这个名词MixedGC是G1垃圾回收器中特有的GC概念,指一旦老年代占据堆内存的45%,就要触发Mixed...

2019-08-08 10:06:30 983

原创 限流算法

1.Hystrix中的Semaphore相同CommandGroupKey会使用同一个信号量。其实它内部有一个AtomicInteger的原子类,用它来进行计数。每次一个请求过来的时候,首先会通过Semaphore执行tryAcquire(),我们对这个方法里面的逻辑解释一下:a.首先它对信号量+1并返回总数b.对比一下当前信号量的总数和配置的最大限额比较一下,如果比他大,那么代表获取...

2019-08-06 16:08:11 159

原创 关于数据库反范式设计的一些要点

前言在实际的开发应用中,我们常用的数据库设计是反范式的。原因是遵循三大范式的数据库设计常常带来一定的弊端,例如,加大开发的复杂度、带来一定的性能损耗。数据的三大范式·第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。·第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。·第三范式:任何非主属性不依赖于其它非主属性。也就...

2019-08-05 16:32:52 247

原创 (四)JVM的解释执行和即时编译

解释器(Interpreter),边翻译为机器码边执行。这样的结果显易见,效率低下,同样的代码每次都需要重新翻译。JIT编译器:JIT编译器在程序启动后运行,并将代码(通常是字节码)动态编译,形成通常更快的形式,通常是主机CPU的本机指令。在HotSpot采用的混合模式,它先解释执行字节码,然后将其中的热点代码(多次执行,循环等)直接编译成机器码,下次就不用再编译了,让其快速运行。...

2019-08-05 10:30:19 330

原创 (三)JVM的内存模型

内存区域JVM运行过程中,会划分为不同的内存区域来存放不同的数据。1.方法区。类加载进来后,必须有一块内存区域来存放这类数据,就是”方法区“。JDK1.8后,这块区域改成了”Metaspace“,是分配在堆外内存的。2.程序计数器。我们写好的代码会被编译成字节码,对应着各种字节码指令,这些指令由字节码执行引擎来执行。用”程序计数器“来记录当前执行到了哪一条字节码指令。JVM支持多线...

2019-08-04 11:48:49 115

原创 (一)JVM基础入门和介绍

当我们采用“java”命令,实际上就会启动一个JVM进程,JVM负责加载字节码文件,并通过字节码执行引擎在执行我们加载到内存中的字节码文件。既然.class文件可以反编译为.java文件,那就意味着如果我们不对.class文件做任何处理,有此.class文件的人就有机会通过反编译而获得我们的“商业机密”源代码了。如何对“.class“文件处理,保证不被人拿到以后反编译获取公司源代码?...

2019-08-04 11:08:30 114

原创 一张图告诉你变量的初始化顺序

2019-07-30 17:29:56 235

原创 (二)JVM的类加载机制

前言我们都知道Java是跨平台的,是因为不同平台下的JVM能将字节码文件解释为本地机器指令,JVM是怎么加载字节码文件的?答案就是ClassLoader。今天我们仔细的来看看"类加载"这个过程,看看JVM的类加载机制到底是怎么样的?什么情况下会加载类什么情况下会加载类?这个是我们首先要了解的问题,才能更清楚的了解类加载机制。1.运行一个主类的”main“方法时,会开启一个J...

2019-07-30 17:18:08 153

原创 aop的实现原理,cglib和jdk动态代理的区别

aop的实现原理Spring AOP有两种方式实现动态代理,如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。如果目标对象没有实现了接口,必须用cglib实现aopcglib和jdk动态代理的区别jdk动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。cglib的原理是对指定的目标类生成一个子类,并覆盖其中...

2019-07-30 14:23:38 608

原创 线程池的好处以及注意事项

好处·1.复用线程, 减少在创建和销毁线程上所花的时间以及系统资源的开销。·2.提高响应速度。 当任务到达时, 任务可以不需要等到线程创建就可以立即行。·3.提高线程的可管理性。 使用线程池可以对线程进行统一管理。·4.如果不使用线程池, 有可能造成系统创建大量线程而导致OOM。注意事项1.至于用有界队列还是无界队列,根据业务场景来选怎。如果内存溢出概率大于...

2019-07-30 14:06:09 634

原创 (一)通俗易懂讲解G1垃圾回收器之整体设计思想

前言网上很多资料讲解的很不清不楚,让人不知所以然。更过分的是,完全不负责任地告诉读者这是正确的,其实他自己都不知道他自己的理解是错误的,真是颠倒黑白,误人子弟。本人想通过用通俗易懂的语言告诉大家G1垃圾回收器的原理,把本人所知道的100%分享出来,并尽可能保证内容的严谨,避免误人子弟。Stop The World(STW)默认情况下,用ParNew+CMS组合垃圾回收期,不论是进行...

2019-07-29 15:39:56 1038

原创 HashSet、LinkedHashSet、TreeSet的源码剖析

前言Set底层的Map,只有key是有值的,value都是null值,都是空的。Set可以用Map来实现的,其实就是在map的key里放置,value都是一个空的对象HashSetHashSet,他是一个集合,里面的元素是无序的,他里面的元素是没有重复的HashMap是不允许key重复的,他底层是一个数组,如果你的key重复了,你会hash寻址到数组的同一个位置去,然后覆盖原来...

2019-07-29 14:39:15 121

原创 Iterator的fail fast机制的源码剖析

modCount就是用来实现fail fast机制的,各个集合里面其实都有这个modCount的概念,只要这个集合被修改了(包括add、remove、set),那么就会对modCount++(modificationCount)比如说在迭代一个ArrayList之前,已经插入了4个元素,此时modCount = 4,在你获取和初始化一个迭代器的时候,里面的expectedModCount...

2019-07-29 14:28:47 135

原创 LinkedHashMap源码剖析

前言HashMap,比如你放了一堆key-value对进去,后面的话呢如果你要遍历这个HashMap的话,遍历的顺序,并不是按照你插入的key-value的顺序来的LinkedHashMap,他会记录你插入key-value的顺序, 如果你在遍历的时候,他是按照插入key-value对的顺序给你遍历出来的LinkedHashMap是HashMap的一个子类。LinkedHashMap和...

2019-07-29 14:13:41 83

原创 hashmap源码剖析

JDK1.7和JDK1.8中hashmap的对比JDK1.7中如果出现大量的key冲突之后,对长链表遍历找一个key-value对,性能是O(n),如果是直接根据array[index]获取到某个元素,性能是O(1)JDK 1.8以后,优化了一下,如果一个链表的长度超过了8,就会自动将链表转换为红黑树,查找的性能,是O(logn),这个性能是比O(n)要高的链表的遍历性能,时间复杂度是...

2019-07-29 13:58:21 109

原创 ConcurrentHashMap源码剖析

前言锁优化有一个很重要的思路,就是拆分锁的粒度,类似于分布式锁优化的实践,把一份数据拆分为多份数据,对每一份数据片段来加锁,这样就可以提升多线程并发的效率HashMap底层不就是一个数组的数据结构么?如果你要完全保证里的并发安全,如果你每次对数组做一些put、resize、get的操作的时候,你都是加锁,synchronized好了,此时就会导致并发性能非常的低下所有的线程读写hash...

2019-07-29 11:42:21 148

原创 CountDownLatch源码剖析

简介如果你的一个线程启动了多个线程来执行一些任务,此时你的这个线程需要同步阻塞等待那些线程都执行完毕了,才可以继续往下走,此时可以用CountDownLatch剖析源码countDownLatch.await():触发了一个线程入队阻塞等待它会调用tryAcquireShared()protected int tryAcquireShared(int acqui...

2019-07-29 10:57:12 69

原创 ThreadLocal源码的实现

分析一下ThreadLocal源码的实现JDK里面的Thread类,内部有一个ThreadLocalMap内部类,代表了一个map,每个Thread线程对象自己内部就有一个核心的数据结构是map这个map只能是某个线程自己内部可以使用的一份数据,是不是就是代表了线程本地的副本。一个Thread可以放多个ThreadLocal对应的本地变量副本数据结构:Thread...

2019-07-29 10:47:07 63

原创 操作系统-内存管理

连续分配方式指为一个用户程序分配一个连续的内存空间。1.单一连续分配概念:将内存空间分为系统区和用户区。系统区放在内存低地址部分,且仅供OS使用。用户区是除系统区外的其他地内存空间,用户区给用户使用。缺陷:只适用于单用户、单任务环境。2.固定分区分配概念:将内存空间分为若干个固定大小的分区,每个分区中只装入一道作业,允许有几道作业并发运行。缺陷:由于每个分区的大小固定...

2019-07-28 16:32:07 172

原创 http协议状态码301和302的区别

简介301 redirect: 301 代表永久性转移(Permanently Moved)302 redirect: 302 代表暂时性转移(Temporarily Moved )共同点 301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入...

2019-07-27 15:32:24 246

原创 Http状态码简介

1XX表示请求已经接受了,正在处理100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息2XX 表示处理成功接受,处理掉了200 OK 正常返回信息201 Created 请求成功并且服务器创建了新的资源202 Accepted 服务器已接受请求,但尚未完成处理3XX 重定向,比如完成这...

2019-07-27 15:30:50 77

原创 MVC架构模式

简介MVC模式就是架构模式的一种Model层(模型):包括存储数据的对象,比如javabeanView层(视图):提供给用户的操作的前端页面Controller层(控制):负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。优点1.各施其职,互不干涉在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要...

2019-07-27 13:45:41 494

原创 (待完善)JVM常见面试题

1.说一下jvm内存分为哪几个区域?哪些是线程独享?哪些是线程共享?(1)JVM中线程私有的内存区: a.程序计数器:当前线程所执行的字节码行号计数指示器,是线程私有的,即每个线程都有自己的程序计数器,需要注意的是,如果当前JVM执行的是Native代码(即非JAVA代码),那么程序计数器值为空 b.JAVA虚拟机栈:存放栈帧的地方,每个JAVA方法执行的时候会...

2019-07-26 18:23:09 109

原创 fork函数&exec函数

1.写时复制fork()会产生一个和父进程完全相同的子进程,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。2.fork复制的东西...

2019-07-26 18:03:07 283

原创 操作系统用户态和内核态

进程的执行状态1.用户态执行,表示进程正处于用户状态中执行;2.内核态执行,表示一个进程执行系统调用后,或中断/异常/陷入后,进入内核态。(陷入指令给用户提供接口,用于调用OS的服务)区别处于用户态执行时,进程所能访问的内存空间受到限制,其所占有的处理机是可被抢占的;而处于核心态执行中的进程,则能访问所有的内存空间,且所占用的处理机是不允许被抢占的。两种指令1.特权指令...

2019-07-26 18:01:27 502

原创 什么时候应该建立索引&不应该使用索引

应该使用索引的情况1.较频繁地作为查询条件的字段2.经常用连接(join)的字段3.经常需要根据范围进行搜索的字段4.需要排序的字段不应该使用索引的情况唯一性很小的情况(select count(discount(column))/count(column) )表数据需要频繁修改字段不在where语句出现时不要添加索引数据量少的表不要使用索引...

2019-07-26 17:57:58 1634

空空如也

空空如也

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

TA关注的人

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