自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Uni-app 实现md5加密

参照博客写下这篇文章,记录自己走过的坑 uni-app如何进行md5加密

2022-12-12 21:52:47 7005

原创 说说老年代的垃圾回收算法?常用的垃圾回收器都有什么?

老年代对象过多,老年代的内存空间满了要进行垃圾回收【老年代回收算法】老年代中长期存活的对象过多,不适用年轻代的复制算法老年代中,垃圾对象没有那么多【标记-清理算法】该算法并不是太好,会出现内存碎片(假设两个对象被回收,分别空出1M+1M的空间,如果过来了一个2M的对象,就没地方放了,因为需要连续的内存空间)标记垃圾对象,并在老年代中清理掉导致没有连续可用的内存空间【老年代采用标记-压缩算法】将存活对象压缩到一片内存空间中,剩余都是连续可用的内存空间,解决了内存碎片的问题

2020-12-22 20:33:07 2416

原创 说说JVM的年轻代垃圾回收算法?对象什么时候转移到老年代?

【STW】stop the world,停止JVM里的工作线程的运行,然后扫描所有对象,判断可回收和不可回收【YGC采用的复制算法】(1)第一次YGC,把Eden中存活的对象,复制到S1区(对象迁移、对象复制),然后清空Eden区(2)下一次YGC,把Eden+S1中存活的对象复制到S2中,清空Eden+S1(3)下一次YGC,把Eden+S2中存活的对象复制到S1中,清空Eden+S2(4)循环【对象移动到老年代】Spring容器引用的对象,会长期存活长期存活的对象(15次

2020-12-22 20:31:38 736 2

原创 说说JVM在哪些情况下会触发垃圾回收可以吗?

JVM内存是有限的,JVM中有个内存分代堆内存:年轻代+老年代,统称为堆,可设置大小年轻代分为三块:年轻代、S1区、S2区(survivor区)默认情况下,新生代:S1:S2比例是8:1:1假设年轻代2个G,那么实际上分为1.6G/0.2G/0.2G 新生代/年轻代(Eden区)1.6G S1区 0.2G S2区 0.2G 2G老年代对象一开始是放在年轻代中,如果eden区满了,会出Y...

2020-12-22 20:30:09 1233

原创 你知道JVM是如何运行起来的吗?我们的对象是如何分配的?

一个类里包含一个main方法,执行main方法,此时会自动创建一个JVM进程,会默认有一个main线程,这个main线程就负责这个main方法的代码,进而创建各种对象Tomcat,类都会加载到JVM中,spring容器会将我们的类实例化成bean,有工作线程会来执行我们bean实力对象里的方法和代码,进而会创建其他的各种类,实现业务逻辑(1)Tomcat有个类加载器,会将我们自己写的系统中的类加载到metaspace元数据区(2)Tomcat启动会去启动spring容器(3)spring容器

2020-12-22 20:25:15 217

原创 JVM中有哪几块内存区域?Java8之后对内存分代做了什么改进?

堆内存:存放对象,所有线程均可使用栈内存:工作线程自己独有的永久代:自己写的类加载的地方,存放一些常量池、类信息Java8内存分代的改进【永久代】改叫【metaspace元空间】,将常量池存放在堆内存中,类信息存放在metaspace元空间...

2020-12-22 20:23:05 676 2

原创 能画一张图说说Spring Cloud的核心架构吗?

spring cloud用于开发分布式系统,将系统拆分成很多子系统,子系统互相之间进行请求和调用eureka、ribbon、feign、zuul、hystrix、链路追踪、其他组件,后面三个主要服务与分布式系统,hystrix可以看到流量,qps、响应延迟之类的前端发生请求----》网关系统Zuul----》转发请求给后台服务----》后台服务返回json数据----》网关系统Zuul转发给前端工程Tomcat启动JVM进程(后台服务)----》调用其他服务服务注册中心eureka:其他..

2020-12-14 22:54:14 136

原创 能画一张图说Spring Web MVC的核心架构吗?

核心:Servlet(1)服务启动时,将Dispatcherservlet注入到Tomcat中(DispatcherServlet:分发器,又叫前端控制器)(2)Tomcat的工作线程收到http请求后,将请求转发给SpringMVC的DispatcherServlet(3)查找对应Controller:DispatcherServlet查找@Controller注解的Controller,通过@RequestMapping注解来查找对应URL的Controller(4)查找当前Contro

2020-12-14 22:52:51 144

原创 能说说Spring中都使用了哪些设计模式吗?

常用设计模式:工厂模式、单例模式、代理模式spring ioc核心的设计模式的思想,就是工厂模式。spring本身就是一个工厂,把所有的bean实例都给放在了spring容器里(大工厂),如果你要使用bean,就找spring容器就可以了,你自己不用创建对象了1.工厂模式将对象的创建过程放在一个Factory工厂类里,如果要使用的话,则通过该工厂类来直接获取public class MyController{ private MyService myService = MySe

2020-12-14 22:51:12 209

原创 能画一张图说说Spring的核心架构吗?(Spring生命周期)

创建bean对象实例(反射技术),还包括对应bean之间的依赖关系(依赖注入)创建动态代理(动态代理技术JDK、cglib)spring生命周期(1)实例化Bean向容器请求一个未初始化的bean时,或是初始化bean的时候需要注入另外一个尚未初始化的依赖时,容器会调用creatBean进行实例化对于ApplicationContext容器,当容器启动结束后,会通过获取BeanDefinition对象中的信息,实例化所有的bean(2)设置对象属性(依赖注入)看看这个Bean依赖

2020-12-14 22:49:58 193 1

原创 能画一张图说说SpringBoot的核心架构吗?

Tomcat启动了,他就会接收http请求,转发给spring mvc框架,调用controller -> service -> dao -> mybatis(sql语句)核心功能:自动装配(1)springboot整合了常用的框架,然后实现了自动装配,进而简化spring繁琐的xml配置(2)springboot内嵌了一个web服务器,运行main方法时可以直接启动Tomcat,一定程度上简化了环境的部署...

2020-12-14 22:48:00 346

原创 Spring的事务实现原理是什么?能聊聊你对事务传播机制的理解吗?

事务的实现原理加一个@Transactional注解,此时spring会使用AOP思想,对你的这个方法在执行之前,先去开启事务,执行完毕之后,根据你方法是否报错,来决定回滚还是提交事务事务传播机制一个加了@Transactional注解的方法,调用另外一个加了@Transactional注解的方法,这个事务是如何传播的?(1)Propagation.REQUIRED(默认值,不加的时候也默认为Required)常用如果调用我这个方法的时候,没有事务,则创建一个新的事务。如果已经有事务了,

2020-12-12 11:16:43 531

原创 能说说Spring中的Bean是线程安全的吗?

答案:绝不可能是线程安全的,不是线程安全的,也不绝对是线程不安全的Spring容器中的bean可以分为5个范围singleton:默认,每个容器中只有一个bean的实例 prototype:为每一个bean请求提供一个实例以下三种99.99%不用request:为每一个网络请求创建一个实例,在请求完成后,bean会失效并被垃圾回收器回收 session:确保每个session中有一个bean的实例,在session过期后,bean会随之消失 gloal-sessionTomcat中可能

2020-12-12 11:13:47 1400

原创 了解过cglib动态代理吗?他跟jdk动态代理的区别是什么?

动态代理常用的技术cglib(基于子类) jdk动态代理(基于接口)动态的创建一个代理类出来,创建这个代理类的实例对象,在这个里面引用你真正自己写的类,所有的方法的调用,都是先走代理类的对象,他负责做一些代码上的增强,再去调用你写的那个类spring里使用aop,比如说你对一批类和他们的方法做了一个切面,定义好了要在这些类的方法里增强的代码,spring必然要对那些类生成动态代理,在动态代理中去执行你定义的一些增强代码如果你的类是实现了某个接口的,spring aop会使用jdk动态代理,.

2020-12-12 11:08:14 218 1

原创 说说你对Spring的AOP机制的理解可以吗?

AOP是面向切面编程( Aspect)简单的说就是把我们重复的代码抽取出来,在需要执行的时候,使用动态代理技术,在不修改源码的基础上,对我们已有的方法进行增强AOP的作用和优势作用:在程序运行期间,不修改源码对已有方法进行增强。优势:减少重复代码,提高开发效率,维护方便AOP的实现方式:使用动态代理技术事务MySQL、数据库里都提供一个事务机制,我们如果开启一个事务,在这个事务里执行多条增删改的sql语句,这个过程中,如果任何一个sql语句失败了,会导致这个事务的回滚,把其.

2020-12-12 11:05:15 266 1

原创 说说你对Spring的IOC机制的理解可以吗?

如果没有springIOC的情况下,写一套系统:Tomcat+Servlet其中调用impl的时候,通过new来创建对象(程序主动创建依赖)每次都需要new一个,导致耦合度太高,如果后期变动、更换impl的时候,需要改动大量代码并且重新测试IOC控制反转、依赖注入:通过xml配置、自动注入的方式进行依赖注入(marven引入一些spring框架的依赖)这时,当Tomcat启动时,会启动一个Spring容器,添加注解的类会交由Spring进行创建实例对象,包括对象与对象之间的引...

2020-12-12 11:02:58 268

原创 【面试题】volatile底层是如何基于内存屏障保证可见性和有序性的?

volatile底层原理,如何实现保证可见性的呢?如何实现保证有序性的呢?volatile+原子性:不能保证原子性,虽说有些极端特殊的情况下有保证原子性的效果极端场景:oracle、64位的long的数字进行操作时【面试题】问volatile底层、java内存模型、问volatile是如何保证可见性的,缓存一致性协议,追问,volatile之后,具体是发送了什么指令去实现什么效果?(1)#lock前缀指令(记住)、嗅探机制MESI缓存一致性协议对volatile修饰的变量,执行写..

2020-12-08 15:05:25 949

原创 【面试题】你知道指令重排以及happens-before原则是什么吗?

happens-before原则,一定程度上避免指令重排编译器、指令器可能对代码重排序、乱排、要守一定的规则,happens-before原则。只要符合happens-before的原则,那么就不能胡乱重排序,如果不符合这个规则,那么就可以自己排序。happens-before八大原则单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。 锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock

2020-12-08 15:03:17 519

原创 【面试题】能从底层角度聊聊volatile关键字的原理吗?

如果面试官上来直接问volatile,那么应该先从内存模型开始讲,然后谈原子性、可见性、有序性的理解,最后再讲volatile关键字的原理volatile关键字是用来解决可见性和有序性volatile用途:(1)保证内存可见性 (2)禁止指令重排volatile会在线程1执行data++之后将值设置会工作内存并写到主内存中的同时,将其他线程的工作缓存中data的值设置为失效。当线程在执行下次操作的时候,发现工作内存中的值失效了,回去主内存中再次读取【评论区】1、可见性是指,下次使用的时候

2020-12-08 15:00:43 159

原创 【面试题】你知道Java内存模型中的原子性、有序性、可见性是什么吗?

连环炮:Java内存模型--》原子性、可见性、有序性--》volatile--》happens-before/内存屏障并发编程过程中,可能会产生的三类问题:1.可见性线程1 run代码:data++线程2 run代码:while(data == 0){sleep(100);}没有可见性:一个线程已经更新了data,另外一个线程看不见一个线程做data++操作,另外一个线程对data进行读取并判断操作。当线程1执行之前(1)到(6)操作,线程2已经获取到主内存中data的数据。在线

2020-12-08 14:59:38 243

原创 【面试题】谈谈你对内存模型的理解可以吗?

8个指令:read/write、load/store、use、assign、lock/unlock read 将主存中的数据读取到CPU的高速缓存cache中 write 将CPU的cache中数据写回到主存中 load 将CPU的高速缓存cache中数据加载到JVM的寄存器中 store 将JVM寄存器中的数据写入CPU的cache中

2020-12-08 14:52:13 146

原创 【面试题】如果线上机器突然宕机,线程池的阻塞队列中的请求怎么办?

必然导致线程池中积压的任务会丢失本问题主要考察如何解决线程池中任务丢失的问题,要想办法把任务信息入库如果要提交一个任务到线程池里去,在提交之前,可以将当前任务信息插入数据库,更新他的状态:未提交、已提交、已完成。提交成功后,更新他的状态为已提交状态。系统重启,后台线程去扫描数据库里的未提交和已提交状态的任务,可以把任务信息读出来,重提交到线程池里,继续进行执行【评论区】1、因为请求数据都在内存中的,因此宕机就会丢失,但是我们可以记录对应的执行状态,然后针对不同类型的请求,去做幂等或者去重

2020-12-07 21:52:06 1636

原创 【面试题】你知道如果线程池的队列满了之后,会发生什么事情吗?

本问题主要考察线程池工作原理有界队列,可以避免内存溢出【corePoolSize】核心线程数设置为10【maximumPoolSize】最大线程数,设置为Integer.MAX_VALUE 21亿【queue】队列设置为有界队列ArrayBlockQueue(200)如果瞬间任务特别多,你可以无限制的不停地创建额外的线程出来,一台机器上可能有很多很多很多线程,每个线程都有自己的栈内存,占用一定的内存资源,会导致内存资源耗尽,系统也会崩溃。即使内存没有崩溃,也会导致机器的cpu loa

2020-12-07 21:50:24 3210

原创 【面试题】如果在线程中使用无界阻塞队列会发生什么问题?

另外一种问法:在远程服务异常的情况下,使用无界阻塞队列,是否会导致内存飙升?调用超时,导致队列中任务积压,队列越来越大,必然会导致内存飙升,还会导致内存溢出OOM本问题主要考察线程池工作原理...

2020-12-07 21:48:27 517

原创 【面试题】那你再说说线程池的核心配置参数都是干什么的?平时我们应该怎么用?

ThreadPoolExecutor(int corePoolSize, // 1 int maximumPoolSize, // 2 long keepAliveTime, // 3 TimeUnit unit, // 4 BlockingQueue<Runnable> workQueue, // 5 ThreadFactory.

2020-12-07 21:45:53 407

原创 【面试题】说说线程池的底层工作原理可以吗?

系统不可能无限创建很多的线程,会构建一个线程池,有一定数量的线程,让他们执行各种各样的任务,线程执行完任务之后,不会销毁自己,继续等待执行下一个任务。频繁的创建线程、销毁线程,会导致开销浪费ExecutorService threadPool = Executors.newFixedThreadPool(10);//10表示核心线程池数,corePoolSizethreadPool.submit(new Callable(){ public void run(){

2020-12-07 21:43:12 257

原创 【面试题】你对JDK中的AQS理解吗?AQS的实现原理是什么?

ReentrantLockstate变量----》CAS----》失败后进入等待队列----》释放锁后唤醒默认非公平锁,公平锁需将fair设置为truesynchronized和ReentrantLock的区别 synchronized ReentrantLock 系统自动加锁 手动加锁 synchronized CAS 无 可tryL

2020-12-06 13:52:11 368

原创 【面试题】ConcurrentHashMap实现线程安全的底层原理到底是什么?

JDK1.7以及之前的版本,多个数组,分段加锁,一个数组一个锁JDK1.8及以后的版本,优化细粒度,整合为一个数组,对数组中每个元素进行CAS,如果CAS失败了说明当前有人了,此时synchronized对数组元素加锁,使用链表+红黑树进行处理,对数组每个元素加锁。目前较多情况下,多线程要同时读写一个HashMap原始用法HashMap map = new HashMap();synchronized(map){ map.put("xxxx","yyyy");}如果线程

2020-12-06 13:47:44 442 1

原创 【面试题】能聊聊你对CAS的理解以及其底层实现原理可以吗?

当多个线程要访问同一个数据时,包括取值、询问、修改时,必然会出现多线程并发安全问题public class MyObject{ int i = 0; public synchronized void increment(){ //同一时间,只有一个线程可以进入当前方法 //在一个对象实例的方法上加synchronized i++; }}调用:MyObject mo = new MyObject();mo.increm

2020-12-06 13:44:26 888

原创 【面试题】说说synchronized关键字的底层原理是什么?

synchronized:内存屏障、CPU硬件级别的原理,原子性、可见性、有序性、指令重排、偏向锁等等用法: 可以对对象加锁,也可以对类加锁synchronized(myObject){ //一堆代码 synchronized(myObject){ //一堆代码 }}synchronized(otherObject.class){ //一堆代码}synchronized该关键字在编译成class文件后可以看到对应的语句是mo...

2020-12-06 13:39:56 1412

原创 【面试题】说说HashMap是如何进行扩容的?

HashMap扩容:两倍扩容,底层为数组,当数组满了之后,会自动扩容。扩容:扩大数组长度,对原数组进行rehash操作,把原数组copy到新数组中问题:假设16数组中[<>]同一个位置存放了多对key-value,当扩容为32位时,其中某对或多对key-value发生了位置的变动。扩容后,要进行rehash重新将hash值与n-1进行与运算。如下数组长度=16n-1 0000 0000 0000 0000 0000 0000 0000 1111hash1 1111 111

2020-12-05 15:07:27 6072

原创 【面试题】HashMap如何解决hash碰撞的问题?

hash冲突问题解决方案:链表O(n)+红黑树O(logn)正常一个位置放一对key-value,冲突后存放两对或多对key-value[<>]数组中这个位置会挂一个链表。上面为本问题最简单的回答。继续问:这种挂链表的方式假设链表很长,会导致便利链表性能较差,达到时间复杂度O(n)做了个优化:如果链表长度达到一定长度后,链表会转化为红黑树。使用红黑树的好处是,当遍历红黑树的时候,时间复杂度变为O(logn),性能较高要答出两点:(1)出现hash冲突的时候,会在这

2020-12-05 15:05:11 2413 1

原创 【面试题】JDK1.8中对hash算法和寻址算法是如何优化的?

hash算法优化 JDK1.8中源码如下:static final int hash(Object key){ int h; return (key == null)?0:(h == key.hashCode())^(h>>>16);}hashcodeyou右移16位并做异或操作异或:相同为0,不同为1假设有哦个key的hash值如下【原hash值】1111 1111 1111 1111 1111 1010 0111 1100【右移1...

2020-12-05 15:02:46 403

原创 【面试题】HashMap底层数据结构是什么?

核心:底层数据结构是数组简单原理描述:数组有固定长度,对key值计算出一个hash值,根据这个hash值对数组长度进行取模,会定位到数组里的一个元素中去。假设数组长度为16,对其取模后必然小于16,获得index。根据获得的index将值放在对应的位置。[<>,<>,<>,,<>,<>,<>,<>,<>,<>,<>,<>,<>,<>,&l

2020-12-05 15:00:46 753

原创 【记录】数据库删除表空间实际操作

因为本地oracle数据库使用时间过长,导致一个50G的盘满了,因此想删除原表空间并重新生成表空间,以方便进行导入数据库的操作。1.首先查询所有数据库的用户select * from dbs_users;2.删除所有自己创建的用户drop user 用户名称 cascade;--删除用户,及级联关系也删除掉(如果是小写用户的话,需要加"",即drop user "用户名称" cascade;)3.报错:ORA-01940: cannot drop a user that is cur

2020-05-20 14:17:42 578

原创 【设计模式之禅】6大原则

单一职责原则(SRP:single Responsibility Principle) 应该有且只有一个原因引起类的变更(实际项目中很难做到) 优点: 里氏替换原则(LSP: liskov Substitution Principle) 1.子类必须实现父类的方法 如果子类不能完整地实现父类的方法...

2020-04-12 14:22:44 167

原创 【面试题】两个线程交替打印1A2B3C....26Z(多种方法实现)

1.LockSupportpackage com.example.demo;import java.util.concurrent.locks.LockSupport;/** * 交替打印1A2B3C......26Z */public class Thread_LockSupport extends Thread { static Thread t1 = null, ...

2020-03-10 19:59:00 3082 3

原创 切换JDK版本不成功的问题

问题描述:安装了JDK13.0,再环境变量中设置完新的JAVA_HOME(即把原来的JDK1.7版本替换掉),使用cmd查询Java版本,仍旧是JDK1.7解决办法:(1)找到C:\Windows\System32中如下三个文件,删除(2)找到JDK13.0目录下的三个文件(如下图),粘贴复制到C:\Windows\System32目录下(3)关闭原来的cmd,...

2020-03-05 21:29:08 888

原创 【JDK13 没有JRE的问题】+【错误: C:\Program Files\Java\jdk-13.0.1\jre】

网上下载安装了JDK13,结果安装完了发现没有自动安装jre1.右击cmd以管理员身份打开(!!一定要以管理员身份打开)2.进入jdk13的安装路径,我这里是C:\Program Files\Java\jdk-13.0.13.接着输入【bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre】括号...

2020-03-05 21:12:58 8251 7

原创 Description Resource Path Location Type Failure to transfer org.apache.maven.plugins:maven-source-pl

maven项目更新报错:Description Resource Path Location Type Failure to transfer XXXX【步骤1】window在cmd下输入:(1)cd %userprofile%\.m2\repository(2)for /r %i in (*.lastUpdated) do del %i【步骤2】marven update...

2019-08-07 17:14:11 5627

空空如也

空空如也

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

TA关注的人

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