自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据库范式

1NF表中的字段不可再分割。1NF 是所有关系型数据库的最基本要求 ,也就是说关系型数据库中创建的表一定满足第一范式。(eg:省市区,不行,可再分)2NF在1NF的基础上,消除了非主属性对码的部分依赖(eg:学号、身份证号、姓名,通过两个号都能找到姓名,姓名部份依赖于学号和身份证号)3NF在2NF的基础上,消除了非主属性对码的传递依赖(每个属性跟主键有直接关系,eg:学号、系名、系主任,通过找到系名才找到系主任,不行)...

2022-03-11 17:40:37 567

原创 MyISAM和InnoDB的区别

1.是否支持行级锁MyISAM 只有表级锁,而 InnoDB 支持行级锁和表级锁,默认为行级锁。2.是否支持事务MyISAM 不提供事务支持。InnoDB 提供事务支持,具有提交(commit)和回滚(rollback)事务的能力。3.是否支持外键MyISAM 不支持,而 InnoDB 支持。4.是否支持数据库异常崩溃后的安全恢复MyISAM 不支持,而 InnoDB 支持。使用 InnoDB 的数据库在异常崩溃后,数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个

2022-03-11 17:06:57 1561

原创 事务的特性

什么是事务若干条语句,要么全部执行成功,要么全部失败事务的特性(ACID):1.原子性:整个数据库事务是一个不可分割的单位。只有所有的语句都成功,整个事务的执行才算成功;有任何一条sql语句执行失败,那么已执行的成功的语句也会撤销,数据库回退到执行事务之前的状态2.一致性:事务开始前和结束后,数据库的完整性约束没有改变。比如:A给B转钱,无论是否成功,两人的账户总额是不会改变的3.隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,各自的操作不会对彼此产生影响4.持久性:数据一旦

2022-03-03 18:38:09 537

原创 数据库索引

定义:索引是一种用于快速查询和检索数据的数据结构优点:1.加快数据检索速度2.通过创建唯一性索引,保证数据库表中每一行数据的唯一性缺点:1.创建和维护索引也会耗费时间2.索引需要占用磁盘空间3.对数据进行增删改查的时候,索引也要动态的维护适合加索引:1.where中经常使用的字段2.不经常更新的字段3.数据量大的表4.数据离散度大(性别,真假等不适合)5.不参与计算的列(防止索引失效)不走索引的情况:1.like xxx2.索引列参与了运算

2022-03-03 16:08:39 611

原创 缓存穿透;缓存雪崩

缓存穿透简单来说就是大量请求的key不在缓存中,请求直接到了数据库上,没有经过缓存解决方法:1.做好参数检验,如:id不能小于02.缓存无效key:数据库和缓存中都没有的数据写到一个Redis中, 设置过期时间3.布隆过滤器:布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在缓存雪崩:缓存在同一时间大面积失效,导致后面的请求直接到数据库,造成数据库短时间内承受大量数据解决方法:1.Redis集群,避免整个服务都不可用2.设置不同的缓存时间,

2022-03-02 20:03:57 312

原创 Redis持久化

1.快照持久化(RDB)Redis可以通过创建快照获取内存中数据的副本,在创建快照副本后,可以对快照备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构),还可以将快照留在原地以便重启服务器的时候使用2.AOF持久化与快照持久化相比,AOF 持久化的实时性更好,开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到内存缓存中,然后再根据appendfsync配置来决定何时将其同步到硬盘中的 AOF 文件。为了兼顾数据..

2022-03-02 20:03:30 194

原创 Redis内存淘汰

volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰allkeys-lru(least recently used):当内存不足以容纳新写入数据时,

2022-03-02 20:02:55 47

原创 过期数据删除策略

1.惰性删除:只会在取出key的时候才对数据进行过期检查,对CPU友好2.定期删除:每隔一段时间抽取一批key执行删除过期key操作定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是定期删除+惰性删除...

2022-03-02 20:02:09 1258

原创 页面置换算法

地址映射过程中,若在页面中发现所要访问的页面不在内存中,则发生缺页中断 。缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。OPT 页面置换算法(最佳页面置换算法):最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。 FIFO页面置换算法(先进先出页面置换算.

2022-03-02 19:58:21 622

原创 局部性原理

局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。局部性原理表现在以下两个方面:时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一

2022-03-02 19:57:50 886

原创 虚拟内存的实现方式

通过虚拟内存可以让程序拥有超过系统物理内存大小的可用内存空间。虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。...

2022-03-02 19:57:14 1216

原创 分页和分段的异同

同:分页机制和分段机制都是为了提高内存利用率,减少内存碎片。页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。异:页的大小是固定的,由操作系统决定;而段的大小不固定,取决于当前运行的程序。 分页为了满足操作系统内存管理的需求,而段是逻辑信息的单位,为了更好的满足用户需要。...

2022-02-16 16:48:08 1245

原创 内存管理

内存管理主要是做什么:操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),地址转换也就是将逻辑地址转换成相应的物理地址等功能。内存管理机制:连续分配管理方式(为一个用户程序分配一个连续的内存空间):块式管理:将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。非连续分配管理方

2022-02-16 16:46:57 186

原创 进程调度算法

为了确定首先执行哪个进程以及最后执行哪个进程以实现最大 CPU 利用率,采用进程调度算法:1.先到先服务(FCFS)调度算法: 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。2.短作业优先(SJF)的调度算法: 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。3.时间片轮转调度算法: 每个进程被分配一个时间段,称作它的时间

2022-02-16 16:46:18 246

原创 线程同步方式

线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。操作系统一般有下面三种线程同步的方式:互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。 事件:通过通知操作的方式来保持多线程同步,还可以方便的实现多

2022-02-16 16:44:47 86

原创 进程间的通信方式

原文地址:JavaGuide (gitee.io)1.匿名管道:用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。2.有名管道:匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循**先进先出(first in first out)**。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。3.信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。4.消息队列:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息

2022-02-16 16:44:13 94

原创 系统调用

根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:用户态: 用户态运行的进程可以直接读取用户程序的数据。 系统态:可以简单的理解为系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。我们运行的程序基本都是运行在用户态,但是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。这些系统调用按功能大致可分为如下几类:设备管理。完成设备的请求或释放,以及设备启动等功能。 文件管理。完成文件的

2022-02-16 16:42:51 59

原创 什么是操作系统

操作系统是管理计算机硬件与软件资源的程序 操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。 操作系统存在屏蔽了硬件层的复杂性。操作系统就像是硬件使用的负责人,统筹着各种相关事项。 操作系统的内核是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。...

2022-02-16 16:41:59 361

原创 JVM参数设置

#常用的设置-Xms:初始堆大小,JVM 启动的时候,给定堆空间大小。-Xmx:最大堆大小,JVM 运行过程中,如果初始堆空间不足的时候,最大可以扩展到多少。-Xmn:设置堆中年轻代大小。整个堆大小=年轻代大小+年老代大小+持久代大小。-XX:NewSize=n 设置年轻代初始化大小大小-XX:MaxNewSize=n 设置年轻代最大值-XX:NewRatio=n 设置年轻代和年老代的比值。如: -XX:NewRatio=3,表示年轻代与年老代比值为 1:3,年轻代占整个年轻代+年老

2022-02-16 16:40:57 299

原创 垃圾收集器

原文地址:一篇文章掌握整个JVM,JVM超详细解析!!!_小杰爱吃蛋的博客-CSDN博客_jvm什么是垃圾收集器?垃圾收集器是垃圾回收算法(引用计数法、标记清楚法、标记整理法、复制算法)的具体实现,不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能会有很在差别。以JDK1.8为例:新生代收集器:Serial、ParNew、Parallel Scavenge 老年代收集器:CMS、Serial Old、Parallel Old 整堆收集器:G1...

2022-02-14 20:32:56 113

原创 垃圾回收算法

原文地址:一篇文章掌握整个JVM,JVM超详细解析!!!_小杰爱吃蛋的博客-CSDN博客_jvm1.引用计数算法每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,计数器为0就代表该对象死亡,这时就应该对这个对象进行垃圾回收操作。优点:引用计数算法的实现简单,判定效率也很高。缺点:很难解决对象之间相互循环引用的问题。2.标记–清除算法为每个对象存储一个标记位,记录.

2022-02-14 20:19:31 47

原创 垃圾回收机制

原文地址:一篇文章掌握整个JVM,JVM超详细解析!!!_小杰爱吃蛋的博客-CSDN博客_jvm1.在 Java 中,堆被划分成两个不同的区域:新生代 、老年代;主要原因是可以根据各个年代的特点进行对象分区存储,更便于回收,采用最适当的收集算法:新生代中,每次垃圾收集时都发现大批对象死去,只有少量对象存活,便采用了复制算法,只需要付出少量存活对象的复制成本就可以完成收集;而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须采用“标记-清理”或者“标记-整理”算法。2.老年代就一个区.

2022-02-14 13:15:58 71

原创 如何判断对象是否存活

1.引用计数法什么是引用计数法:每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,计数器为0就代表该对象死亡优点:引用计数算法的实现简单,判定效率也很高缺点:很难解决对象之间相互循环引用的问题2 .可达性分析法该种方法是从GC Roots开始向下搜索,搜索所走过的路径为引用链。当一个对象到GC Roots没用任何引用链时,则证明此对象是不可用的,表示可以回收。

2022-02-14 09:36:54 141

原创 对象的访问定位

建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有① 使用句柄和② 直接指针两种:1.句柄:如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息2.直接指针:如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而 refere..

2022-02-14 09:36:08 286

原创 对象的内存布局

在 Hotspot 虚拟机中,对象在内存中的布局可以分为 3 块区域:对象头、实例数据和对齐填充。1.Hotspot 虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据(哈希码、GC 分代年龄、锁状态标志等等),另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。2.实例数据部分是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。3.对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。 因为 Hotspot

2022-02-14 09:34:58 209

原创 内存分配方式

为新生对象分配内存时,采用哪种方式,取决于 Java 堆内存是否规整。而 Java 堆内存是否规整,取决于 GC 收集器的算法是"标记-清除",还是"标记-整理"。指针碰撞:1.适用:堆内存规整(没有内存碎片)的情况下2.原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界值指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可3.GC收集器:Serial、ParNew空闲列表:1.适用:堆内存不规整的情况下2.原理:虚拟机会维护一个列表。该列表中会

2022-02-14 09:34:19 94

原创 对象的创建过程

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

2022-02-14 09:33:37 68

原创 JVM运行时数据区

运行时数据区:java运行时的东西是放在哪里的JDK 1.8 之前:JDK 1.8 :线程私有的:程序计数器 虚拟机栈 本地方法栈线程共享的:堆 方法区 直接内存 (非运行时数据区的一部分)方法区:方法区是所有线程共享的内存区域,它用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常。堆:1.java堆是java虚拟机所管理的内存中最大的一块,是被所

2022-02-14 09:32:46 204

原创 选择排序

1.描述从待排序的数组中,找到最小的元素;如果最小元素不是数组的第一个数,将其和第一个数交换;然后从剩下的元素中,继续前述过程,直至排序结束2.代码package sort;import java.util.Arrays;public class selectionSort { public static void main(String[] args) { int[] arr = new int[]{8,5,4,6,2,3,1,9,11}; s

2021-09-29 19:59:44 45

原创 接口和抽象类的区别

继承:抽象类只能单继承,而接口可以多实现;即:一个类只能继承一个抽象类,但是可以implements多个接口;一个类要实现接口的话,要实现接口中的全部方法,而抽象类不一定字段:抽象类可以定义实例字段,接口不能定义实例字段抽象方法:都可以定义抽象方法非抽象方法:抽象类可以定义非抽象方法,而接口中的方法都是抽象的从设计层面来说,抽象类是对类的抽象,是一种模板设计;接口是对行为的抽象,是一种行为的规范...

2021-09-26 11:34:26 101

原创 八大排序总览

2021-09-23 19:47:15 48

原创 快速排序

1.描述挑选出一个数作为“基准”,然后定义左右两个指针,分别从左往右和从右往左遍历,左指针找到比基准数大的数,右指针找到比基准数小的数,然后互换;接着指针顺位移动(注意:右指针应该先移动,为了保证最后基准数的左边都是比它小的),继续比较,直至两个指针相遇,然后将基准数和相遇位置的数互换,此时,基准数的左边都是比它小的数,右边都是比它大的数,然后进行递归,左右两边继续进行,直至排序完成2.代码package paixu;import java.util.Arrays;public cla

2021-09-23 19:36:51 56

原创 冒泡排序

1.描述两层循环相套,外循环作为游标指针,内循环遍历游标指针之前的所有数据,进行两两比较,将最大的数放于最后,结束循环;然后外循环指针前移,内循环重新遍历,直至完成排序2.代码package paixu;public class maopaopaixu { public static void main(String[] args) { int[] arr = new int[]{8,5,4,6,2,3,1,9,11}; BubbleSort(arr

2021-09-23 18:22:42 48

原创 java异常

java异常体系结构Thorwable类是所有异常和错误的父类,其两个子类为Error和Exception,分别表示错误和异常。Error:Error属于程序无法处理的错误 ,我们没办法通过catch来进行捕获 。例如,Java 虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefFoundError)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。Exception...

2021-09-23 11:19:54 42

原创 List、Set、Map的区别

List: 存储的元素是有序的、可重复的。Set: 存储的元素是无序的、不可重复的。Map: 使用键值对(key-value)存储,Key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。...

2021-09-20 16:46:38 54

原创 进程和线程的区别

在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。线程是操作系统中调度的最小任务单位进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。和多线程相比,多进程的缺点在于:创建进程比创建线程开销大,尤其是在Windows系统上

2021-09-20 16:32:20 63

原创 String、StringBuffer 和 StringBuilder 的区别

String类中使用 final 关键字修饰字符数组来保存字符串,private final char value[],所以String对象是不可变的。每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuilder中没有final关键字,每次都会对StringBuilder对象本身进行操作,而不是生成新的对象并改变对象引用。StringBuffer在StringBuilder的基础上...

2021-09-20 16:08:36 37

原创 面向对象和面向过程

面向过程是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。面向过程:面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源面向对象:面向对象易维护、易复用、易扩展。因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。...

2021-09-20 15:54:41 38

原创 类初始化顺序

正常类:静态变量/静态代码块 -> main方法 -> 非静态变量/代码块 -> 构造方法继承类:父类–静态变量/父类–静态初始化块子类–静态变量/子类–静态初始化块父类–变量/父类–初始化块父类–构造器子类–变量/子类–初始化块子类–构造器...

2021-09-20 15:45:46 35

原创 成员变量和局部变量

1.成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰2.成员变量属于对象,对象进堆内存;局部变量属于方法,方法进栈内存3.成员变量:随着对象的创建而存在,随着对象的消失而消失;局部变量:随着方法的调用或代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失4.成员变量:有默认初始值 局部变量:没有默认初始值,使用前需赋值成员变量...

2021-08-26 14:52:05 351

空空如也

空空如也

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

TA关注的人

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