自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ThreadLocal从变量副本的角度解决多线程并发安全问题

ThreadLocal从变量副本的角度解决多线程并发安全问题之前我们讲的高并发场景下的线程安全问题,可以使用Synchronized同步关键字、Lock手动加锁的方式去解决,什么轻量级锁、偏向锁、重量级锁、可重入锁等等,实际上本质都是控制线程,使得多个线程同步的去访问共享资源。之所以多线程存在线程安全问题,就是因为多个线程访问同一个共享资源导致的,多个线程之间属于竞争关系,很容易就会导致数据的不安全。我们说了加锁实际上保证了各个线程之间同步、有序的去访问共享资源,难道不加锁就没有办法解决多线程安全问题

2021-10-03 18:56:39 884

原创 【源码】走一遍源码弄清ArrayList容器的扩容机制

【源码】走一遍源码弄清ArrayList容器的扩容机制首先我们来看看ArraysList容器在整个Java集合框架中所处的位置由此可见ArrayList是Java集合框架中,两大派系中Collection接口的子接口List的实现类我们从源码入手可以看到ArrayList底层数据结构实际上是一个**Object类型的数组**,由于Object是所有类的父类,所以ArrayList集合可以存放任意类型的元素,并且存放的元素是有序的、可重复的、可随机访问的。接下来我们就以add()方法为突破口,来解

2021-10-01 16:00:23 569

原创 【源码】看一看Spring如何使用三级缓存解决循环依赖问题

【源码】看一看Spring如何使用三级缓存解决循环依赖问题我们之前文章讲Bean的创建过程中,提到了如果当前bean依赖的其它bean,就会调用getBean()方法把依赖的bean先创建出来可是你有没有想过,如果当前Bean依赖于另一个Bean,而另一个Bean又就形成了依赖于当前Bean,或者当前Bean依赖于自己,这样依赖关系形成了一个闭环。这就是我们这篇文章将要说的Bean的循环依赖问题!首先我们要明确Spring不是能够解决所有情况下的循环依赖问题的,只能解决:出现循环依赖的Bean

2021-09-28 22:18:19 717

原创 从Spring容器刷新过程中的创建Bean阶段来说说Bean的生命周期

从Spring容器刷新过程中的创建Bean阶段来说说Bean的生命周期我们所说的Bean的生命周期指的是从Bean的创建、初始化、使用Bean、销毁的整个过程。而IOC容器就是负责管理Bean的整个生命周期。实际上Bean的生命周期在容器启动的时候就已经开始了,严格来说,你可以认为容器启动时,从注解配置读取器读取标有注解的类,转换为BeanDefinition对象时,Bean的生命周期就已经开始了。打个比方,小宝宝的生命的起点,并不是说从出生落地开始算的,而是从妈妈肚子里面,基本上可以算是生命已经开始了。

2021-09-28 02:56:04 575

原创 【源码】走一遍refresh()方法的源码就能弄懂Spring容器的创建过程

【源码】走一遍refresh()方法的源码就能弄懂Spring容器的创建过程Spring框架的两大核心思想,一个是IOC控制反转,另一个就是AOP面向切面编程。而IOC控制反转指的是将创建对象的操作交给Spring容器来解决,容器同一对所有的对象进行管理,我们无需关心创建对象时,对象之间的依赖关系,只需要在使用对象时从容器中获取即可。要想从容器中获取对象来使用,那就必须首先创建出这个Spring容器,这篇文章就来从源码角度出发,来看看Spring容器的创建过程。创建Bean可以使用XML配置文件,也可以

2021-09-27 13:17:43 376

原创 Redis还可以干分布式锁的活儿

Redis还可以干分布式锁的活儿现在的业务开发一般都是分布式微服务,多个微服务之间要保证同一时刻,同一用户只能有一个请求被处理,为了防止关键业务出现数据冲突和并发错误。在只有一台服务器,单机的情况下,为了防止出现并发问题,你也许想到可以使用Synchronized同步关键字或者使用Lock手动加锁来防止高并发的线程安全问题,但是如果在分布式集群的情况下,多台服务器协同工作,再使用Synchronized同步关键字和Lock锁还能起作用吗?当然不能了,单机锁只能管控住自己这一台服务器,多台服务器之间,物理

2021-09-26 03:37:47 195

原创 讲一讲Redis Cluster分布式集群是如何保证可扩展的

讲一讲Redis Cluster分布式集群是如何保证可扩展的之前的文章我们讲了Redis的主从架构模式、Sentinel哨兵模式,这篇文章我们再来讲讲Redis Cluster分布式集群模式。不要搞混主从模式、Sentinel模式、Cluster集群模式,这三者的侧重点或者说作用是不相同的。主从架构模式主从模式主要实现数据备份、容灾恢复,以及通过主从复制实现读写分离,通常是一主多从的架构模式,主服务器用来写,从服务器用来读。主从架构模式侧重于支持高并发。Sentinel哨兵模式多个Sent

2021-09-25 22:48:23 381

原创 说一说Redis的Sentinel模式是如何保证服务器高可用的

说一说Redis的Sentinel模式是如何保证服务器高可用的我们之前文章说的Redis的主从架构模式实现了读写分离,支持了高并发的业务场景。主从模式也由单台Redis服务器变成了多台Redis服务器,服务器数量一多,当某服务器发生故障宕机的时候,可能就会影响到其它正在工作的服务器,然后产生连锁反应,进而使得整个系统崩溃。对于这种情况我们需要拿出一个方案,使得在某一台或者多台服务器宕机时,要保证不会影响到其它正常工作的服务器,继续维持整个系统正常运转。而Redis的哨兵模式就提供了高可用的解决方案!哨兵

2021-09-24 23:36:14 269 2

原创 从Redis主从架构模式角度说一说是如何支持高并发的

从Redis主从架构模式角度说一说是如何支持高并发的我们说Redis是基于内存操作的数据库,追求的是简单高效,实现了高性能的数据访问。单机Redis所能支持的QPS一般都在几万左右,一般不会超过10w+,但是,在有些实际业务中,像是秒杀、双十一,这些业务场景的QPS很有可能达到惊人的数字!所以说高并发场景下的单机Redis显得就有些吃力了,不用怕,Redis官方早就想到了高并发的场景,我们可以使用多个Redis实例,搭建主从架构模式来支撑高并发的场景。主从架构模式,也就说有一台Redis服务器做主机,多

2021-09-24 15:11:41 296

原创 Redis缓存常见问题——穿透、击穿、雪崩

Redis缓存常见问题——穿透、击穿、雪崩Redis最常用来做缓存,它是基于内存来操作数据的,当数据量过大时难免会遇到一些缓存问题。这篇文章就来说一说Redis常见的缓存问题。缓存穿透我们说当发送请求来查询某个数据时,首先会从Redis缓存中查询,如果缓存中有就直接返回,如果没有请求才会到数据库中查询。而缓存穿透指的就是当访问一个redis缓存和数据库都不存在的key时,此时这个请求就会直接到数据库中查询,但是数据库中也查不到任何数据,而且也没有办法写缓存。这样情况缓存相当于没起作用,当请求量过大时,

2021-09-23 14:45:17 492 1

原创 说一说Redis事务是否满足ACID以及WATCH监视命令的作用

说一说Redis事务是否满足ACID以及WATCH监视命令的作用MySQL关系型数据库InnoDB存储引擎支持事务,Redis这个非关系型数据库也同样实现了事务功能。Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务(transaction)功能。MULTI命令表示开始事务,之后可以输入多个命令,此时Redis并不会执行这些命令,而是将这些命令入队,当输入EXEC命令时表示执行事务,Redis会从队列中挨个取出命令来执行,执行完所有命令之后统一返回结果。DI

2021-09-23 02:44:45 398

原创 从内存淘汰策略和过期键删除来聊一聊Redis内存管理机制

从内存淘汰策略和过期键删除来聊一聊Redis内存管理机制我们说过Redis是基于内存操作的数据库,所有的数据保存在内存中,所以读写速度非常的快。既然数据都存放在内存中,内存毕竟有限,远远比不上磁盘的存储空间,所以如果不及时清理掉一部分没有用的数据,就会导致内存不足。这篇文章就来聊一聊Redis内存淘汰策略和过期键的删除。Redis是可以在redis.conf这个配置文件中设置最大占用内存的,如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB

2021-09-22 14:49:34 270

原创 谈一谈Redis持久化这个容灾恢复机制

谈一谈Redis持久化这个容灾恢复机制服务器“闹情绪”宕机可以说是非常常见的情况了,要想“哄好”服务器,Redis是如何保证服务器挂掉重启之后,能够恢复数据的呢?这就是本篇文章要讲的Redis持久化机制。所谓的持久化就是将内存中的数据写入到磁盘当中去,这样一旦服务器发生故障宕机,重启服务器之后可以从磁盘中读取之前的数据来恢复数据。Redis不同于Memcached的很重要一点就是Redis 支持持久化,而且支持两种不同的持久化操作,RDB方式和AOF方式。谁敢说我家的服务器绝对不会宕机?所以持久化机制对

2021-09-21 16:28:29 455

原创 从处理请求的核心流程谈一谈Redis到底是单线程还是多线程

从处理请求的核心流程谈一谈Redis到底是单线程还是多线程随着Redis版本的不断更新,Redis在处理请求方面也在不断的优化,由单线程的概念逐渐引入了多线程的概念。那么Redis到底是单线程还是多线程呢?在Redis 4.0版本之前,Redis完全是单线程,没有引入多线程这个概念。因为Redis是完全是基于内存操作的,通常情况下CPU不会是redis的瓶颈,于是就采用单线程模型处理请求,如果使用多线程的话,反而会变得更复杂,同时还涉及到了多线程的上下文切换,带来了额外的性能消耗。所以,Redis读写速

2021-09-21 10:15:28 529

原创 从Redis底层的数据结构来说说为什么读写数据这么快

从Redis底层的数据结构来说说为什么读写数据这么快Redis是一个C语言编写的非关系型数据库,与MySQL关系型数据库不同的是,Redis的数据是存储在内存中的,所以说使用Redis读写数据非常的快!因此Redis常用来的做缓存。当然,之所以Redis读写数据这么快,出了它的数据存储在内存中这个原因以外,还与它的底层数据结构有关!这篇文章就从Redis底层数据结构来分析为什么读写数据这么快。String类型可以说我们平常操作最多的数据类型就是字符串了,对于String类型我们最常用的命令就是set和

2021-09-20 17:34:35 823 3

原创 说一说JVM类加载子系统使用的各种类加载器

说一说JVM类加载子系统使用的各种类加载器之前我们在《从JVM层面谈一谈类的加载过程》这篇文章中,详细的介绍了类加载的过程。我们说一个类,从class字节码二进制数据流转化为类模板加载到系统内存中,这一过程是由类加载子系统实现的,确切的说是由类加载子系统中的各种类加载器实现的。这篇文章就来谈一谈都有哪些类加载器以及它们的作用都是什么。所有的类都是由ClassLoader进行加载的,Classloader负责通过各种方式将类信息的二进制数据流读入到JVM内部的方法区,形成一个类模板数据结构,进而转换为一个

2021-09-18 21:55:33 405

原创 从JVM层面谈一谈类的加载过程

从JVM层面谈一谈类的加载过程之前在Java内存区域详解(万字总结!一篇入魂!点赞收藏!)这篇文章中详细讲解了Java内存区域,我们下面再放一张图,回顾一下Java内存区域都划分为了哪几部分通过JVM整体架构来看,Java内存区域,也就是运行时数据区,是JVM的核心。我们知道Java内存区域是用来存放程序运行过程中产生的数据的区域,如果我们要向将Java程序运行起来,首先必须把编译出来class文件加载到内存中,而负责加载的就是JVM中的类加载子系统,它负责将编译好的class文件加载到内存中。这篇文

2021-09-17 17:24:55 206

原创 从ThreadPoolExecutor源码着手来谈一谈并发中使用的线程池

从ThreadPoolExecutor源码着手来谈一谈并发中使用的线程池线程池,关键在于一个**“池”字,你可以联想一下数据库连接池、字符串常量池等等,都是实际上都是利用池化技术**来减少每次获取资源的消耗,提高对资源的利用率。在高并发多线程的场景下,某个时间段内肯定不只有一个线程在工作,而是有大量的线程同时在执行任务。当面对大量的请求等待处理时,我们不可能一个一个的创建出线程,然后分配请求任务让这个线程去处理,这样效率也太低了。怎么解决呢?我们想如果说事先创建好了很多线程,随时待命,一旦有请求发送过来,

2021-09-16 17:22:25 217

原创 从Java内存模型的角度来解读volatile关键字

从Java内存模型的角度来解读volatile关键字在之前关于高并发线程同步控制的文章中,我们讲了Synchronized关键字的作用以及底层JVM的实现原理,也讲了另一把ReentrantLock可重入锁的作用及底层源码的实现。而为了保证多线程情况下线程之间的同步,除了加锁以外,还可以使用volatile关键字,它是JVM提供的一个轻量级的同步机制。首先我们要明确并发编程的3个重要特性:原子性一次操作或者多次操作,要么所有的操作全部都执行并且不会受到任何外界因素的干扰而中断,要么就全部都不执行

2021-09-14 20:26:50 216

原创 从AQS切入谈一谈不逊色于Synchronized的ReentrantLock可重入锁

从AQS切入谈一谈不逊色于Synchronized的ReentrantLock可重入锁之前在《结合JVM深入谈一谈Synchronized关键字的神奇之处》这篇文章中,提到了Synchronized和ReentrantLock的区别,Synchronized是依赖于JVM实现的,是JVM层面的锁,并且它的优化也是从JVM底层进行优化的。而ReentrantLock可重入锁是API层面的,ReentrantLock这个类实现了Lock这个接口,需要我们使用lock()和unlock()方法手动的进行加锁和释

2021-09-13 20:53:25 4017

原创 结合JVM深入谈一谈Synchronized关键字的神奇之处

结合JVM深入谈一谈Synchronized关键字的神奇之处今天就来聊一聊Synchronized这个关键字。一提到Synchronized这个关键字,可能你马上联想到同步、加锁、多线程并发等等这些词语,仿佛感觉Synchronized关键字出镜率很高,感觉哪里都有它的身影。其实,Synchronized在很早的JDK版本中就已经存在了,可以说是元老级别的存在,主要解决的是多线程之间同步的访问资源,被Synchronized关键字修饰的方法或者代码块在任意时刻只能有一个线程执行。在早期的JDK版本中,S

2021-09-11 19:49:35 222

原创 Java垃圾回收机制详解(万字总结!一篇入魂!)

Java垃圾回收机制详解之前在《Java内存区域详解》这篇文章中,详细介绍了JVM内存区域的划分,以及创建对象时内存的分配情况。Java的自动内存管理机制,除了自动申请内存还会自动释放内存,这篇文章就来说一说Java内存回收机制。首先我们要明确几点,问什么要回收内存?哪些内存是需要回收的?什么时候回收?应该怎样回收?(Why?What?When?How?)举个例子,垃圾桶,你平时制造出来的垃圾都随手扔到了垃圾桶里,这垃圾桶就好比堆空间,你扔进去一个垃圾,就好比在堆空间自动申请的一块内存来存放这个垃圾,

2021-09-08 10:56:33 2581

原创 扒一扒HashMap和ConcurrentHashMap的本质(万字总结!一篇入魂!)

扒一扒HashMap和ConcurrentHashMap的本质Java集合,或者说Java容器,可以分为两大派系,一类是实现了Collection接口的容器,另一类是实现了Map接口的容器。这篇文章要将的就是实现了Map接口的HashMap集合。先来看一下Map接口整体的框架HashMapHashMap集合是线程不安全的,在JDK 8 之前HashMap是由数组+链表组成的,数组是HashMap的主体部分,链表则是主要为了解决hash冲突而存在的,主要是采用拉链法解决冲突。到了JDK 8及以后

2021-09-06 10:10:02 257

原创 Java内存区域详解(万字总结!一篇入魂!点赞收藏!)

Java内存区域详解JVM自动内存管理机制,可以使得不像C/C++语言那样,需要手动的申请和释放内存,Java将内存的申请和释放完全交给JVM来管理,所以并不容易出现内存泄漏和内存溢出的问题。但是并不代表不会发生,所以我们必须要熟悉JVM,要熟悉JVM自动内存管理的机制,这样我们在发生内存问题时,才知道该如何下手去解决。JVM在运行时会把管理的内存划分为不同的数据区域,包括线程共享的堆、方法区,以及线程私有的虚拟机栈、本地方法栈、程序计数器。一共五大部分。但是在JDK 8前后,内存区域的划分出现了变动,

2021-09-04 15:27:44 1091

原创 JMM详解与volatile关键字

一、Java内存模型——JMMJMM本身是一种抽象的概念,并不真实存在,它描述的是一组规则或者规范,就想JVM一样通过JMM规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式JMM的可见性、原子性、有序性使得线程安全得到保证其中JMM对同步做出了规定:线程加锁前,必须读取主内存的最新值到自己的工作内存线程解锁前,必须把共享变量的值刷新回主内存加锁解锁必须是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存,工作内存是每个线

2021-08-10 15:45:53 221

原创 字符串方法intern()详解

一、intern()方法运行时常量池是方法区的一部分,在JDK 8的时候,方法区概念的落地实现由永久代变成了元空间intern()方法的源代码如下图所示intern()方法是一个本地方法调用该方法时,如果字符串常量池中已经存在一个等于此String对象的字符串,就直接从常量池中返回这个字符串对象的引用如果调用该方法的这个字符串对象,目前字符串常量池中还并不存在这个字符串对象,也就是说这个字符串对象是首次出现的,那么就新建并添加这个字符串对象到字符串常量池中,并返回新建的字符串对象的引用二、

2021-08-09 10:59:47 7929 3

原创 【Go语言实现JVM】根据Java命令编写命令行工具

一、Java应用程序运行命令Java应用程序需要有一个入口,而这个入口就是main()方法,包含main()方法的这个Java类叫作主类。JVM规范并没有规定哪个类是主类,所以我们可以自己创建一个主类,只要包含main()方法即可。虽然我们可以自定义一个主类,但是如何告诉JVM哪个类是主类呢?实际上JVM是通过java命令来加载并启动主类,主类名可以由命令行参数指定我们在cmd命令窗口执行java命令从回显中可以看到java命令的具体用法java [-options] class [args

2021-08-01 21:15:08 1693 1

原创 从字节码角度分析i++与++i以及i+=1与i=i+1运算操作

变量的自增操作,如i++++ii+=1i=i++这些自增操作的算术运算可能计算的最后结果是一样,仅从代码层面很难看出它们的异同。下面将从字节码指令的角度去分析这些操作的不同之处。i++与++i的区别如果只是进行变量的自增的运算,不涉及赋值操作,那么i++和++i在字节码指令层面上是执行相同的指令可以看出i++与++i的字节码指令是一样的,都是先将操作数10压入操作数栈,然后保存到局部变量表索引为1的位置,也就是保存变量i的位置,然后将局部变量表索引为1的位置的变量的值加1。但是如果

2021-07-29 18:10:07 2765

原创 运行时数据区——方法区

一、栈、堆、方法区的交互关系变量名存放在栈帧的局部变量表中,创建出来的对象实例数据存放在堆中,对象类型的具体数据则存放在方法区。同属对象实例中维护一个指向对象类型的指针,用于获取该对象实例的类型数据。二、方法区方法区在逻辑上是属于堆的一部分,但是方法区可以看作是一块独立于Java堆的内存空间方法区与堆一样,是各个线程共享的内存区域方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展方法区的大

2021-07-22 10:14:09 195

原创 运行时数据区——堆

一、堆的概述一个进程对应一个JVM实例,也就是一个进程对应一个运行时数据区。一个进程又包含多个线程,这些线程共享了方法区和堆,但是每个线程都有各自的程序计数器、本地方法栈和虚拟机栈。一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,是JVM管理的最大一块内存空间堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB),所以堆空间不一定是所有线程

2021-07-20 11:31:27 348

原创 运行时数据区——本地方法栈

本地方法栈Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用本地方法栈,也是线程私有的。允许被实现成固定或者是可动态扩展的内存大小。如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么java虚拟机将会抛出一个OutOfMemoryError异常。本地方法是

2021-07-19 08:54:48 99

原创 运行时数据区——Java虚拟机栈

一、Java虚拟机栈每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,每一个栈帧对于一个方法Java虚拟机栈是线程私有的Java虚拟机栈的生命周期和线程一致虚拟机栈主要管理程序的运行,保存方法的局部变量、部分结果,并参与方法的调用和返回二、栈的优势栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器JVM操作栈,当方法执行时,执行入栈操作,当方法结束时,执行出栈操作栈不存在垃圾回收问题,但是存在栈溢出问题三、栈的存储单位每个线程都有自己的栈,栈中的数据都是以栈

2021-07-18 22:41:29 2973 5

原创 运行时数据区——程序计数器

PC寄存器PC寄存器是用来存储指向下一条指令的地址,也就是即将要执行的指令代码,由执行引擎读取下一条指令PC寄存器是一块很小的内存空间,也是运行速度最快的存储区域每个线程都有自己的程序计数器,是线程私有的,程序计数器的生命周期与线程的生命周期保持一致任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址,但是如果正在执行native方法,则是未指定值(undefined)程序计数器是程序控制流的指示器,分支、循环、跳转、异常处

2021-07-18 14:52:47 179

原创 双亲委派机制

一、双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交给父类处理,它是一种任务委派模式。二、工作原理如果一个类加载器收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行如果父类加载器还存在其父类加载器,则会进一步向上委托,依次递归请求,最终请求将到达顶层的启动类加载器如果父类加载器可以完成类加载

2021-07-18 10:16:29 179

原创 类加载器的分类

类加载器的分类引导类加载器(BootStrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)获取每一个不同的类加载器

2021-07-18 09:17:38 193

原创 类加载器与类的加载过程

一、类加载器子系统类加载器子系统分为加载阶段、链接阶段、初始化阶段类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识ClassLoader只负责class文件的加载,class文件是否能运行,则由执行引擎决定加载的类信息存放在一块称为方法区的内存空间,除了类的信息外,方法区还会存放运行时常量池信息,可能还包含字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)二、类的加载过程1、Loading加载阶段通过一个类

2021-07-14 20:06:02 190 1

原创 JVM的生命周期

一、虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的二、虚拟机的执行Java虚拟机的任务就是执行Java程序程序开始执行时虚拟机才运行,程序结束时虚拟机就停止执行一个Java程序,实际上执行的是一个Java虚拟机的进程三、虚拟机的退出以下几种情况会导致虚拟机的退出:程序正常执行结束程序在执行过程中遇到了异常或错误而异常终止由于操作系统用现错误而导致

2021-07-14 17:26:06 119

原创 JVM整体结构与Java代码执行流程

JVM整体结构Java代码执行流程Java源文件经过Java编译器生成.class字节码文件Java虚拟机包含类加载器、字节码校验器、执行引擎类加载器将字节码加载到JVM内部字节码校验器校验字节码文件是否符合JVM规范执行引擎会翻译字节码并解析执行,再由JIT编译器** **字码执行引擎会将字节码翻译成机器码交给操作系统执行...

2021-07-13 17:09:41 114

原创 单例设计模式常见形式

单例模式单例设计模式,即某个类在整个系统中只能有一个实例对象,例如JVM运行环境的Runtime类就是单例要想保证一个类只有一个实例,通过将构造器私有化来实现这个类还必须通过构造器自行创建这个实例,可以用该类的静态变量来保存这个唯一的实例通过直接暴露或者get方法获取静态变量的方式对外提供获取该实例对象常见形式饿汉式:在类初始化的时候直接创建对象,不存在线程安全问题直接实例化饿汉式public class Singleton { //内存自行创建实例对象,使用静态变量保存

2021-07-11 20:47:29 145

原创 Gateway网关跨域问题

Gateway网关跨域问题在使用Gateway网关时,所有请求先通过网关转发,这就有可能出现跨域问题上面的跨域报错是因为8001端口的请求去访问88端口的网关,导致了跨域,这是由于浏览器的同源策略造成的同源策略是指协议、域名、端口都要相同,只要其中有一个不同都会产生跨域问题跨域流程非简单请求(PUT、DELETE)等,需要先发送预检请求,只要当想要访问的服务器允许跨域时,才可以发送真实请求解决跨域使用Nginx部署为同一域将前端和后端项目都部署在Nginx服务器,浏览器的静态请求和动态请

2021-07-05 18:02:19 4062 1

空空如也

空空如也

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

TA关注的人

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