自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot 是如何实现自动装配的?

@SpringBootApplication启动类注解@EnableAutoConfiguration:实现自动装配的核心注解AutoConfigurationImportSelector:加载自动装配类@EnableAutoConfiguration:实现自动装配的核心注解EnableAutoConfiguration 只是一个简单地注解,自动装配核心功能的实现实际是通过 AutoConfigurationImportSelector类。@Target({ElementType.TYPE})@Re

2021-02-23 17:23:43 723 1

原创 逃逸分析简单概述

逃逸分析逃逸分析基本行为逃逸分析实例发生逃逸的几种情况逃逸分析基本行为分析对象动态作用域:当一个对象在方法中被定义后,对象只在方法内部调用,则认为没有发生逃逸。没有发生逃逸的对象,则可以分配到栈上,随着方法执行的结束,栈空间就被移出。当一个对象在方法中被定义后,他被外部方法所引用,则认为发生了逃逸。逃逸分析实例当其他方法调用该方法时,就返回sb对象,此时sb对象就发生了逃逸。避免sb对象发生逃逸的方法:发生逃逸的几种情况new的对象是否有可能被方法外部调用为成员属性赋值引用成

2021-02-22 09:08:44 289

原创 Volatile底层原理剖析

Volatile底层原理剖析JMMVolatile缓存可见性实现原理指令重排JMMVolatile缓存可见性实现原理理解:lock前缀指令会锁定这块内存区域的缓存,当执行引擎修改将数据修改后并assign赋值到线程的工作内存时,会被迅速的加载到共享内存,即使修改数据后还有其他的业务,不用等待加载其他业务就直接将数据传回主内存,主要是一个时效性。在加载到主内存的过程中会经过主线(缓存一致性),其他线程监听着主线,如果监听到感兴趣的数据写回共享内存操作就会引起数据无效协议,即其他线程重新加载主存中的

2021-02-16 09:35:17 245

原创 MQ如何保证消息不丢失?

MQ如何保证消息不丢失?消息队列生产者存储消息消费者消息队列生产者生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。confirm机制:一旦消息投递到队列,队列则会向生产者发送一个通知,如果设置了消息持久化到磁盘,则会等待消息持久化到磁盘之后再发送通知。生产者在发送完消息后不会等待回应,所以confirm机制性能相对比事物机制高。存储消息消息持久化RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久

2021-02-15 16:19:10 508

原创 JUC常见并发工具类

JUC常见并发工具类CountDownLatch (倒计时器)CountDownLatch 的两种典型用法CountDownLatch 的不足CyclicBarrier(循环栅栏)CyclicBarrier 的应用场景CyclicBarrier源码分析Semaphore(信号量)-允许多个线程同时访问CountDownLatch (倒计时器)CountDownLatch 是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用 countDown() 方法时,其实使用了try

2021-02-14 20:21:32 211

原创 ThreadLocal关键字解析

ThreadLocal关键字解析ThreadLocal脑图ThreadLocal的数据结构ThreadLocal脑图ThreadLocal的数据结构

2021-02-14 16:39:25 592 1

原创 JVM性能监控及诊断工具——命令行篇

JVM性能监控与调优jps:查看正在运行的java进程jstat:查看JVM统计信息类装载interval和count参数-t和-h参数option参数jinfo:实时查看和修改JVM配置参数jmap:导出内存映射文件和内存使用情况导出内存映像文件jps:查看正在运行的java进程jstat:查看JVM统计信息jstat用于监视虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集等运行数据。常用于检测垃圾回收问题以及内存泄露问题。类装载jastat -cl

2021-02-14 12:52:33 1575 3

原创 关于JVM调优的一些参数设置

关于JVM调优的一些知识调整最大堆内存和最小堆内存调整新生代和老年代的比值调整Survivor区和Eden区的比值设置年轻代和老年代的大小调整最大堆内存和最小堆内存-Xmx –Xms:指定java堆最大值(默认值是物理内存的1/4(<1GB))和初始java堆最小值(默认值是物理内存的1/64(<1GB))默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于7

2021-02-12 15:36:45 284 1

原创 Redis分布式锁的实现

Redis分布式锁的实现分布式锁初级存在问题解决方案Redission解决方案优化Redission部署在主从、集群架构的问题分布式锁初级存在问题模拟场景:线程A进入到锁的业务区域,设置锁的存活时间为10s,但是线程A执行完业务的总时间需要15s,当10s过后线程A只执行一半锁就消失了,此时线程B就可以来获取锁了,当线程B加锁后,假设线程B的执行时间需要8s,但此时线程A还在接着运行,问题就在这里,当A执行完15s后,释放的锁是线程B加的锁,而线程B此时才运行了5s,还没有运行完毕,此时就会有线程C

2021-02-12 12:22:04 1634 10

原创 JVM面试题知识点整理

JVM面试题整理什么是TLAB什么是TLABTLAB: 为每一个线程预先在 Eden 区分配一块儿内存,JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,当对象大于 TLAB 中的剩余内存或 TLAB 的内存已用尽时,再采用上述的 CAS 进行内存分配...

2021-02-10 15:16:28 350

原创 类加载过程

类加载过程类加载过程加载验证准备解析初始化卸载类加载过程加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储结构转换为方法区的运行时数据结构在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口验证准备准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。对于该阶段有以下几点需要注意:这时候进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对

2021-02-10 15:08:07 108 4

原创 JVM 配置常用参数和GC调优

JVM 配置常用参数和GC调优JVM 配置常用参数常用 GC 调优策略GC 调优原则GC 调优目的GC 调优策略JVM 配置常用参数堆参数项目中常用配置常用 GC 调优策略GC 调优原则多数的 Java 应用不需要在服务器上进行 GC 优化; 多数导致 GC 问题的 Java 应用,都不是因为我们参数设置错误,而是代码问题; 在应用上线之前,先考虑将机器的 JVM 参数设置到最优(最适合); 减少创建对象的数量; 减少使用全局变量和大对象; GC 优化是到最后不得已才采用的手段; 在实际使用

2021-02-10 14:57:14 159

原创 JDK监控和故障总结

JDK监控和故障总结JDK 命令行工具检查线程死锁查看JVM参数JDK 命令行工具这些命令在 JDK 安装目录下的 bin 目录下:jps (JVM Process Status): 类似 UNIX 的 ps 命令。用户查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;jstat( JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;jinfo (Configuration Info for Java) :

2021-02-10 14:37:22 253

原创 线上服务的FGC问题排查

线上服务的FGC问题排查检查JVM配置观察老年代的内存变化通过jmap命令查看堆内存中的对象进一步dump堆内存文件进行分析检查JVM配置通过以下命令查看JVM的启动参数:ps aux | grep "applicationName=adsearch"可以看到堆内存为4G,新生代为2G,老年代也为2G,新生代采用ParNew收集器,老年代采用并发标记清除的CMS收集器,当老年代的内存占用率达到80%时会进行FGC。配置参数并没有什么问题。观察老年代的内存变化通过观察老年代的使用情况,可以看到:

2021-02-08 12:40:00 200 3

原创 RabbitMQ消息队列基础知识

@TOC为什么使用MQ?MQ的优点异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。RabbitMQ的工作模式一.simple模式(即最简单的收发模式)1.消息产生消息,将消息放入队列2.消息的消费者(consumer) 监听 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失

2021-02-08 09:23:29 189

原创 聊聊redis一些常用的知识点

Redis面试中常见的面试题redis的基本数据结构Redis缓存雪崩Redia缓存穿透Redis缓存击穿缓存不一致问题为什么是删除,而不是更新缓存?布隆过滤器Bloom Filter的缺点Redis持久化AOF 重写ReWrite触发机制是什么?RDB 和 AOF 各自有什么优缺点?Redis 4.0 混合持久化Redis主从复制主从复制主要的作用主从复制一些小细节哨兵模式判断主服务器是否下线了数据丢失情况Redis 集群Redis设置过期时间过期淘汰策略redis的基本数据结构Redis有哪些数据结

2021-02-07 22:36:42 366

原创 MySQL数据库全面剖析

MySQL知识点整理存储引擎索引B+树和其他数据结构的差距B+树索引哪些情况需要建索引?使用索引的注意事项存储引擎InnoDBInnoDB 是 MySQL 默认的事务型存储引擎,InnoDB 采用 MVCC 来支持高并发,并且实现了四个标准隔离级别(未提交读、提交读、可重复读、可串行化)。其默认级别时可重复读(REPEATABLE READ),在可重复读级别下,通过 MVCC + Next-Key Locking 防止幻读。MyISAM设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以

2021-02-06 22:45:11 501 2

原创 数据结构与算法——链表篇

链表类编程题反转链表反转链表升级版判断链表是否为回文链表环形链表反转链表反转链表这道算法题应该算是所有链表题的底层了,所以一定要理解掌握这道题下面展示一些 内联代码片。//判断链表head或head.next是否为空,为空返回链表head if(head == null || head.next == null){ return head; } //当前节点的前一个节点 ListNode pre = null;

2021-02-06 21:06:58 66

原创 线程池的7大参数和工作原理

线程池知识总结线程池到底考什么?为什么要使用线程池?如何去创建一个线程池?线程池的7大参数线程池饱和策略自己创建线程池怎样指定线程数?线程池的工作原理线程池到底考什么?为什么要使用线程池?这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程

2021-02-06 14:04:01 857

原创 最杂乱无章的一个知识点:锁

请聊一聊你对锁的理解???这个问题是我在面试中遇到过的问题,这问题我第一次听起来感觉很扯,因此锁可以作用在很多方面,分为很多不同种类的锁。所以说面试到这个问题的时候我不知道从何说起,是从数据库?还是从线程?还是…?杂乱无章分析之synchronized在聊synchronized之前,我就先跟大家聊一下我们Java对象的构成:在 JVM 中,对象在内存中分为三块区域:1.对象头Mark Word(标记字段):默认存储对象的HashCode,分代年龄和锁标志位信息。它会根据对象的状态复用自己的存储

2021-02-06 13:34:01 323

原创 我对乐观锁CAS的知识回顾

乐观锁每当提起乐观锁,都会被提起CAS。对于乐观锁,是系统一种比较乐观的状态,认为线程中运行时大概率不会产生资源竞争的情况,因此不会运行的时候就开始获取锁,只有等到有资源竞争的时候才会获取锁,Java中一般通过CAS机制来解决。书面上的话:比较并交换(Compare And Swap),主要是为了解决原子性问题,同时又不想利用重量级的锁。通俗的话说:如果想更新一个值,想看看该值是否等于某个值,如果等于则更新该值。我可以简单举一个例子:CAS主要是为了解决原子性问题,CAS为什么可以保证原子性呢?

2021-02-06 10:20:23 87

原创 Volatile关键字面试重灾区

Volatile关键字全家桶volatile的好兄弟JMM在面试中说起volatile我们就不得不说起JMM(Java内存模型),JMM描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量,存储到内存和从内存中读取变量这样的底层细节。JMM有以下规定:所有的共享变量都存储于主内存,这里所说的变量指的是实例变量和类变量,不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本。线程对变量

2021-02-06 10:00:57 144

原创 HashMap全家桶

HashMap全家桶HashMap存储结构HashMap为什么线程不安全?JDK1.7线程不安全一:扩容造成死循环分析过程JDK1.7线程不安全二:扩容造成数据丢失分析过程JDK1.8线程不安全:多线程数据覆盖问题解决HashMap多线程不安全问题的几种方法傻瓜式解决方法HashMap存储结构HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。每一个节点都会保存自身的hash、ke

2021-02-05 23:12:23 457

原创 SpringCloud微服务(H版&alibaba)Eureka

这里写自定义目录标题

2021-02-04 09:35:19 136

空空如也

空空如也

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

TA关注的人

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