自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM —— GC流程

新创建的对象一般都会被分配在新生代的 Eden 中,当某一时刻,创建的对象将 Eden 区全部挤满了,就会触发一次 Minor GC在 Minor GC 之前,虚拟机会先检测老年代是否有足够的空间存放新生代中的对象,确保 Survivor 中放不下对象时这些对象可以进入老年代老年代剩余空间大于新生代中对象的大小:直接 Minor GC,如果 Minor GC 后 survivor 放不下,老年代也绝对放得下老年代剩余空间小于新生代中的对象大小:查看是否启用了「老年代空间分配担保规则」,具体来说就是看

2021-10-28 12:44:30 1575

原创 SpringMVC的执行流程

客户端发送请求到 前端控制器 DispatcherServlet前端控制器收到请求,调用 处理器映射器 HandlerMapping,处理器映射器会找到具体的 处理器 Handler,生成处理器对象,如果有配置拦截器,则顺便生成处理器拦截器,返回给前端控制器前端控制器调用 处理器适配器 HandlerAdapter,处理器适配器经过适配执行具体的处理器(Controller)处理器执行完毕后返回一个 ModelAndView,处理器适配器将该对象返回给前端控制器前端控制器将 M...

2021-10-26 16:51:22 145

原创 MyBatis 如何分页

逻辑分页。将数据一次性获取到内存中,在内存中进行逻辑上的分页。使用自带的 RowBounds 可以实现物理分页。通过特定的 SQL,只查询需要的数据。可以通过自写 SQL 或 分页插件(pageHelper)两者区别:逻辑分页开销大。当数据量小时,逻辑分页效率高,当数据量大时,物理分页效率高...

2021-09-16 22:25:32 161

原创 Redis五大基本数据类型的常用操作

String存储键值> set name wes> get name"wes"> append name Chen # 追加,返回长度,不存在时=set(integer) 7> mset k1 v1 k2 v2 k3 v3 # 批量设置> msetnx k1 v1 k2 v2 k3 v3 # 批量设置键值,当且仅当所有不存在> mget k1 k2 k3 # 批量获取1) "v1"2) "v2"3) "v3"> strlen nam

2021-09-14 19:35:52 105

原创 深拷贝与浅拷贝

深拷贝和浅拷贝浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝...

2021-09-14 19:33:31 68

原创 Redis如何进行持久化

RDBRedis 在进行 RDB 持久化时,会 Fork 一个子线程出来进行持久化,由于 Redis 是单线程的,所以持久化的时候主线程不会进行任何 IO 操作持久化时,先创建一个临时文件,并把数据写入这个临时文件中,待全部写完后,再把临时文件替换上次的持久化文件。在进行大规模的恢复时,RDB 比 AOF 高效缺点:最后一次持久化后的数据可能会丢失save 900 1 # 900s内修改了一个数据save 300 10save 60 10000dbfilename dump.rdb每次进

2021-09-14 19:31:11 190

原创 面试常客:TCP的三次握手

三次握手为什么需要握手握手的作用就是为了同步一些信息,比如最大滑动窗口TCP:是一个可靠的连接,也就是客户端和服务器双方必须感知对方的存在,需要经历一个建立连接的过程连接阶段过程中要解决以下三个问题:要使每一方都能确知对方的存在要允许双方协商一些参数能够对运输实体分配资源SYS-SENT:同步已发送LISTEN:收听SYN-RCVD:同步收到ESTAB-LISHED:已建立连接服务器一开始处于监听(LISTEN)状态,等待客户的连接请求客户向服务器发送连接请求报文,SY

2021-09-14 19:27:38 220

原创 Spring:Bean的作用域

Spring 中 Bean 的作用域通常有下面几种:singleton:单例 bean,对单例模式的应用prototype:多实例的 bean,每次请求都会创建一个新的 bean 实例request:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效session:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效global-session:全局 session 作用域,仅仅在基于

2021-09-14 18:08:44 68

原创 面试常客:谈谈你对AOP的理解

AOP:Aspect oriented programming 面向切面编程,是 OOP 的一种延续OOP 思想是一种垂直纵向的继承体系,通过子类继承父类可以解决大部分的代码重复问题,但对于一些特殊问题,比如在父类中的多个方法的相同位置出现了重复代码,OOP 就解决不了。比如要在父类的每个方法的的开始和结束,都添加一个性能监控或者日志输出。这种需要在重复位置添加的代码,统称为 横切逻辑代码,这种横切代码与业务代码混杂在一起,致使代码臃肿,不便于维护,而 AOP 就是来解决这些问题的AOP 通过横向抽取

2021-09-14 18:07:35 1933

原创 面试常客:谈谈你对IOC的理解

IOC 中文名为控制反转,它是一种设计思想,而不是一个具体的技术实现。控制指的是对象创建的权利(创建、管理对象的权力),反转指的是将对象的控制权交给外部环境,如 Spring 框架的 IOC 容器控制反转的核心思想是:将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。把对象当成一个个组件,注入到 IOC 容器中,并由 IOC 容器完成属性的注入利用这种思想,将对象之间的依赖关系交给 IOC 容器来管理,并由容器完成对象的注入,在很大程度上简化了应用的开发而 IOC 容器就是 Spri

2021-09-14 18:06:37 1463

原创 Bean的生命周期

在大体上分为五个阶段:实例化、属性赋值、初始化、使用、销毁。初始化和销毁是用户能自定义的阶段实例化首先 Bean 容器会在配置文件中找到关于 Bean 的定义,或者找到注解关于 Bean 的定义,然后利用反射创建一个 Bean 的实例属性赋值如果涉及到了一些属性值,则根据不同的注入方式进行属性值的注入初始化检查 Bean 是否实现了 Aware 相关接口,并设置相关依赖如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName 方法传入 Bean

2021-09-14 16:14:47 67

原创 Java 异常的基本概念

什么是异常异常是在程序的执行过程中,发生的不正常情况。异常分为两种:错误 Error 和 异常 Exception问题:Error 与 Exception 的区别1、Error 表示错误,是一种致命的异常,是 Java 运行环境内部或硬件问题发生的错误。无法通过程序处理,只能退出运行,是虚拟机抛出的。常见的如 OutOfMemoryError、StackOverflowError2、Exception 是由于程序设计的不完善而导致的一般性问题,可以利用代码解决3、两种异常都继承自 Throwab

2021-09-13 13:33:23 739

原创 设计模式的六大原则

单一原则:一个类只负责一项职责里氏替换原则:所有引用父类的地方必须能透明地使用其子类对象依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象接口隔离原则:使用多个专门的接口,而不使用单一的总接口迪米特原则:一个软件实体应当尽可能少地与其他实体发生相互作用。如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用开闭原则:对外扩展开放,对内修改关闭...

2021-09-13 13:23:00 65

原创 使用IDEA快速搭建SSM框架——整合篇

数据库搭建create table user ( id int auto_increment, name varchar(32) not null, email varchar(100), primary key(id));insert into user values(null, "张三", "123@qq.com"), (null, "admin", "admin@qq.com");导入依赖<properties> <maven.compiler.sour

2021-09-13 13:20:33 200

原创 Java 四大引用类型

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关在 JDK 1.2 之前,引用的定义:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用JDK 1.2 后,Java 对引用的概念进行了扩充,将引用分为四种:1、强引用【必不可少】最普遍的引用。如果一个对象具有强引用,垃圾回收器就不会回收它。使用 new 一个新对象的方式来创建强引用虚拟机宁愿抛出 OOM 错误,使程序异常终止,也

2021-09-13 13:16:28 119

原创 JVM之类的加载

类加载类是在运行期间第一次使用时动态加载的,而不是一次性加载所有类。因为如果一次性加载,那么会占用很多的内存类的生命周期类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,系统加载 Class 类型的文件主要三步:加载、连接、初始化连接过程又可分为三步:验证、准备、解析当类加载完毕后,堆内存的方法区中就产生了一个 Class 对象,这个对象包含了完整的类元数据加载加载是类加载过程的第一步,主要完成下面 3 件事情:通过全类名,将字节码文件的内容加载到内存,获取定义此类的二

2021-09-13 13:15:25 105

原创 对象的创建过程

对象的创建类加载检查、分配内存、初始化零值、设置对象头、执行 init 方法类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程分配内存类加载检查 通过后,虚拟机会为新生对象 分配内存对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来内存分配方式有 指针碰撞 和 空闲列表 两种,选

2021-09-13 13:13:31 95

原创 JVM常用调优参数

JVM常用参数调优工具JDK 自带的调优工具:jconsole、jvisualvm(视图监控工具)jconsole:对 JVM 的内存、线程和类进行监控jvisualvm:全能分析工具,可以分析 内存快照、线程快照、程序死锁、监控内存的变化、GC 变化等堆参数-Xms:初始化堆大小,默认为物理内存的 1/64-Xmx:堆最大分配内存,默认为物理内存的 1/4-XX:NewSize:初始化新生区内存-XX:MaxNewSize:设置新生代最大内存大小-XX:NewRatio=2:设置

2021-09-13 13:12:45 183

原创 2021-09-13

垃圾回收机制Java 中不需要我们显式的释放对象的内存,该过程是由虚拟机自行执行的。在虚拟机中有一个垃圾回收线程,它是低优先级的,在正常情况下不会执行只有在虚拟机空闲或者当前堆内存不足的时候,才会触发执行,扫描那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收垃圾回收算法:复制、标记-清除、标记-整理、分代收集算法七个垃圾收集器:Serial (sɪriəl)、SerialOld、ParNew、Parallel Scavenge(pærəlel skævɪndʒ)、Parallel

2021-09-13 13:11:37 144

原创 JVM 内存结构

JVM 内存结构JDK 1.7 之前的运行模型:JDK 1.8 之后的运行模型:线程私有:程序计数器、虚拟机栈、本地方法栈线程共享:堆、方法区栈管运行,堆管存储程序计数器程序计数器是当前线程执行的字节码的行号指示器两个作用:字节码解释器通过该计数器的值来选取下一条执行的指令,从而达到代码的流程控制在并发下,程序计数器用于记录当前线程的执行位置,从而让线程被切换回来时能够知道该线程上一次的运行位置特点:线程私有。每条线程都需要一个独立的程序计数器不会发生内存溢出。程序计数器

2021-09-13 13:08:24 123

原创 线程的创建方式

Thread我们通过 new 一个 Thread 的子类,并调用其 start 方法来启动一个线程public class MyThread extends Thread { @Override public void run() { ... }}public static void main(String[] args) { new MyThread().start();}问题:为什么调用的是 start 方法而不是 run 方法1、当 n

2021-09-12 21:17:47 84

原创 集合体系结构

集合体系结构集合是一种容器,用来存储对象信息所有集合类都位于 java.util 包下,支持多线程的集合位于 java.util.concurrent 包下[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgTIr1vB-1631418503370)(M:\typora-img\image-20210908173245404.png)]集合中有两个重要的根接口:Collection(单列)、Map(双列)CollectionCollection 的子接口有:List

2021-09-12 11:48:50 119

原创 并发(三)线程相关操作

Thread我们通过 new 一个 Thread 的子类,并调用其 start 方法来启动一个线程public class MyThread extends Thread { @Override public void run() { ... }}public static void main(String[] args) { new MyThread().start();}问题:为什么调用的是 start 方法而不是 run 方法run 方

2021-09-11 14:43:20 65

原创 并发(二)线程状态

多线程问题:多线程的优缺点优点:最大限度的利用 CPU 的资源提高系统的吞吐率提高响应性。利用多线程处理用户请求,缩短用户等待时间缺点:容易发生安全问题。多线程共享数据时,如果没有采取正确的并发访问控制措施,就可能会产生数据一致性问题,如读取脏数据、丢失数据更新线程活性问题。由于程序自身的缺陷,或者由于资源的稀缺性,导致线程一直处于非 runnable 状态,常见的活性故障:死锁、锁死、活锁、饥饿上下文切换。可靠性。可能会由一个线程导致 JVM 意外终止,

2021-09-11 14:41:25 51

原创 并发(一)线程的相关概念

进程与线程问题:什么是进程,什么是线程进程是程序的一次执行过程,是一个动态的概念,进程是系统资源分配的基本单位线程是进程的一个执行单元,是 CPU 调度和执行的基本单位问题:进程与线程有什么区别进程是执行中的一段程序,而一个进程执行中的每个任务即为一个线程。如果把进程比作一辆货车,那么线程就是车厢一个线程只能属于一个进程,而一个进程能包含多个线程进程之间不会相互影响,而线程之间容易相互影响线程的开销比进程少不同进程无法共享资源,而同一进程下的不同线程可以轻易共享资源线程无地址空间,它包

2021-09-11 14:40:24 204

原创 Java语言的特点

面向对象的(OOP)解释型语言跨平台性。一个 Java 文件,需要先编译为 .class 字节码文件,再由 JVM 解释执行,不同的平台有不同的虚拟机,可以在多个操作系统下运行,实现了程序运行效率和不同操作系统之间可移植性的完美结合健壮性,Java 的强类型机制、异常处理、垃圾自动收集等是 Java 程序健壮性的重要保证安全性:采用公钥加密算法为基础的验证技术分布计算:可以轻松实现基于TCP/IP的分布式应用系统多线程:Java在语言级别而不是操作系统级别上支持多线程程序设计解释型语.

2021-09-11 09:31:22 46

原创 MyBatis的基本使用

概述什么是MyBatis:MyBatis 是一个半 ORM 框架,它内部封装了 JDBC 的大部分操作,在开发的时候我们只需要关注 SQL 语法本身,而不需要花精力去处理 JDBC 的一些操作。在 MyBatis 中通过 xml 或者注解的方式,将实体类与数据库中的表进行映射,由框架执行 SQL 并将执行结果映射为实体类返回MyBatis 的优点:相比于 JDBC,减少了大量的代码,不需要我们手动开启连接、关闭连接解耦。将 SQL 写在 xml 文件中,使 SQL 与程序代码分离,便于我们直

2021-09-10 14:32:27 336

原创 单例模式详解

概述单例模式:在整个系统中,某个类只有一个实例对象能被获取与使用实现要点私有构造器类内部创建对象对外提供获取实例的静态方法饿汉式普通方式饿汉式:在类被加载的时候,直接创建对象,线程安全public class Singleton { private static Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singlet

2021-09-10 12:33:50 61

原创 JDK 与 JRE 的区别

Java的运行机制Java 的核心机制:Java 虚拟机(JVM)JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器,包含在 JDK 中不同的平台,有不同的虚拟机虚拟机机制屏蔽了底层运行平台的差别,实现了:一次编译,到处运行Java的运行环境JDK = JRE + Java 的开发工具JRE = JVM + Java 的核心类库JDK 是 Java 的开发工具包,它提供了 Java 的开发环境和运行环境,而 JRE 只提供了 Java 的运行

2021-09-09 10:47:06 246

原创 Java的运算符

Java 中,运算符的类型有:算术运算符:+ - * / % ++ –赋值运算符关系运算符逻辑运算符位运算符条件运算符逻辑运算符逻辑与 &,逻辑或 |,逻辑异或 ^短路与 &&,短路或 ||,取反 !aba&ba&&ba|ba||b!aa^btruetruetruetruetruetruefalsefalsetruefalsefalsefalsetruetruefals

2021-09-09 10:43:38 46

原创 Java如何从键盘输入与输出

从键盘输入数据:public class Input { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); double a = sc.nextDouble(); String s = sc.nextLine();}输出格式:% [参数索引 $] [对齐标志] [总场宽] [.小数位数] 数据类型参数索引:指定输出数据的位置(1~n)总场宽.小数位数 :%6.2f 总场宽6位、小数点两位

2021-09-09 10:40:05 657

原创 Java之标识符的命名规则

标识符:我们自定义的内容,如 类名、方法名、变量名 等命名规则:由字母、下划线、$、数字组成不能以数字开头不能用关键字或保留字做标识符区分大小写

2021-09-09 10:38:39 79

原创 控制流程语句

continue、break标签名: 循环体 { break 标签名;}break跳出指定的循环体public class s { public static void main(String[] args) { Loop: for(int i=0;i<3;i++) { two: for(int j=10;j<30;j++) { if(i>50) continue Loop;

2021-09-09 10:30:08 57

原创 值传递与引用传递

基本数据类型是值传递,数组是引用传递int a = 10;int b = a;b = 20;int[] arr = {1, 2, 3};int[] brr = arr;brr[0] = 10;创建变量a后,在栈内创建变量,并赋值,创建变量b的时候,把a的值复制一份拷贝给b创建数组arr,值存储在堆中,通过一个地址来让arr指向堆中的空间把数组a 赋值给 b,b的变化会影响到 ab 拷贝的时候,拷贝的是地址...

2021-09-09 10:25:42 82

原创 Java的常见数据类型

数据类型Java 中,数据分为 基本数据类型 与 引用数据类型基本数据类型一共有八种基本数据类型数据类型关键字大小(字节)取值范围封装类字节型byte1-128 ~ 127Byte短整型short2-32768 ~ 32767Short整型int(默认)4-2^31 ~ 2^31-1Integer长整型long8-2^63 ~ 2^63-1Long单精度浮点数float41.4013E-45 ~ 3.4028E+

2021-09-09 10:22:39 125

原创 public static void main 参数解析

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }当创建了一个 Java 类,并使用 javac 命令编译 .java 文件后,Java 文件会被编译解析成 .class 文件(字节码文件)有了字节码文件,我们就可以使用 java 命令运行字节码文件使用命令 javac、java 即可运行一个 .java 文

2021-09-09 09:51:52 1391

原创 Java中常见的转义字符

字符说明\t一个制表符tab,实现对齐功能\n换行符\ \一个\\ "一个“\ ‘一个‘\r一个回车

2021-09-09 09:47:00 95

原创 HashMap详解

MapMap 是集合中一个重要接口,是双列集合的根接口其内部存储结构为 key-value 键值对无重复键值对key 可为 null(限一个)value 可为 null(多个)常用方法方法说明void clear ()清除所有键值对boolean containsKey (Object key)如果此映射包含指定键的映射,则返回 trueboolean containsValue (Object value)Set<Map, Entry

2021-09-09 09:44:37 346 1

原创 List 接口的常用实现

概述ArrayList 作为 List 的一个实现类,其有 (1) 元素有序、可重复、支持索引操作 等 List 接口的特点除了 List 的几个特点之外,ArrayList 还允许 (2) 存储 null 值,且支持多个public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add(null); list.add(null); l

2021-09-08 14:48:38 209

原创 Linux常用指令

概述在 Linux 中,一切皆文件根目录:/系统配置目录:/etc用户目录:/home软件安装目录:/opt目录与文件目录跳转与查看跳转目录:cd + 目录返回上级目录:cd …查看当前所在目录:pwd查看目录下的文件:ll:以列表显示,展示详细信息ls:只显示目录名与文件名命令说明ls /home显示 home 目录下的文件ls -a查看所有文件,包括隐藏文件ls -l产看所有文件,包括属性和权限ls -la组合使用

2021-09-08 13:29:01 67

空空如也

空空如也

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

TA关注的人

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