
Java
文章平均质量分 94
Slayer_Zhao
full-stack programmer
展开
-
深入理解 MySQL 索引底层原理
Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。我们知道,索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检索。在数据库中,高效的查找算法是非常重要的,因为数据库中存储了大量数据,一个高效的索引能节省巨大的时间。比如下面这个数据表,如果 Mysql 没有实现索引算法,那么查找 id=7 这个数据,那么只能采取暴力顺序遍历转载 2021-01-05 11:35:47 · 265 阅读 · 0 评论 -
Java线程池实现原理及其在美团业务中的实践
一、写在前面1.1 线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。而本文描述线程池是JDK中提供的ThreadPoolExecutor类。转载 2021-01-05 11:28:00 · 411 阅读 · 1 评论 -
Dubbo中的SPI机制
前言Dubbo 的成功离不开它采用微内核设计+SPI扩展,使得有特殊需求的接入方可以自定义扩展,做定制的二次开发。良好的扩展性对于一个框架而言尤其重要,框架顾名思义就是搭好核心架子,给予用户简单便捷的使用,同时也需要满足他们定制化的需求。Dubbo 就依靠 SPI 机制实现了插件化功能,几乎将所有的功能组件做成基于 SPI 实现,并且默认提供了很多可以直接使用的扩展点,实现了面向功能进行拆分的对扩展开放的架构。什么是 SPI首先我们得先知道什么叫 SPI。SPI (Service转载 2020-08-25 10:41:55 · 447 阅读 · 0 评论 -
线上FullGC排查思路/实战/解决方案
线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力。同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验。过去半年时间里,我们的广告系统出现了多次和GC相关的线上问题,有Full GC过于频繁的,有Young GC耗时过长的,这些问题带来的影响是:GC过程中的程序卡顿,进一步导致服务超时从而影响到广告收入。这篇文章,我将以一个FGC频繁的线上案例作为引子,详细介绍下GC的排查过程,另外会结合GC的运行原理给出一份实践指南,希望对你有所原创 2020-05-25 09:29:10 · 1630 阅读 · 0 评论 -
【详细解析】深入理解synchronized底层原理
目录正文场景有序性可见性原子性可重入性不可中断性底层实现同步代码同步方法monitor1.5 重量级锁那用户态和内核态又是啥呢?1.6 优化锁升级偏向锁轻量级锁自旋锁用synchronized还是Lock呢?多线程的东西很多,也很有意思,所以我最近的重心可能都是多线程的方向去靠了,不知道大家喜欢否?阅读本文之前阅读以下两篇文章会帮助你更好的理解:Volatile乐观锁&悲观锁正文场景我们正常.转载 2020-05-18 09:23:14 · 5528 阅读 · 6 评论 -
【源码解析】35张图详解 AQS底层原理
目录前言1AQS实现原理2 目录结构3 场景分析4 公平锁实现原理5 Condition实现原理6 总结前言谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。我们先看下AQS相关的UML图:1AQ..转载 2020-05-09 10:05:15 · 1263 阅读 · 2 评论 -
【详细总结】你所需要掌握的Java后端知识点
目录SpringSpring框架的七大模块Bean定义5种作用域spring ioc初始化流程?BeanDefinition加载流程?DI依赖注入流程? (实例化,处理Bean之间的依赖关系)依赖注入怎么处理bean之间的依赖关系?Bean的生命周期?Spring的IOC注入方式怎么检测是否存在循环依赖?Spring如解决Bean循环依赖问题?Spr...........................转载 2020-05-08 11:16:23 · 8729 阅读 · 0 评论 -
深入浅出SpringIOC(是何,为何,如何)
前言本文围绕 是何、为何、如何 来谈:是何上一篇文章有同学问我在官网该看哪些内容,怎么找的,那今天的截图里都会有链接。初识 IoC根据上一篇文章我们说的,Spring 全家桶中最重要的几个项目都是基于 Spring Framework 的,所以我们就以 Spring Framework 为例来看文档[2]。首先它的右侧有 Github 的链接,另外点到「LEARN」这里...转载 2020-05-05 17:29:46 · 445 阅读 · 0 评论 -
[详细分析]Java-ArrayList源码全解析
类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口,可以克隆 实现了Serializable接口,可以序列化、反序列化 实现了List接口,是List的实现类之一 实现了Collection接口,是Java Collections Framework成员之一 实现了Iterable接口,可以使用for-e...原创 2020-05-03 11:22:39 · 355 阅读 · 0 评论 -
什么是Spring事务传播行为?
作者 | handaqiang地址 | https://segmentfault.com/a/1190000013341344目录前言基础概念1. 什么是事务传播行为?2. Spring 中七种事务传播行为代码验证1.PROPAGATION_REQUIRED1.1 场景一1.2 场景二2.PROPAGATION_REQUIRES_NEW2.1 ...转载 2020-04-30 09:50:48 · 1005 阅读 · 0 评论 -
Java-Volatile的作用以及底层实现原理
Volatile可能是面试里面必问的一个话题吧,对他的认知很多朋友也仅限于会用阶段,今天我们换个角度去看看。先来看一段demo的代码:你会发现,永远都不会输出有点东西这一段代码,按道理线程改了flag变量,主线程也能访问到的呀?为会出现这个情况呢?那我们就需要聊一下另外一个东西了。JMM(JavaMemoryModel)JMM:Java内存模型,是java虚拟机规范中...转载 2020-04-29 09:16:22 · 2812 阅读 · 2 评论 -
为什么HashMap线程不安全?
目录1.jdk1.7中的HashMap1.1 扩容造成死循环分析过程1.2 扩容造成数据丢失分析过程2.jdk1.8中HashMap总结前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk...原创 2020-04-21 12:05:28 · 479 阅读 · 0 评论 -
AQS中的公平锁和非公平锁
正文公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。 ...转载 2020-03-29 08:06:18 · 4187 阅读 · 4 评论 -
深入理解JVM总结
https://blog.youkuaiyun.com/TJtulong/article/details/89598598#JDKJREJVM_3https://blog.youkuaiyun.com/Yano_nankai/article/details/50957578原创 2019-11-20 16:57:51 · 110 阅读 · 0 评论 -
Java知识梳理——Linux I/O模型中的select,poll,epoll
阅读本文之前可以了解下JAVA中的BIO,NIO,AIO模型,可以参考我的一篇博文:https://blog.youkuaiyun.com/qq_38905818/article/details/100931441注意:本文讨论的背景是Linux环境下的network IO模型。IO模式对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统...原创 2019-10-13 20:19:58 · 340 阅读 · 0 评论 -
Java知识梳理—— ==,equal(),hashcode()的区别与联系
1.==若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等 若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回true,则该操作符作用的一定是同一个对象。 int a=1; int b=1; System.out.println(a==b);//true ...原创 2019-09-03 16:39:14 · 318 阅读 · 1 评论 -
Java知识梳理——线程池参数设置
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler h...原创 2019-09-19 13:51:36 · 974 阅读 · 0 评论 -
Java知识梳理——集合类(Collection)面试高频问题总结
个人觉得 Java 集合类在面试过程中是个超高频的模块,所以一定要认真准备每个知识点。那么我个人学习这块知识点的方法是:1、阅读源码:这一块的考点可以说就是看你对有没有阅读过集合类的源码以及对其的掌握程度。因为在平时的开发中几乎每天都在和集合类打交道,只有了解清楚它们底层的实现原理,才能在日常业务开发中选择合适的集合。可能会有人说阅读源码比较枯燥,看不下去,但是 Java 集合类的源码...原创 2019-09-22 10:14:16 · 249 阅读 · 0 评论 -
Java知识梳理——Tomcat内存溢出解决办法
https://blog.youkuaiyun.com/liutengyuan/article/details/78972160解决办法:修改TOMCAT_HOME/bin/catalina.shJAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M-XX:MaxPermSize=128m"Java内存溢出详解一、常见的Java内...原创 2019-09-23 16:01:24 · 133 阅读 · 0 评论 -
Java知识梳理——String,StringBuffer与StringBuilder的区别
String:char数组是final的,不可变,修改String时实际上是new一个新String对象返回,线程安全,频繁的增删操作时不建议使用 /** String本质是个char数组. 而且用final关键字修饰.*/ private final char value[];StringBuffer:线程安全(StringBuffer中的方法中加synchronized锁),...原创 2019-09-17 17:13:17 · 96 阅读 · 0 评论 -
Java知识梳理——协程
协程是啥?我们都知道,线程是CPU调度的基本单位,但是到底设置多少个线程是很难决定的,并且如果一个线程陷入了IO等待的话,会降低整个系统的吞吐量。在Java中,每个线程对应JVM以及操作系统的一个轻量级线程。因为stack的容量是有限的,所以不可能一直生成很多个线程。协程的本质上其实还是和上面的方法一样,只不过他的核心点在于调度那块由他来负责解决,遇到阻塞操作,...原创 2019-09-23 16:33:55 · 284 阅读 · 0 评论 -
如何运用SpringBoot+Mybatis逆向工程快速搭建后台工程
假设有一个需求:后台需要记录一条HTTP请求的信息并且设计出一个get请求接口。SQL结构:create table http_history( id int not null auto_increment primary key, method varchar(10) not null, request varchar(200) not null, response varch...原创 2019-09-25 15:30:02 · 645 阅读 · 1 评论 -
Java知识梳理——AQS原理
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存...原创 2019-09-25 16:56:41 · 155 阅读 · 0 评论 -
Java知识梳理——大数类 BigInteger BigDemical
今天在做大数取余时发现Java中大数精度丢失的问题,建议小伙伴们在数字超过double最大位数时用大数类操作//求10的77次方对19取余public class Main { public static void main(String[] args){ double dou=Math.pow(10,77); DecimalFormat df = ...原创 2019-09-27 01:02:39 · 251 阅读 · 0 评论 -
Java知识梳理——可达性分析方法原理 finalize
可达性分析是JVM垃圾回收中确定垃圾的一种方式。另一种方法为引用记数法,但是引用记数法无法解决循环引用问题。public class Main { public static void main(String[] args) { MyObject object1 = new MyObject(); MyObject object2 = new MyOb...原创 2019-10-11 14:28:00 · 1486 阅读 · 0 评论 -
Java知识梳理——堆内内存和堆外内存
名词解释:堆内内存:on-heap memory对外内存:off-heap memory堆内与堆外的关系其实堆内堆外是两个相对的关系,堆内内存是我们常用到的。Java分配的非空对象都是由java虚拟机的垃圾收集器管理的,这一部分称为堆内内存,虚拟机会定期对垃圾内存进行回收,在某些特定的时间点,它会进行一次彻底的回收(full gc)。彻底回收时,垃圾收集器...原创 2019-09-18 16:59:40 · 4571 阅读 · 0 评论 -
Java基础知识梳理——值传递和引用传递
1、值传递在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。2、引用传递引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,...原创 2019-09-18 16:33:13 · 1360 阅读 · 0 评论 -
Java知识梳理——如何解决哈希冲突
一、拉链法上篇博文我们举的例子,HashMap,HashSet其实都是采用的拉链法来解决哈希冲突的,就是在每个位桶实现的时候,我们采用链表(jdk1.8之后采用链表+红黑树)的数据结构来去存取发生哈希冲突的输入域的关键字(也就是被哈希函数映射到同一个位桶上的关键字)。首先来看使用拉链法解决哈希冲突的几个操作:①插入操作:在发生哈希冲突的时候,我们输入域的关键字去映射到位桶(实际上是实现位桶...原创 2019-09-17 16:24:46 · 935 阅读 · 0 评论 -
Java知识梳理——多线程CountDownLatch的使用
使用CountDownLatch类能帮助我们检测多线程环境下的效率问题import java.util.*;import java.util.concurrent.CountDownLatch;public class Main { public static void main(String[] args) throws Exception { int Thr...原创 2019-09-06 15:07:55 · 144 阅读 · 0 评论 -
Java知识梳理——单例模式及其破解
单例模式单例模式中,最常见的有饿汉式和懒汉式,以及双重检查模式 (DCL),静态内部类单例模式,枚举单例//饿汉式(线程安全、立即加载)public class singleton { //立即加载 private static singleton instance=new singleton(); private singleton(){}; pu...原创 2019-09-06 14:05:46 · 224 阅读 · 0 评论 -
Java知识梳理——OOM出现的场景
OOM for Heap (java.lang.OutOfMemoryError: Java heap space):heap的最大值不满足需要,将设置heap的最大值调高即可。OOM for StackOverflowError (Exception in thread "main" java.lang.StackOverflowError):如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛...原创 2019-09-05 15:48:20 · 554 阅读 · 0 评论 -
Java知识梳理——GC/JVM中的垃圾回收机制/垃圾回收器
JVM如何确定垃圾?1.引用计数法算法实现:给对象添加一个引用计数器每当有一个地方引用该对象时,计数器的值就加1每当有一个地方引用失效时,计数器的值就减1任何时刻计数器的值为0的对象就是不可能再被使用的但是引用计数法有一个很大的缺点:无法解决对象之间相互循环引用的问题2.可达性分析算法基本思想:有一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索...原创 2019-09-05 15:05:29 · 155 阅读 · 0 评论 -
Java知识梳理——JVM内存模型/内存结构
1.程序计数器(线程私有)一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。 正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如 果还是Native方法,则为空。这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。2.虚...原创 2019-09-05 13:56:39 · 201 阅读 · 0 评论 -
Java知识梳理——集合(List,Set,Map)【非常全面】
1.1.接口继承关系和实现集合类存放于Java.util包中,主要有3种:set(集)、list(列表包含Queue)和map(映射)。1.2.ListJava 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类:分别是 ArrayList、Vector 和 LinkedList1.2....原创 2019-09-03 16:00:45 · 202 阅读 · 0 评论 -
Java知识梳理——四种线程池
1.newCachedThreadPool创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有60秒钟未被使用的线程。因此,长时间保持空闲的线程池不会...原创 2019-09-02 16:26:15 · 113 阅读 · 0 评论 -
Java知识梳理——线程实现/创建方式
方法1:TheadThread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。public class Main extends Thread{ public static void main(...原创 2019-09-02 16:10:40 · 204 阅读 · 0 评论 -
Java知识梳理——重写和重载的区别
重写:重写父类中的方法,名相同,参数列表相同,方法返回值相同。重载:新增名相同,参数列表返回值不同的函数。原创 2019-09-01 13:20:57 · 121 阅读 · 0 评论 -
Java知识梳理——int和Integer的区别
int和Integer的区别1、Integer是int的包装类,int则是java的一种基本数据类型2、Integer变量必须实例化后才能使用,而int变量不需要3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值4、Integer的默认值是null,int的默认值是0延伸:关于Integer和int的...原创 2019-09-01 13:08:18 · 139 阅读 · 1 评论 -
Java知识梳理——ThreadLocal
ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。ThreadLocalMap(线程的一个属性)1.每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,...原创 2019-09-06 16:43:41 · 103 阅读 · 0 评论 -
Java知识梳理——volatile
volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。当对非volatile...原创 2019-09-07 13:52:56 · 177 阅读 · 0 评论