08 2021 档案
摘要:1、问题:数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候去? 为了快速查找一本书,图书管理员设计了一套规则: (1)、一楼放历史类,二楼放文学类,三楼放IT类… (2)、IT类,又分软件类,硬件类… (3)、软件类,又按照书名音序排序… 与之
阅读全文
posted @ 2021-08-20 18:45
mzjnumber1
摘要:参考:https://www.jianshu.com/p/55defda6dcd2 概率算法 实际上目前还没有发现更好的在大数据场景中准确计算基数的高效算法,因此在不追求绝对准确的情况下,使用概率算法算是一个不错的解决方案。 概率算法不直接存储数据集合本身,通过一定的概率统计方法预估基数值,这种方法
阅读全文
posted @ 2021-08-20 15:01
mzjnumber1
摘要:前言 看下下面几个问题: 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能 以上这些场景有个共同的问题:如何查看一个东西是否在有大量数据的池子里。 Bloom Filt
阅读全文
posted @ 2021-08-20 14:45
mzjnumber1
摘要:Bit-map的基本思想就是:用一个bit位来标记某个元素对应的Value,而Key即是该元素。 由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间) 1、需求 假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G
阅读全文
posted @ 2021-08-19 19:53
mzjnumber1
摘要:MySQL 查询优化器 SELECT 执行过程 那么如何提高 MySQL 的查询性能呢?首先你需要了解查询优化器处理 SQL 的全过程。以 SELECT 的 SQL 的执行过程为例,如下图所示。 客户端发送一条 SELECT 查询给服务器; 服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中
阅读全文
posted @ 2021-08-19 18:50
mzjnumber1
摘要:Metaspace 属于堆外内存,但由于它是单独管理的,所以排查起来没什么难度。 你平常可能见到的使用堆外内存的场景还有下面这些: JNI 或者 JNA 程序,直接操纵了本地内存,比如一些加密库; 使用了Java 的 Unsafe 类,做了一些本地内存的操作; Netty 的直接内存(Direct
阅读全文
posted @ 2021-08-19 16:16
mzjnumber1
摘要:1、获取内存的快照 有两种方式来获取内存的快照。 通过配置一些参数,可以在发生 OOM 的时候,被动 dump 一份堆栈信息。 是通过 jmap 主动去获取内存的快照。 jmap 命令在 Java 9 之后,使用 jhsdb 命令替代,它们在用法上,区别不大。 注意,这些命令本身会占用操作系统的资源
阅读全文
posted @ 2021-08-19 15:11
mzjnumber1
摘要:我们一般优化的思路有一个重要的顺序: 程序优化,效果通常非常大。 扩容,如果金钱的成本比较小,不要和自己过不去。 参数调优,在成本、吞吐量、延迟之间找一个平衡点。
阅读全文
posted @ 2021-08-19 14:19
mzjnumber1
摘要:现在的互联网服务,一般都做了负载均衡。如果一个实例发生了问题,不要着急去重启。 万能的重启会暂时缓解问题,但如果不保留现场,可能就错失了解决问题的根本,担心的事情还会到来。 所以,当实例发生问题的时候,第一步是隔离,第二步才是问题排查。 什么叫隔离呢?就是把你的这台机器从请求列表里摘除,比如把 ng
阅读全文
posted @ 2021-08-19 11:16
mzjnumber1
摘要:java \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=100 \ -XX:InitiatingHeapOccupancyPercent=45 \ -XX:G1HeapRegionSize=16m \ -XX:+ParallelRefProcEnabled \ -XX:
阅读全文
posted @ 2021-08-19 11:01
mzjnumber1
摘要:1、GC 日志输出 JVM 的参数配置其实变化也很大。就拿 GC 日志这一块来说,Java 9 几乎是推翻重来。 这个时候,再去看 jstat 已经来不及了,我们需要保留现场。 那在实践中,要怎么用呢?请看下面命令行。 Java 8 -verbose:gc -XX:+PrintGCDetails -
阅读全文
posted @ 2021-08-18 17:14
mzjnumber1
摘要:AQS 内部原理解析 我们对 AQS 进行内部原理解析的话需要抓住重点,因为 AQS 的内部比较复杂,代码很长而且非常不容易读懂,如果我们一上来就一头扎进去读源码,是很难完全掌握它的。 所以在本课时中,我们把 AQS 最核心的三个部分作为重点提炼出来,由这三个部分作为切入点,打开 AQS 的大门。
阅读全文
posted @ 2021-08-18 10:01
mzjnumber1
摘要:你可能经常在面试中被问到这两个问题。合适的线程数量是多少?CPU 核心数和线程数的关系? 我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。 在实际工作中,我们需要根据任务类型的不同选择对应的策略。 CPU 密集型任务 首先,我们来看
阅读全文
posted @ 2021-08-18 08:59
mzjnumber1
摘要:1、常见的 6 种线程池 6 种常见的线程池如下。 FixedThreadPool CachedThreadPool ScheduledThreadPool SingleThreadExecutor SingleThreadScheduledExecutor ForkJoinPool FixedTh
阅读全文
posted @ 2021-08-18 08:14
mzjnumber1
摘要:拒绝时机 首先,新建线程池时可以指定它的任务拒绝策略,例如: newThreadPoolExecutor( 5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.DiscardOldestPol
阅读全文
posted @ 2021-08-18 07:58
mzjnumber1
摘要:package com.mzj.thread.interrupt; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * 用 “volatile 标记位的停止方
阅读全文
posted @ 2021-08-18 07:46
mzjnumber1
摘要:在如今的计算机系统设计中,有很多的应用已经不再局限于在单机环境下运行了,这些应用会将本身或者底层的存储本身部署在分布式环境中, 像是数据库的分片(Sharding),或者是将数据部署到分布式环境下的多台机器集群中,从而达到负载均衡。 那我们今天就一起来看看,数据结构在分布式环境应用中扮演着怎么样的一
阅读全文
posted @ 2021-08-17 14:59
mzjnumber1
摘要:Uber Pool 是 Uber 类似于滴滴拼车的共享乘车产品。 拼车产品能够自动把路线重叠的乘客配对起来,这样对于所有乘客都能用更便宜的价格来享受乘车服务,路线重叠的越多,共享拼车就能提供越多的折扣。 怎样去设计一个好的拼车路线呢?Uber 设计了这样的指标,必须是便宜、快捷、方便和友好的。 从工
阅读全文
posted @ 2021-08-17 14:32
mzjnumber1
摘要:1、图的实现方式 两种图的实现方式: 一种是邻接矩阵法。 另一种是邻接链表法。 这两种实现方式将会影响到我们后面算法的应用。 邻接矩阵法 使用邻接矩阵法的基本思想是开一个超大的数组,用数组中间元素的 true/false 来表达边,有 V 个节点的图,需要一个 V × V 大小的数组。 下面这个例子
阅读全文
posted @ 2021-08-17 14:19
mzjnumber1
摘要:1、Log-Structured 结构 在计算机存储数据结构的发展中,Log-Structured 结构的诞生为许多文件系统或者是数据库打下了坚实的基础。 比如说,Google 的三驾马车之一,Bigtable 文件系统的底层存储数据结构采用的就是 Log-Structured 结构,还有大家所熟知
阅读全文
posted @ 2021-08-17 13:15
mzjnumber1
摘要:红黑树被定义成: 一棵二叉树,每一个节点要么是红色,要么是黑色 根节点一定是黑色 红节点不能有红孩子 每条从根节点到底部的路径都经过同样数量的黑节点 看个例子,这棵红黑树的根节点值是 13,是一个黑色节点。 比如红节点 8 的两个孩子是黑色节点 1 和 11,因为红节点不能有红孩子。 可以看到,从根
阅读全文
posted @ 2021-08-17 10:20
mzjnumber1
摘要:双重检查锁模式的写法 单例模式有多种写法,我们重点介绍一下和 volatile 强相关的双重检查锁模式的写法,代码如下所示: public class Singleton { private static volatile Singleton singleton; private Singleton
阅读全文
posted @ 2021-08-16 14:34
mzjnumber1
摘要:什么是 happens-before 关系? Happens-before 关系是用来描述可见性相关问题的: 如果第一个操作 happens-before 第二个操作,那么我们就说第一个操作对于第二个操作一定是可见的,也就是第二个操作在执行时就一定能保证看见第一个操作执行的结果。 不具备 happe
阅读全文
posted @ 2021-08-15 14:03
mzjnumber1
摘要:1、Atomic性能问题 AtomicInteger 和 AtomicLong这两个原子类实际上会有较大的性能问题,这是为什么呢?就让我们从一个例子看起。 首先我们来看一段代码: /** * 描述: 在16个线程下使用AtomicLong */ public class AtomicLongDemo
阅读全文
posted @ 2021-08-15 11:26
mzjnumber1
摘要:什么是重排序 假设我们写了一个 Java 程序,包含一系列的语句,我们会默认期望这些语句的实际运行顺序和写的代码顺序一致。 但实际上,编译器、JVM 或者 CPU 都有可能出于优化等目的,对于实际指令执行的顺序进行调整,这就是重排序。 重排序的好处:提高处理速度 图中左侧是 3 行 Java 代码,
阅读全文
posted @ 2021-08-13 12:29
mzjnumber1
摘要:Adder 的介绍 我们要知道 Adder 和 Accumulator 都是 Java 8 引入的,是相对比较新的类。 对于 Adder 而言,比如最典型的 LongAdder,在高并发下 LongAdder 比 AtomicLong 效率更高, 因为对于 AtomicLong 而言,它只适合用于低
阅读全文
posted @ 2021-08-13 12:24
mzjnumber1
摘要:1、阻塞队列:ArrayBlockingQueue 源码分析 我们首先看一下 ArrayBlockingQueue 的源码,ArrayBlockingQueue 有以下几个重要的属性: 第一个就是最核心的、用于存储元素的 Object 类型的数组;然 后它还会有两个位置变量,分别是 takeInde
阅读全文
posted @ 2021-08-13 12:10
mzjnumber1
摘要:这一课时我们主要讲解为什么 Map 的桶中超过 8 个才转为红黑树? JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点: 最开始的 Map 是空的,因为里面没有任何元素, 往里放元素时会计算 hash 值,计算之后,第 1 个 value 会首先占用一个桶
阅读全文
posted @ 2021-08-13 11:52
mzjnumber1
摘要:在 Java 8 中,对于 ConcurrentHashMap 这个常用的工具类进行了很大的升级,对比之前 Java 7 版本在诸多方面都进行了调整和变化。 不过,在 Java 7 中的 Segment 的设计思想依然具有参考和学习的价值,所以在很多情况下面试官都会问你: ConcurrentHas
阅读全文
posted @ 2021-08-13 11:39
mzjnumber1
摘要:什么是自旋? 首先,我们了解什么叫自旋?“自旋”可以理解为“自我旋转”,这里的“旋转”指“循环”,比如 while 循环或者 for 循环。 “自旋”就是自己在这里不停地循环,直到目标达成。而不像普通的锁那样,如果获取不到锁就进入阻塞。 对比自旋和非自旋的获取锁的流程,下面我们用这样一张流程图来对比
阅读全文
posted @ 2021-08-13 11:24
mzjnumber1
摘要:根据分类标准我们把锁分为以下 7 大类别,分别是: 偏向锁/轻量级锁/重量级锁; 可重入锁/非可重入锁; 共享锁/独占锁; 公平锁/非公平锁; 悲观锁/乐观锁; 自旋锁/非自旋锁; 可中断锁/不可中断锁。 以上是常见的分类标准,下面我们来逐一介绍它们的含义。 偏向锁/轻量级锁/重量级锁 第一种分类是
阅读全文
posted @ 2021-08-13 11:15
mzjnumber1
摘要:线程也有自己的生命周期,在 Java 中线程的生命周期中一共有 6 种常见状态。 New(新创建) Runnable(可运行) Blocked(被阻塞) Waiting(等待) Timed Waiting(计时等待) Terminated(被终止) 如果想要确定线程当前的状态,可以通过 getSta
阅读全文
posted @ 2021-08-12 19:44
mzjnumber1
摘要:序列化 1、java使用 ObjectOutputStream() 和 ObjectInputStream() 对对象进行手动序列化和反序列化。 序列化的时候会调用 writeObject() 方法,把对象转换为字节流。 反序列化的时候会调用 readObject() 方法,把字节流转换为对象。 2
阅读全文
posted @ 2021-08-12 09:56
mzjnumber1
摘要:算法面试-TopK 问题描述: 从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题。 栗子: 从arr[1, 12]={5,3,7,1,8,2,9,4,7,2,6,6} 这n=12个数中,找出最大的k=5个。 方式一、排序 排序是最容易想到的方法,将n个数排序之后,取出最大的
阅读全文
posted @ 2021-08-10 08:33
mzjnumber1
摘要:前言 二叉搜索树的中序遍历是升序序列,题目给定的数组是按照升序排序的有序数组,因此可以确保数组是二叉搜索树的中序遍历序列。 1、给定二叉搜索树的中序遍历,是否可以唯一地确定二叉搜索树? 答案是否定的。如果没有要求二叉搜索树的高度平衡,则任何一个数字都可以作为二叉搜索树的root节点,因此可能的二叉搜
阅读全文
posted @ 2021-08-09 10:13
mzjnumber1
摘要:删除二叉搜索树中的节点 1、二叉搜索树的三个特性: 这些性质最好在面试之前了解清楚: 1、二叉搜索树的中序遍历的序列是递增排序的序列。中序遍历的遍历次序:Left -> Node -> Right。 public LinkedList<Integer> inorder(TreeNode root,
阅读全文
posted @ 2021-08-09 07:43
mzjnumber1
摘要:如何做好情绪管理? 《10 个情绪管理的兵器库,帮你每天保持好心情》 情绪管理,可以很复杂,也可以很简单。 说复杂, 是因为人和人不同, 遇到的事情不同, 引发情绪的原因也不同, 所以,好像没有一个通用的方法, 能帮助我们缓解情绪。 说简单, 因为所有情绪, 都有共性 —— 1 、一切情绪问题,都是
阅读全文
posted @ 2021-08-02 07:32
mzjnumber1
摘要:一、背景 Java的内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收。 Java以便我们控制对象的生存周期,提供给了我们四种引用方式,引用强度从强到弱分别为:强引用、软引用、弱引用、虚引用。 1. 强引用 StrongReference2. 弱引用 WeakReference
阅读全文
posted @ 2021-08-01 16:40
mzjnumber1
浙公网安备 33010602011771号