04 2020 档案

摘要:先来提出问题和给出答案,之后再刨根问底的揭开面纱: 问:volatile 的可见性和禁止指令重排序是怎么实现的? 答:可见性:是通过缓存一致性协议来达到的 禁止指令重排序:JMM 模型里有 8 个指令来完成数据的读写,通过其中 load 和 store 指令相互组合成的 4 个内存屏障实现禁止指令重 阅读全文
posted @ 2020-04-28 16:10 星火燎原智勇 阅读(743) 评论(1) 推荐(3)
摘要:来看一道笔试题: 模拟一个容器,有 2 个线程生成数据写入,10 个线程消费的生产者消费者模型 阅读全文
posted @ 2020-04-28 10:27 星火燎原智勇 阅读(248) 评论(0) 推荐(0)
摘要:CLH 队列 CLH同步队列是一个FIFO双向队列,AQS 依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态 阅读全文
posted @ 2020-04-28 10:19 星火燎原智勇 阅读(2991) 评论(1) 推荐(0)
摘要:背景 这篇博文是接着上一篇 线程池专题 的一个补充,是针对线程池底层队列的种类做一个进一步的深入详解,上一篇博文主要针对一线大厂针对线程池的灵魂 5 问展开的,而这一篇也是综合了另外面试经验,把底层的一些内容再深入剖析一下。 线程池任务处理 如果运行的线程数 < corePoolSize,则 Exe 阅读全文
posted @ 2020-04-28 01:22 星火燎原智勇 阅读(1490) 评论(0) 推荐(0)
摘要:背景 线程池的基本介绍、为什么使用线程池以及使用线程池的配置等基础篇可以参考我之前的一篇博文:JAVA 线程池基本总结 今天这里主要针对面试相关的再进行一次有针对性的整理和总结,每个细节点都是被问到过的,所以每个细节点都需要搞明白,搞透。 面试题目 来看一下灵魂 5 连问 1、什么是线程池? 2、说 阅读全文
posted @ 2020-04-27 19:14 星火燎原智勇 阅读(459) 评论(0) 推荐(0)
摘要:我们知道,concurrent包是基于AQS (AbstractQueuedSynchronizer)框架,AQS框架借助于两个类:Unsafe(提供CAS操作) 和 LockSupport(提供park/unpark操作)。因此,LockSupport可谓构建concurrent包的基础之一。理解 阅读全文
posted @ 2020-04-27 11:26 星火燎原智勇 阅读(2417) 评论(0) 推荐(0)
摘要:1、Lock Lock 是一个接口,具体定义如下: public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLoc 阅读全文
posted @ 2020-04-26 14:54 星火燎原智勇 阅读(1089) 评论(0) 推荐(0)
摘要:我们需要先从线程来讲起,相关基本概念这里就不做过多的阐述,都太基本了,有需要可以参考:synchronized 相关概念。这里先从线程状态聊起 1、线程状态 线程共有 5 种状态: 新建状态:新建线程对象,并没有调用start()方法之前 就绪状态:调用start()方法之后线程就进入就绪状态,但是 阅读全文
posted @ 2020-04-26 11:28 星火燎原智勇 阅读(368) 评论(0) 推荐(0)
摘要:协程概念 “协程”(Coroutine)概念最早由 Melvin Conway 于 1958 年提出。虽然被提出的时间很早,但是使用它的年限很短。尤其是最近几年,随着 Go、Lua 等语言的流行,把协程推向了一个新的高潮。 协程其实可以认为是比线程更小的执行单元。为啥说他是一个执行单元,因为他自带C 阅读全文
posted @ 2020-04-26 10:59 星火燎原智勇 阅读(1704) 评论(0) 推荐(0)
摘要:JVM 堆内存组成 Java堆由 Perm区 和 Heap区 组成,Heap区 由 Old区 和 New区(也叫Young区)组成,New区 由 Eden区、From区 和 To区(Survivor)组成。见下图 Heap 区示例: Eden区用于存放新生成的对象。Eden中的对象生命不会超过一次 阅读全文
posted @ 2020-04-23 00:52 星火燎原智勇 阅读(739) 评论(0) 推荐(0)
摘要:CMS 垃圾收集器 CMS(Concurrent Mark Sweep) 收集器是一种 以获取最短回收停顿时间为目标 的收集器。 目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,已给用户带来较好的体验。 从字面上可以看出CMS 阅读全文
posted @ 2020-04-22 23:22 星火燎原智勇 阅读(2077) 评论(0) 推荐(0)
摘要:先来看一下 JVM 管理的内存图: 程序计数器 它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器。 每一条JVM线程都有自己的PC寄存器,各条线程之间互不影响,独立存储,这类内存区域被称为“线程私有”内存 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfM 阅读全文
posted @ 2020-04-22 19:22 星火燎原智勇 阅读(369) 评论(0) 推荐(0)
摘要:JVM 垃圾回收机制主要考虑:回收依据 以及 如何回收 一、垃圾回收判定 目前主要有两种算法来标识对象是否可以回收:引用计数法 和 可达性分析算法,目前主流的JVM(HotSpot)采用的是第二种 1、引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器 阅读全文
posted @ 2020-04-22 16:55 星火燎原智勇 阅读(243) 评论(0) 推荐(0)
摘要:1、synchronized与lock的区别,使用场景。看过synchronized的源码没 2、JVM自动内存管理,Minor GC与Full GC的触发机制 3、了解过JVM调优没,基本思路是什么? 如果CPU使用率较高,GC频繁且GC时间长,可能就需要JVM调优了。基本思路就是让每一次GC都回 阅读全文
posted @ 2020-04-22 16:35 星火燎原智勇 阅读(148) 评论(0) 推荐(0)
摘要:1、Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目 官网:http://dubbo.apache.org 2、Dubbo需要 Web 容器吗? 不需要,如果硬要用 Web 容器,只会增加复杂性,也浪费资源。 3、 阅读全文
posted @ 2020-04-21 16:05 星火燎原智勇 阅读(422) 评论(0) 推荐(0)
摘要:springboot 默认使用 application.yaml 文件来进行全局配置的,主要目的就是修改 springboot 自动配置的默认值。 1、yaml 核心语法汇总 以 空格 的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的,且属性和值都是大小写敏感的。 server: po 阅读全文
posted @ 2020-04-21 11:30 星火燎原智勇 阅读(311) 评论(0) 推荐(0)
摘要:1、启动方式 .run() 和 .start() 注意:直接执行线程的 run() 方法,但是线程调用 start() 方法时也会运行 run() 方法,区别就是一个是由线程调度运行 run() 方法,一个是直接调用了线程中的 run() 方法!! 2、线程中常用方法 start:开始执行该线程 s 阅读全文
posted @ 2020-04-21 09:31 星火燎原智勇 阅读(255) 评论(0) 推荐(0)
摘要:从浏览器到页面展示中间过程其实是一个很复杂的逻辑过程,大概分为以下 8 大步骤,这里尽量使用简单易理解的方式将所有涉及到的环节梳理一下 1、url 输入 我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 ur 阅读全文
posted @ 2020-04-20 23:28 星火燎原智勇 阅读(459) 评论(0) 推荐(0)
摘要:SpringBoot 的 Maven plugin能够将 SpringBoot 应用打包为可执行的 jar 或 war 包,然后以通常的方式如 java -jar 来运行 SpringBoot 应用。Spring Boot Maven plugin 的 5个 Goals,最主要的就是能够将 mvn package 生成的软件包,再次打包为可执行的软件包,并将 mvn package 生成的软件包重命名为 *.original,springboot 打 jar 包,无法引用jar包里面的类,如何解决? 阅读全文
posted @ 2020-04-20 00:38 星火燎原智勇 阅读(1530) 评论(0) 推荐(0)
摘要:jdk 由 1.7 升级到 1.8 底层改动很大,今天我们先来看一下其中一个基本结构 hashmap 的优化改动。那么具体hashmap1.7 和 hashmap1.8 有哪些区别呢? 1. JDK1.7用的是头插法,而 JDK1.8及之后使用的都是尾插法 那么他们为什么要这样做呢? 因为 JDK1 阅读全文
posted @ 2020-04-18 23:13 星火燎原智勇 阅读(2049) 评论(0) 推荐(1)
摘要:在堆中,32位的对象引用(指针)占4个字节,而64位的对象引用占8个字节。也就是说,64位的对象引用大小是32位的2倍。64位JVM在支持更大堆的同时,由于对象引用变大却带来了性能问题。为了能够保持32位的性能,oop必须保留32位。那么,如何用32位oop来引用更大的堆内存呢?答案是——压缩指针。JVM的实现方式是,不再保存所有引用,而是每隔8个字节保存一个引用。例如,原来保存每个引用0、1、2...,现在只保存0、8、16...。我们可以通过增加JVM参数 -XX:+PrintFlagsFinal,验证UseCompressedOops的值,从而得知,到底是不是真的开启了压缩指针,还是压缩指针失效 阅读全文
posted @ 2020-04-18 20:03 星火燎原智勇 阅读(2738) 评论(1) 推荐(0)
摘要:背景: 我们当前的微服务架构采用的是 SpringCloud 全家桶 + dubbo + druid + apllo 等技术集成的。 1、多服务实例相同端口冲突问题 目前线上服务器内容动辄 128 ~ 256GB,我们一个服务最大内存设置不超过 32GB,那么为了有效利用服务器资源,我们都会在一台服 阅读全文
posted @ 2020-04-15 00:53 星火燎原智勇 阅读(1692) 评论(1) 推荐(1)