自定义博客皮肤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)
  • 收藏
  • 关注

原创 【并发】11、ConcurrentHashMap源码分析

ConcurrentHashMap源码分析1.7属性构造器put()方法1.8构造器ConcurrentHashMap是线程安全的,他是写同步读无锁。 也就是put()的时候会加锁,get()的时候不会加锁1.7ConcurrentHashMap底层是由两层嵌套数组来实现的:ConcurrentHashMap对象中有一个属性segments,类型为Segment[];Segment对象中有一个属性table,类型为HashEntry[];属性segmentsegment继承了R

2021-01-29 01:25:31 222

原创 【并发】10、HashMap源码分析

HashMapjdk7 数组+链表(头插法)属性引入链表解决hash冲突,jdk7为头插法HashMap的属性table就是用来存数组加载因子数组容量超过了75% 就会去扩容为什么加载因子默认选择为75?根据牛顿二项式算的,基于空间与时间的折中考虑。因为加载因子过小,也就是过早扩容会浪费很多空间;而加载因子过大,也就是数组都快占满了才扩容的话,这时候发生哈希冲突的概率多,链表就会过长,过长遍历速度就会慢。数组最大长度默认初始容量即数组长度默认为16,必须是2的指数幂,如果不是则

2021-01-29 00:34:17 116

原创 【并发】9、Atomic 和UnSafe

Atomic 和UnSafeAtomicIntegerAtomicIntegerArrayCAS修改的ABA问题AtomicIntegergetAndIncrement()offset属性相对于对象起始地址的偏移量AtomicIntegerArray没有修改原值, 是clone了一份CAS修改的ABA问题

2021-01-28 19:41:01 84

原创 【并发】AQS总结

AQS总结整体获取锁整体获取锁

2021-01-28 15:01:41 110

原创 【并发】8、Semaphore和CountDownLatcn应用及源码分析

SemaphoreSemaphore属性获取信号量释放AQS-Node共享模式acquire()->acquireSharedInterruptibly()release()->releaseShared()Semaphore属性sync 继承了公平类与非公平类state表示最大并行度,相当于总的池子的个数为5获取信号量semaphore.acquire()方法 就是从总的池子里拿出一个凭据,拿一次state就会减1中断方式获取semaphore.acquire(int i)

2021-01-28 00:29:32 140

原创 【并发】7、抽象队列同步器AQS应用之阻塞队列BlockingQueue

抽象队列同步器AQS应用之阻塞队列BlockingQueueArrayBlockingQueue 类重要属性构造器put()方法AQSawait()BlockingQueue是线程间通信的工具,在任意时刻、不管并发有多高,在单JVM上,同一时间永远都只有一个线程能够对队列进行入队或出队操作。BlockingQueue的特性:是线程安全的应用场景:对于生产者消费者场景很适合线程池springcloud-Euraka的三级缓存NacosNettyMQ(Roketmq)所有的阻塞队

2021-01-27 21:03:06 198

原创 【并发】5、抽象队列同步器AQS应用ReentrantLock

AQSCASReentrantLockAQS源码分析Lock的特性:可重入这个特性就是加了几次锁也要释放几次锁synchronized也有可重入性公平性与非公平性实现锁的核心:CAS保证加锁永远只有一个线程能够成功LockSupport对线程阻塞和唤醒自旋cas加锁失败,则这些线程就要自旋,阻塞住 就不占用cpu资源queue放阻塞的那些线程,用队列是因为队列的FIFO可以保证公平性CASCAS Compare and swap能够保证不管并发有多高,都能保证

2021-01-27 00:22:33 257

原创 【并发】4、synchronized

synchronized解决线程并发安全问题synchronized和ReentrantLock发展历程synchronized用法synchronized底层对象头Mark Wordmonitor解决线程并发安全问题Java 中,提供了两种方式来实现同步互斥访问:synchronized和Locksynchronizedsynchronized是jvm提供的内置锁,也叫隐式锁。叫隐式锁的原因是他的加锁与解锁由jvm自动搞定,不需要人为搞定。ReentrantLockReentrantLoc

2021-01-25 22:40:27 103

原创 【并发】3、MESI

MESIjava代码volatile底层如何保证可见性MESIstore bufferjava代码一个java类通过javac编译成字节码文件后会通过类加载子系统装载进元空间在堆中生成Class实例创建线程要执行的方法的字节码会加到虚拟机栈栈帧中,执行执行引擎(解释器/JIT)会将字节码翻译成汇编指令(硬件原语)硬件再将汇编指令翻译成二进制,速度非常快这个二进制代码对应的线程被CPU调度后就会被执行因为jvm是klt的,操作系统中会会维护一个线程常量池,其中的每个线程与jvm上的线

2021-01-25 18:26:27 164

原创 【并发】2、JMM三大特性与Volatile

JMM三大特性八大可见性原子性有序性内存屏障JMM 是抽象的内存规范对变量有改操作后,会把结果回写回来。,先用assign 把执行引擎的数据同步到工作内存中,然后从工作内存store出来,再用write到主内存中。必须把它的工作内存的数据同步到主内存中八大java并发的三大特性:可见性原子性有序性可见性每个线程只能看到自己的工作内存的更改, 加一个volatile可以及时的看到,但是不加volatile线程在一定的时间之后也会看到,只是看到的时机确定不了。volatile是ja

2021-01-25 15:48:40 320

原创 【并发】1、操作系统底层

操作系统底层CPUCPU指令结构CPU缓存结构CPUCPU指令结构CPU需要用到的时候就会把内存中的指令和数据加载到自己的存储单元中main方法启动一个进程,进程就会在内存中开辟这个进程的存储空间,存的包括指令段和数据段,用到他们的时候就会被加载到CPU的存储单元中。Java程序被javac编译成.class字节码文件,然后被classloader即类加载器加载到JVM的运行时数据区的元空间metaspace中,然后元空间就有了指令和数据一个计算机上可以包含多个CPU,一个CPU上包含多个核。

2021-01-25 11:10:48 156

原创 【JVM】垃圾回收相关面试题

蚂蚁金服你知道哪几种垃圾回收器,各自的优缺点,重点讲一下CMS和G1?JVM GC算法有哪些,目前的JDK版本采用什么回收算法?G1回收器讲下回收过程GC是什么?为什么要有GC?GC的两种判定方法?CMS收集器与G1收集器的特点百度说一下GC算法,分代回收说下垃圾收集策略和算法天猫JVM GC原理,JVM怎么回收内存CMS特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什么?滴滴Java的垃圾回收器都有哪些,说下G1的应用场景,平时你是如何搭配使用垃圾回收

2021-01-23 15:11:27 108

原创 【JVM】17、垃圾回收器

垃圾回收器GC 分类与性能指标垃圾回收的分类评估 GC 的性能指标GC 分类与性能指标垃圾回收的分类按线程数分(垃圾回收线程数)串行垃圾回收器串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。并行垃圾回收器并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了“Stop-the-World”机制。按照工作模式分并发式垃圾回收器并发式垃圾回收器与应用程

2021-01-22 11:27:42 1119

原创 【JVM】16、垃圾回收相关概念

垃圾回收相关概念System.gc() 的理解手动gc理解不可达对象的行为内存溢出与内存泄露内存溢出OOM内存泄漏(Memory Leak)Stop the World并行与并发程序的并行与并发垃圾回收的并行与并发安全点与安全区域安全点(Safepoint)安全区域(Safe Region)引用强引用软引用弱引用虚引用(Phantom Reference)终结器引用System.gc() 的理解System.gc() 其实调用的是Runtime.getRuntime().gc(),gc()是native

2021-01-22 02:07:54 157 1

原创 【JVM】15、垃圾回收相关算法

垃圾回收相关算法垃圾标记阶段的算法引用计数算法(Reference Counting)可达性分析算法可达性分析算法基本思路GC Roots 可以是哪些元素(面试高频)可达性分析注意事项GC Roots溯源对象的 finalization 机制finalize() 方法机制对象的三种可能的状态finalize() 具体执行过程清除阶段标记-清除算法(Mark-Sweep)复制算法复制算法执行过程复制算法的优缺点标记-压缩(整理)算法 Mark-Compact标记-压缩算法的执行流程标记-压缩算法与标记-清除算

2021-01-21 22:25:02 117

原创 【JVM】14、垃圾回收概述

垃圾回收概述什么是垃圾为什么需要GC早期垃圾回收Java 垃圾回收机制自动内存管理GC 的作用区域什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。An object is considered garbage when it can no longer be reached from any pointer in the running program.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其

2021-01-21 12:42:53 90

原创 【JVM】13、StringTable

StringTabeleString的基本特性String 底层 Hashtable 结构String 内存结构的分配位置调整String位置的原因String 的基本操作字符串拼接操作字符串拼接相关面试题拼接操作底层原理String的基本特性String:字符串,使用一对 “” 引起来表示String s1 = "mogublog" ; // 字面量的定义方式String s2 = new String("moxi"); // new 对象的方式String声明为f

2021-01-20 18:14:51 150

原创 【JVM】12、执行引擎

执行引擎执行引擎概述执行引擎执行引擎的工作过程Java 代码编译和执行过程解释执行和即时编译解释器JIT编译器机器码、指令、汇编语言机器码指令和指令集汇编语言高级语言字节码执行引擎概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器执行引擎执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受

2021-01-20 00:28:21 92

原创 【JVM】10、直接内存

直接内存native memory 和direct memory直接内存BIO 与NIONIO直接内存与 OOM直接内存大小设置java.lang.OutOfMemoryError: Direct buffer memory直接内存缺点JVM内存结构参考native memory 和direct memory这部分参考JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory。Native Memory和Off-heap是一个概念,没有相应的参数来控制大小,其大小依

2021-01-19 23:18:24 392

原创 【JVM】10、对象的实例化内存布局与访问定位

对象的实例化内存布局与访问定位对象的实例化创建对象的方式对象创建过程对象的内存布局图解内存布局对象的访问定位对象的两种访问方式句柄访问直接指针面试题对象的实例化创建对象的方式new最常见的方式变形:单例类中调用getInstance的静态类方法变形:XXXFactory的静态方法Class的newInstance方法在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 publicConstructor的newInstance(Xxxx)反射的方式,可以调用

2021-01-19 21:26:21 131

原创 【JVM】运行时数据区总结与大厂面试题

运行时数据区相关面试题JVM内存分区堆方法区运行时数据区整体图:JVM内存分区说一下JVM内存模型吧,有哪些区?分别干什么的?(百度三面)JVM内存分哪几个区,每个区的作用是什么?(蚂蚁金服)JVM内存分布/内存结构?(蚂蚁金服一面)jvm内存分区(小米)Java的内存分区(字节跳动讲讲vm运行时数据库区(字节跳动)JVM的内存结构(京东)Jvm内存模型以及分区,需要详细到每个区放什么。(天猫)JVM内存分哪几个区,每个区的作用是什么?(拼多多)java内存分配(美团)

2021-01-19 14:11:42 161

原创 【JVM】9、方法区

方法区栈 堆 方法区的交互关系方法区的理解Hotspot 方法区的演进过程设置方法区大小与OOMjdk7永久代JDK8 元空间方法区OOM方法区的内部结构从线程共享与否的角度看运行时数据区结构图:ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理,以及独立会话管理线程共享->ThreadLocal->线程私有也是一个递进的关系栈 堆 方法区的交互关系方法区的理解官方文档《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上是属于堆的

2021-01-19 00:07:16 111

原创 【JVM】8、堆

堆堆的核心概述堆内存细分设置堆大小与OOM设置堆大小OOM年轻代与老年代对象分配过程对象分配的一般过程对象分配的特殊情况GC垃圾回收器年轻代GC(Minor GC)老年代GC MajorFull GCGC日志分析堆空间分代思想内存分配策略为每个线程分配的TLAB堆空间参数设置空间分配担保堆是分配对象的唯一选择么?逃逸分析逃逸的几种情况逃逸分析之代码优化栈上分配同步省略/锁消除分离对象或标量替换堆小结参考堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆

2021-01-18 20:43:14 122

原创 【JVM】6、本地方法接口 7、本地方法栈

本地方法接口本地方法参考本地方法接口在图示的右下角部分本地方法一个Native Method是一个Java调用非Java代码的接囗该方法的实现由非Java语言实现,比如C。在java代码里,使用native修饰的方法就是本地方法,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。标识符native可以与所有其他的java标识符连用,但是abstract除外为什么要使用 Native Method?Java使用起来非

2021-01-18 10:24:37 85

原创 【JVM】5、虚拟机栈

虚拟机栈虚拟机栈概述虚拟机栈的基本内容虚拟机栈的主要特点虚拟机栈的异常设置栈内存大小栈的存储单位栈的运行原理栈帧的内部结构局部变量表局部变量表概念字节码中方法内部结构的剖析局部变量表的基本存储单元:SlotSlot的重复利用静态变量和局部变量的对比操作数栈操作数栈执行流程int i = 8i++和++i栈顶缓存技术动态链接(指向运行时常量池的方法引用)方法返回地址一些附加信息方法的调用静态链接与动态链接静态链接动态链接早期绑定与晚期绑定早期绑定晚期绑定虚方法与非虚方法虚拟机中调用方法的指令方法重写虚方法表虚

2021-01-17 22:37:03 188 1

原创 【JVM】4、程序计数器(PC寄存器)

程序计数器(PC寄存器)PC Register介绍PC RegisterPC寄存器作用PC寄存器面试问题PC Register介绍这节讲的就是运行时数据区的PC寄存器部分PC RegisterProgram Counter Register,程序计数寄存器/PC寄存器JVM的PC寄存器是对物理PC寄存器的一种抽象模拟。JVM的PC寄存器是程序钩子程序钩子可以理解为是钩线程中一行一行的代码,可以理解为行号指示器,即执行上一行代码下一行该执行谁了由PC寄存器做一个记录。它是一块很小的内存空间

2021-01-17 10:51:32 171

原创 【JVM】3、运行时数据区概述及线程

运行时数据区概述及线程运行时数据区运行时数据区的结构内存线程JVM线程JVM 系统线程运行时数据区在类加载完成后的阶段,就是运行时数据区当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品运行时数据区的结

2021-01-17 10:12:37 123

原创 【JVM】2、类加载器与类的加载过程

类加载器与类的加载过程JVM架构类加载子系统类加载器子系统作用类的加载过程JVM架构JVM架构:英文版中文版类加载子系统类加载子系统部分如下图:类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识(coffebabe 魔数)。字节码文件是物理磁盘上的文件ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。加载的类信息存放于一块称为方法区的内存空

2021-01-16 19:46:18 135

原创 【JVM】1、字节码、JVM整体结构、声明周期、发展历程

JVM整体结构字节码虚拟机JAVA虚拟机JVM整体结构JAVA代码执行流程字节码Java虚拟机是解释运行字节码文件的,如下图其他语言只要通过其编译器生成了对应字节码文件就可以在java虚拟机上运行。我们平时说的java字节码,指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。Java虚拟机与Java语言并没有必然的联系,它只与特定的二

2021-01-16 16:18:15 387

原创 【JVM】类加载

JVM类加载KlassInstanceKlassInstanceMirrorKlass(镜像类)InstanceRefKlassInstanceClassLoaderKlassArrayKlassTypeArrayKlassObjArrayKlass类的加载过程加载Klassclass和klass的区别:class是java类(java代码klass是java类在JVM的存在形式(c++代码Klass类分别由InstanceKlass和ArrayKlass继承,其中InstanceClass用

2021-01-16 13:17:16 225

原创 【Mysql】事物和锁

Mysql事物和锁事物事物的ACID属性原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)事物提交自动提交手动终止/事物回滚隐式提交事物我们把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称之为一个事务。事物的ACID属性原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。【转账操作是一个不可分割的操作,要么转失败,要么转成功】一致性(Consistency)

2021-01-15 23:52:32 172

原创 【JAVA】代码执行顺序题目

代码执行顺序的题目public class TestClass { static class Father{ public int money = 1; public Father() { this.money = 2; showMoney(); } protected void showMoney(){ System.out.println("I am

2021-01-15 14:15:36 251

原创 【Spring注解】Spring源码总结

Spring源码总结

2021-01-14 17:29:50 127

原创 【Spring注解】Spring容器创建 refresh()源码解析

Spring容器创建过程BeanFactory预准备prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory(beanFactory)postProcessBeanFactory(beanFactory)invokeBeanFactoryPostProcessors当我们执行这一句就是容器创建的过程AnnotationConfigApplicationContext applicationContext= new AnnotationConfi

2021-01-13 22:53:15 176 1

原创 【Spring注解】事件监听:ApplicationListener和@EventListener注解

监听器ApplicationListener用法写一个监听器发布事件ApplicationListener原理多播器注册监听器发布事件 监听器方法回调发布事件的流程@EventListener用法@EventListener原理监听器的实现有两种方式:实现ApplicationListener接口加@EventListenerApplicationListener用法ApplicationListener通过监听容器中发布的一些事件,事件发生就会触发监听器的回调,就完成了事件驱动开发写一个监

2021-01-13 19:58:22 2252 1

原创 【Spring注解】BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

BeanFactoryPostProcessorBeanFactoryPostProcessorBeanFactoryPostProcessor功能时机BeanFactoryPostProcessor 实现原理ioc容器创建invokeBeanFactoryPostProcessorsinvokeBeanFactoryPostProcessorsBeanDefinitionRegistryPostProcessor功能执行时机原理ioc容器创建invokeBeanFactoryPostProcessorsi

2021-01-13 00:10:05 696

原创 【Spring注解】AOP

Spring注解 AOPAOP的使用@EnableAspectJAutoProxyAnnotationAwareAspectJAutoProxyCreator的定义信息beandefinition的注册AnnotationAwareAspectJAutoProxyCreator 的注册父类创建ioc容器registerBeanPostProcessors 注册BeanPostProcessor创建BeanPostProcessor对象BeanFactoryAware实现了BeanFactoryAware的s

2021-01-11 00:36:47 669 1

原创 【Spring注解】组件注入

自动装配@Autowire标在属性Autowire标在属性上自动注入流程@Qualifier@Primary示例底层实现标在方法上标在构造器标在参数上@Resource@InjectAware注入Spring底层组件自定义组件使用Spring底层组件原理Profile切换环境使用命令行动态参数使用代码方式自动装配:spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值Spring支持以下三种自动注入的方式:@Autowire Spring 提供的@Resource java规范

2021-01-09 20:55:44 329

原创 【Spring注解】属性赋值

Spring注解 属性赋值@Value@PropertySource@Value使用@Value给属性赋值:基本数值可以写SpEL, #{} 可以写${}, 取出配置文件properties中的值@PropertySource首先要在配置类中 用@PropertySource 把对应的配置文件保存到运行的环境变量中person.properties的内容person.nickName=aaa通过${} 来取相应的值...

2021-01-09 16:33:23 921 2

原创 【Mysql】查询优化器

Mysql查询优化基于成本I/O成本CPU成本join连接原理基于成本Mysql执行一个查询可以有不同的执行方案,它会选择其中成本最低的方案.主要计算的就是:全表扫描成本针对每个索引计算不同的访问方式的成本成本其中包括 I/O成本和CPU成本InnoDB存储引擎规定 读取一个页面花费的成本默认是1.0(I/O成本),读取以及检测一条记录是否符合搜素条件的成本为0.2(CPU成本).如果是计算辅助索引成本 还会加上 回表成本(因为辅助索引的叶子结点存的是主键而不是真实数据).I/O成本

2021-01-08 23:05:54 219

空空如也

空空如也

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

TA关注的人

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