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

原创 【JVM类加载及字节码技术】类加载阶段——类加载器、双亲委派模式

文章目录类加载器1、启动类加载器2、拓展类加载器3、应用程序类加载器4、双亲委派模式双亲委派的具体过程如下:5、自定义类加载器5.1、使用场景5.2、步骤类加载器Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(ClassLoader)。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加

2022-03-12 20:16:11 645

原创 【JVM类加载及字节码技术】类加载阶段——加载、链接(一)

JVM的类加载——加载、链接【一】

2022-03-03 11:19:52 428

原创 【JVM类加载及字节码技术】类加载阶段——初始化(二)

类加载阶段——初始化【二】

2022-03-03 11:18:43 157

原创 【JVM类加载及字节码技术】编译期处理-语法糖-枚举类、匿名内部类、方法重写的桥接方法(三)

文章目录九、枚举类1.案例代码:2.编译优化十、匿名内部类案例代码(一):编译优化(一)案例代码(二):编译优化(二)九、枚举类1.案例代码:代码如下:enum SEX { MALE, FEMALE;}2.编译优化代码如下:public final class Sex extends Enum<Sex> { //对应枚举类中的元素 public static final Sex MALE; public static final Sex

2021-12-16 15:52:47 160

原创 【JVM类加载及字节码技术】编译期处理-语法糖-可变参、foreach、switch(二)

文章目录四、可变参数1.案例代码2.编译优化五、foreach1.案例代码2.编译优化六、集合使用foreach1.案例代码2.编译优化七、switch字符串1.案例代码2.编译优化七、switch枚举1.案例代码2.编译优化四、可变参数1.案例代码代码如下:public class Demo4 { public static void foo(String... args) { //将args赋值给arr,可以看出String...实际就是String[] St

2021-12-16 14:53:40 371

原创 【JVM类加载及字节码技术】编译期处理-语法糖-构造、泛型、拆装箱(一)

文章目录前言一、默认构造函数1.案例代码2.编译优化后二、自动拆装箱1.案例代码2.编译优化后二、泛型集合取值1.案例代码2.字节码文件前言语法糖:其实就是指java编译器把 .java 源文件编译为 .class 字节码的过程,自动生成和转换的代码,主要是为了减轻程序员的负担,算是java编译器给我们的额外福利。注意,以下代码的分析,借助了javap工具,idea的反编译功能,idea插件jclasslib等工具,编译器转换的结果就是class字节码,只是为了便于阅读,给出几乎等价的Jav

2021-12-16 09:29:45 816

原创 【JVM类加载及字节码技术】栈中的执行过程-Synchronized(五)

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例

2021-12-14 21:02:46 196

原创 【JVM类加载及字节码技术】栈中的执行过程-异常处理(四)

文章目录前言一、异常处理?二、try-catch1.案例代码2.对应字节码指令三、多个single-catch1.案例代码2、对应的字节码指令四、finally1.案例代码2、对应的字节码指令四、finally中的return1.案例代码2、对应的字节码指令五、finally中的吞噬异常1.案例代码总结前言本博客讲解的是 JVM中对于异常处理的执行流程。提示:以下是本篇文章正文内容,下面案例可供参考一、异常处理?异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的

2021-12-14 20:35:24 527

原创 【JVM类加载及字节码技术】栈中的执行过程-方法调用、多态(三)

文章目录一、方法调用1、JVM底层对不同方法,有不同的实现方式二、多态原理一、方法调用直接分析下面案例代码:public class Demo5 { public Demo5() { } private void test1() { } private final void test2() { } public void test3() { } public static void test4() { } public static void main(String[] args

2021-12-14 00:43:06 211

原创 【JVM类加载及字节码技术】栈中的执行过程-构造方法(二)

一、分析案例通过字节码指令来分析代码。public class Demo2 { public static void main(String[] args) { int i=0; int x=0; while(i<10) { x = x++; i++; } System.out.println(x); //结果为0 }}下面我们就通过分析字节码指令:Code: stack=2, locals=3, args_size=1 //操作数栈分配2个空

2021-12-14 00:16:18 307

原创 【JVM类加载及字节码技术】栈中的执行过程(一)

文章目录1、类文件结构2、字节码指令**图解上面方法的执行流程**1、方法区载入运行时常量池中的字节码文件2、执行引擎开始执行字节码1. **bipush 10**:2. **istore 1**:3. **ldc #3**:4. **istore 2**:5. **iload1 iload2**:6. **iadd**:7. **istore 3**:8. **getstatic #4**:9. **iload 3**:10. **invokevirtual 5**:11. **return**:1、类

2021-12-09 15:43:10 1244

原创 【JVM垃圾回收】GC 调优

调优领域:内存锁竞争CPU占用IOGC确定目标:低延迟/高吞吐量?选择合适的GC并发收集器: CMS G1 ZGC并行收集器: Parallel GCZing七大垃圾收集器:1、串行GC:Serial收集器(1:1)串行收集器是最古老的,最稳定,效率高的收集器,只使用一个线程去回收但其进行垃圾回收过程中可能会产生较长的停顿。虽然在收集垃圾的过程中需要暂停其他的工作线程,但是简单高效,对于单CPU环境来说,没有线程交互的开销可以获得最高的单线程垃圾收集效率。2、并行GC:

2021-12-09 08:50:44 471

原创 【JVM垃圾回收】G1垃圾回收器

文章目录G1堆内存结构1、其他算法内存结构,如CMS,serial。2、G1垃圾回收器,内存结构3、RegionGC模式1、Young Collection1.1、Young Collection跨代引用1.2、Remark:重新标记(最终标记)阶段2、Young Collection + CM3、Mixed Collection4、Full GC1、JDK 8u20 字符串去重2、JDK 8u40 并发标记类卸载3、JDK 8u60 回收巨型对象**G1的回收步骤总结**:总结:G1Garbage

2021-12-08 21:09:44 635

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

垃圾回收器专业词汇解释:并行收集:指多条垃圾收集线程并行工作,但是此时用户线程,仍处于等待线程。并发收集:指用户线程线程个垃圾线程同时工作,不一定是并行的可能会交替执行。用户程序在继续运行,垃圾收集程序在另一个cpu运行。吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )),也就是。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%1、串行单线程内存小,个人电脑cpu安全点:

2021-12-08 18:16:44 267 1

原创 【JVM垃圾回收】分代回收

在内存空间中我们可以大致按照上图划分,将堆空间划分为,新生代,老年代,字符串常量池,封装类常量池。回收机制主要进行在新生代和老年代。新生代:伊甸园:主要用于存放新创建的对象。幸存区From,幸存去To:幸存去To空着,幸存区From存放已经存活有一定次数的对象。​老年代:当幸存区From中对象的存活次数达到一定阈值(没有特殊情况就是这样,如果实在是没有空间,那么就会提前放入老年代),就放入老年代。​回收流程新创建的对象都被放在了新生代的伊甸园中当伊甸园内存不足时候,就会进..

2021-12-08 18:14:24 397

原创 【JVM垃圾回收】垃圾回收算法

1、标记-清除定义:标记清除顾名思义,指虚拟机在进行垃圾回收的过程中,先采用次标记算法确定可回收对象,然后垃圾收集器根据标识,清除相应的内容,给堆内存腾出相应的空间。这里腾出的内存空间并不是将内存空间的字节清0,而是记录下这段内存的起始地址,下次分配内存的时候,直接覆盖这段内存。缺点: 容易产生大量的内存碎片,空间不连续,无法满足大对象的内存分配,一旦导致,无法分配对象,那么就会导致JVM启动GC,我们响应的程序就会陷入stop the world,这就会导致程序响应速度变慢。2、标记-

2021-12-08 18:10:34 196

原创 【JVM垃圾回收】如何判断对象可以回收?

1、引用计数算法定义:判断一个对象是否受到引用, 如果受到一个引用就+1,如果减少一个引用就-1,当计数为0那么久标记为垃圾。弊端:循环引用时,两个对象的计数都为1,导致两个对象计数不能为0,不能被定义为垃圾。2、可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象.扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收.可以作为GC Root的对象。【JVM垃圾回收】哪些可以当作GC ROOT?3、五种引用1、强引用(A

2021-12-08 18:08:05 458

原创 【JVM垃圾回收】哪些对象可以当作GC ROOT ?

哪些对象可以当作GC ROOT ?一、从虚拟机的内存分区的角度来以下对象可以作为GC Root:局部变量所引用的对象可以作为根对象。 例如 ArratList list = new ArrayList();方法参数所引用的对象也可以作为根对象。如果局部变量不再引用,那么就会被GC垃圾回收。例如:list = null;那么new ArrayList()就会被当作垃圾回收。总结:1.java虚拟机栈中的引用的对象。方法区中的类静态属性引用的对象。 (一般指被static修饰的对象

2021-12-08 18:03:47 5887

原创 【JVM内存结构】String在JVM中的深度剖析(四)

案例OK,学习到这里,是不是感觉自己懂了?我出一道题目来考考大家,下面这段程序的运行结果是什么?public static void main(String[] args) { String a =new String(new char[]{'a','b','c'}); String b = a.intern(); System.out.println(a == b); //true String x =new String("def"); St

2021-12-08 17:59:02 137

原创 【JVM内存结构】String在JVM中的深度剖析(三)

思考题:1、常量池有多大呢?我想大家一定和我一样好奇,常量池到底能存储多少个常量?前面我们说过,常量池本质上是一个hash表,这个hash表示不可动态扩容的。也就意味着极有可能出现单个 bucket 中的链表很长,导致性能降低。在JDK1.8中,这个hash表的固定Bucket数量是60013个,我们可以通过下面这个参数配置指定数量-Xmx10m 指定堆空间大小可以增加下面这个虚拟机参数,来打印常量池的数据。-xx:StringTableSize=‘桶的个数’,如果常量过多,可以添加这个,减少

2021-12-08 17:57:43 216 1

原创 【JVM内存结构】String在JVM中的深度剖析(二)

1.2、运行时常量池运行时常量池是每一个类或者接口的常量池(Constant Pool)的运行时的表现形式。我们知道,一个类的加载过程,会经过:加载、连接(验证、准备、解析)、初始化的过程,而在类加载这个阶段,需要做以下几件事情:通过一个类的全类限定名获取此类的二进制字节流。在堆内存生成一个 java.lang.Class 对象,代表加载这个类,做为这个类的入口。将class字节流的静态存储结构转化成方法区(元空间)的运行时数据结构。而其中第三点,将class字节流代表的静态储存结构转化为方

2021-12-08 17:56:03 242

原创 【JVM内存结构】String在JVM中的深度剖析(一)

面试题:String a = “ab”; String b = “a” + “b”; a == b 是否相等?面试考察点考察目的: 考察对JVM基础知识的理解,涉及到常量池、JVM运行时数据区等。考察范围: 工作2到5年。背景知识要回答这个问题,需要搞明白两个最基本的问题• String a=“ab”,在JVM中发生了什么?• String b=“a”+“b”,底层是如何实现?一、JVM的运行时数据首先,我们一起来复习一下JVM的运行时数据区。为了让大家有一个全局的视角,我从类加载,到

2021-12-08 17:51:48 278

原创 Nacos配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml[spring.application.name].yaml,例如:userservice.yaml而[spring.application.name].yaml不包含环境,因此可以被多个环境共享。1、添加一个环境共享配置我们在nacos中添加一个userservice.yaml

2021-11-04 22:38:10 1655

原创 Nacos布置热更新

nacos配置热更新方式1:在@Value注入的变量所在类上添加注解@RefreshScope:方式2:使用@ConfigurationProperties注解代替@Value注解。一般我们接收配置中的属性,可以创建一个专门接收属性的类来读取这些属性。import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.

2021-11-04 22:28:52 633

原创 Ribbon中的负载均衡策略

Ribbon中的负载均衡策略:负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:不同规则的含义如下:默认的实现就是ZoneAvoidanceRule,往上查三代就知道它和轮询脱不了干系。Ribbon中自定义负载均衡策略:通过定义IRule实现可以修改负载均衡规则,有两种方式:1、代码方式:在消费者的配置类中,定义一个新的IRule:@Beanpublic IRule randomRule(){ //随机抽取,但是当请求量大了,还是偏向均匀分配 retur

2021-11-04 09:14:11 213

原创 Ribbon负载均衡流程解析

Ribbon负载均衡源码探究:假设当前有一个订单服务,以及一个用户服务,用户服务为分布式架构,探究Ribbon中是如何实现负载均衡。源码探究:1、双击shift搜索类,查找LoadBalancerInterceptor注意在cloud包下面的才是。2、在这个类中我们发现这个类实现了一个接口ClientHttpRequestInterceptor,继续跟进发现这个接口中只有一个方法intercept。那么肯定实现了这个方法。3、返回LoadBalancerInterceptor,找到inte

2021-11-04 00:49:02 344

原创 Eureka注册中心简单原理

Eureka简单原理1、微服务调用所需要面对的问题。1、服务消费者该如何获取服务提供者的地址?2、如果有多个服务提供者,消费者该如何选择?3、服务者如何得知服务提供者的健康状态?2、Eureka的引出假如我们现在有一个订单服务,需要调用用户服务,我们该如何获取到提供者的地址,如果提供者的地址是集群部署,我们又该如何体现分布式架构的优势,反正肯定不能在代码中写死地址,那么我们就需要我们今天的主角Eureka出场了。2.1 Eureka的注册中心起到的作用就是记录和管理。因为消费者和提

2021-11-03 20:23:30 478

原创 面向对象编程-高级(四)-接口、内部类

一、接口1.1 为什么有接口1.2 接口快速入门public interface UsbInterface { //接口 //规定接口的相关方法,老师规定的.即规范... public void start(); public void stop();}public class Camera implements UsbInterface{//实现接口,就是把接口方法实现 @Override public void start() { System.out.println(

2021-09-24 00:09:48 111

原创 面向对象编程-高级(三)-抽象类、final

一、final 关键字1.1 基本介绍 //如果我们要求 hi 不能被子类重写 //可以使用 final 修饰 hi 方法 public final void hi() {}//当不希望类的的某个属性的值被修改,可以用 final 修饰public final double TAX_RATE = 0.08;//常量//当不希望某个局部变量被修改,可以使用 final 修饰//这时,NUM 也称为 局部常量 final double NUM = 0.01;1.2 final 使用

2021-09-23 22:58:13 53

原创 面向对象编程-高级(二)-代码块

一、代码块1.1 基本介绍1.2 基本语法1.3 代码块的好处和案例演示下面的三个构造器都有相同的语句这样代码看起来比较冗余这时我们可以把相同的语句,放入到一个代码块中,即可当我们不管调用哪个构造器, 创建对象,都会先调用代码块的内容代码块调用的顺序优先于构造器…{ System.out.println("需要执行的冗余代码1..."); System.out.println("需要执行的冗余代码2..."); System.out.println("需要执行的冗余代码

2021-09-23 17:03:31 42

原创 面向对象编程-高级(一)-类变量和类方法

一、 类变量和类方法1.1 类变量/静态属性1.1.1 类变量-提出问题提出问题的主要目的就是让大家思考解决之道,从而引出我要讲的知识点.说:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。1.1.2 传统的方法来解决1.1.3 类变量快速入门思考: 如果,设计一个 int count 表示总人数,我们在创建一个小孩时,就把 count 加 1,并且 count 是所有对象共享的 就 ok 了!我们使用类变量来解决改进。//定义一个变量 count

2021-09-23 16:13:14 81

原创 面向对象编程-中级(四)-Object 类详解

一、Object 类详解1.1 equals 方法’==’ 和 ‘equals’ 的对比1.1.1 String重写equals方法源码/* //带大家看看 Jdk 的源码 String 类的 equals 方法 //把 Object 的 equals 方法重写了,变成了比较两个字符串值是否相同 */public boolean equals(Object anObject) { if (this == anObject) {//如果是同一个对象 return true;//返回 t

2021-09-23 15:11:23 88

原创 面向对象编程-中级(三)-方法重写、覆盖、多态、动态绑定机制

一、方法重写/覆盖(override)1.1 基本介绍1.2 快速入门public class Animal { public void cry() { System.out.println("动物叫唤.."); }}public class Dog extends Animal{ //1. 因为 Dog 是 Animal 子类 //2. Dog 的 cry 方法和 Animal 的 cry 定义形式一样(名称、返回类型、参数) //3. 这时我们就说 Dog 的 cr

2021-09-23 09:51:17 125

原创 面向对象编程-中级(二)-封装、继承、super

一、面向对象编程三大特征1.1 基本介绍面向对象编程有三大特征:封装、继承和多态。二、面向对象编程-封装2.1 封装介绍2.2 封装的理解和好处2.3封装的实现步骤 (三步)2.4 快速入门案例class Person { public String name; //名字公开 private int age; //age 私有化 private double salary; //.. //构造器 alt+insert public Person() { }

2021-09-23 08:42:51 85

原创 面向对象编程-中级(一)-包、访问修饰符

一、包1.1 看一个应用场景1.2 包的三大作用1.3 包基本语法1.4 包的本质分析(原理)1.6 包的命名1.7 常用的包一个包下,包含很多的类,java 中常用的包有:java.lang.* //lang 包是基本包,默认引入,不需要再引入.java.util.* //util 包,系统提供的工具包, 工具类,例如 Scannerjava.net.* //网络包,网络开发java.awt.* //是做 java 的界面开发,GUI1.

2021-09-23 07:22:00 59

原创 面向对象编程-基础(四)-构造方法/构造器

一、构造方法/构造器1.1 构造器介绍我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做? 这时就可以使用构造器。1.2 基本语法[修饰符] 方法名(形参列表){ 方法体;}构造器的修饰符可以默认,也可以是public,protected,private构造器没有返回值方法名和类名字必须一样参数列表和成员方法一样的规则构造器的调用, 由系统完成1.2 基

2021-09-22 21:38:53 181

原创 面向对象编程-基础(三)

一、方法递归调用(非常非常重要,比较难)1.1 基本介绍简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变得简洁.1.2 递归能解决什么问题?1.3 递归举例打印问题阶乘问题1.3.1 打印问题public class Recursion01 { public static void main(String[] args) { //打印问题 T t1 = new T(); t1.test(4);//输出什么? n=

2021-09-22 18:44:24 72

原创 面向对象编程-基础(二)-传参机制

1、成员方法1.1 基本介绍在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名…),我们人类还有一 些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这时就要用成员方法才能完成。现在要求对 Person 类完善。1.2 方法的调用机制原理:(重要!-示意图!!!)1.3 成员方法的好处提高代码的复用性可以将实现的细节封装起来,然后供其他用户来调用即可1.4 成员方法的定义访问修饰符 返回数据类型 方法名(形参列表..) { //方法体

2021-09-22 17:27:34 105

原创 面向对象编程-基础(一)-类与对象

1、类与对象1.1 看一个养猫猫问题张老太养了两只猫猫:一只名字叫小白,今年 3 岁,白色。还有一只叫小花,今年 100 岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。1.2使用之前技术解决单独的定义变量解决使用数组解决1.3 现有技术解决的缺点分析不利于数据的管理效率低===》 引出我们的新知识点 类与对象 哲学, 道家思想java 设计者 引入 类与对象(OOP) ,根本原因就是现有的技术

2021-09-22 14:45:37 310

原创 数组、排序和查找(二)

1、排序的介绍排序是将多个数据,依指定的顺序进行排列的过程。排序的分类:1.1 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);1.2 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。2、冒泡排序法冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐

2021-09-22 00:01:47 71

空空如也

空空如也

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

TA关注的人

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