自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 十种常见的垃圾回收器简介

十种常见的垃圾回收器:Serial、SerialOld、ParallelScavenger、ParallelOld、ParNew、CMS、G1、ZGC、Shenandoah、Epsilon。Serial、SerialOld、ParallelScavenger、ParNew、CMS在物理和逻辑上都分代。G1只在逻辑上分代,物理上不分代。ZGC、Shenandoah逻辑和物理上都不分代。Epsilon是jdk11提出debug使用的,不用考虑。Serial、ParallelScavenger、ParNe

2020-12-22 14:57:56 7075 1

原创 面试题:Object o= new Object()在内存中占用多少字节?

面试题如下:请解释一下对象的创建过程?对象在内存中的存储布局?对象头具体包括什么?对象怎么定位?对象怎么分配?Object o = new Object()在内存中占用多少字节?================================================对象的创建过程:类加载: a.class loading;b.class linking:verification、preparation、resolution;c.class initializing(类的

2020-12-21 11:26:17 696 1

原创 redis之布隆过滤器

服务器环境:CentOS 7Redis版本:Redis 6.0.9布隆过滤器的安装:下载,找一个放软件的目录,执行如下命令。 wget https://codeload.github.com/RedisBloom/RedisBloom/zip/master 这样下载回来的文件是zip格式的,解压文件 unzip master 打开解压后的文件夹,执行make命令。 cd RedisBloom-master/make 会得到如下一个文件。 可以移动这个文件

2020-12-18 16:52:54 214

原创 浅谈MySQL的最左匹配和索引下推

这两个名词都是针对组合索引的,所以先看一下表的结构和表的索引。含有由ename列和job列的组合索引最左匹配:因为设置组合索引的时候,先ename列,再job列,所以若想使用这个组合索引,where条件里必须存在ename列,这种行为就是最左匹配。如下图所示,在1、2、3的执行计划中,type的值都是ref,关于ref的解释,拿了一段官方的解释放在示例图下了。大概意思就是type为ref的表示该sql语句使用了索引,但是在4的执行计划中,type的值为all,all的意思为全表扫描,没有使用任何

2020-12-18 11:03:21 468

原创 redis中value类型为sorted_Set的一些常用命令

可以通过help命令查看一下这种数据类型有哪些命令,如下图:一.ZADD:添加元素。这里面关于元素的添加,不单是元素还包含改元素在需要哪个维度排序对应的分值。比如一个水果合集,包含苹果、香蕉、梨,希望在价格方面做一下排序,苹果4块钱,香蕉10块钱,梨6块钱,这个时候应该如下添加:二.ZREVRANGE:反向排序显示显示如下:问题:价格由低到高,显示前两种水果。方案:有如下两种展示方式,按照之前设定的值,应该显示为苹果、梨。这里的原因是物理内存是左小右大的,该链表底

2020-12-17 16:03:42 118

原创 简述redis的击穿、穿透和雪崩

击穿、穿透和雪崩都是在redis作为缓存时发生的。当redis作为缓存的时候,key是会过期,可能是因为到了过期时间,或者因为LRU/LFU。=================================================================================================================击穿:产生原因:由于key过期了,造成了并发的访问数据库,这种现象叫做击穿。这种并发必须是高并发。解决思路:目的是阻止并发到

2020-12-16 17:51:53 374

原创 LRU算法原理简述

LRU(LeastRecentlyUsed):一种比较常见的缓存算法,也是内存管理使用的一种算法。在内存满的时候,会通过LRU找到最不常用的内存页,将这个内存页放入SWAP分区。这是力扣的第146题,下面简单讲一下思路。正文:数据的存储,有两个思路,一个是使用数组,另外一个是使用链表。首先可以使用数组存储这些数据,然后在每个数据上加一个时间戳,这样循环遍历一次,便可以取出最不常用的数据。如下图,但这样设计的复杂度为O(n)。所以通过数组是无法实现的。既然数组无法实现,那就考虑一下.

2020-12-15 18:48:00 1152

原创 Linux IO的发展过程

BIO:多个请求并发时,会产生多个线程,单核cpu时,内核同一时刻只能处理1个线程,早期的socket是阻塞的(blockingIO-BIO)。线程之前的切换回消耗cpu资源,所以早期BIO时代,计算机硬件很难被利用起来。产生的问题:计算机硬件很难被利用起来,于是产生了NIO时代。NIO:这个时候内核是可以非阻塞的处理socket请求,当socket变成了非阻塞的时候,就可以使用一个线程/进程轮询处理,此时的轮询过程发生在用户空间。这个时期是同步的,因为遍历和处理都是自己完成的,所以

2020-12-09 18:58:30 266 1

原创 零拷贝(sendfile)原理简述

服务器版本:Centos6首先安装一下帮助页,命令:yum install man man-pages;安装成功后,先看一下sendfile的命令帮助(man 2 sendfile)通过看帮助页,可以知道sendfile这个命令需要输入一个输入的文件描述符和一个输出的文件描述符。下面我们通过画图简单描述一下零拷贝的过程。将txt文本产生的文件IO称为fd1,把通过网络产生的socketIO称为fd2。常规的拷贝过程:txt文件数据先到内核的buffer缓冲区,然后内核调用re

2020-12-09 17:15:58 757 2

原创 关于mybatis的if/choose标签中test多条件判断,出现的Bug修复

问题背景: 框架:Springboot 数据库:Oracle 问题描述:有这样一个属性A:当A的值为N时,去数据库条件查找条件列A值为N或者空的值;当A的值为Y时,去数据库条件查找条件列A值为Y的值;xml中写法如下:然后运行抛出如下异常:然后有点懵了,并没有number类型的变量出现啊。然后去查了一下资料,发现了原因:mybatis是用OGNL表达式来解析的,'N'会被解析成字符,由于java是强类型的,char 和 一个string 会导致不等,所以发现...

2020-11-12 15:37:23 1627

原创 redis中value类型为hash的一些常用命令

redis是一个键值对,value是hash的,就是value自身也是键值对。首先通过help简单看一下关于hash有哪些命令:一.hset:设置 key 指定的哈希集中指定字段的值。只能设置一个。二.hmset:设置 key 指定的哈希集中指定字段的值。可以设置多个三.hget:返回 key 指定的哈希集中该字段(一个)所关联的值。四.hmget:返回 key 指定的哈希集中指定字段(多个)的值。五.hkeys:返回 key 指定的哈希集中.

2020-10-23 15:03:58 686

原创 redis中value类型为set的一些常用命令

首先还是看帮助,先概率的看一下set分组下的所有命令:之前说了list,现在说set,两者的区别:list是有序的,并且可重复;set无序,去重。一.sadd/srem:添加/删除元素添加元素的时候,是有重复数据的,但是set会去重,smembers 显示全部的元素srem 删除元素,返回的是成功删除的元素个数,因为没有元素7,所以只删除了元素1和元素4二.sinter:返回两个set集合的交集这里还有一个延伸的命令sinterstore,将交集的结果存入另外

2020-10-22 16:22:46 843

原创 redis中value类型为list的常用命令

可以通过 help @list 查看一下关于list的命令:一.lpush/rpush:将所有指定的值从指定方向插入存储在的列表的开头key其中lpush是从左边插入,rpush是从右边插入,使用方法如下:这个是可以验证的,先来了解一下lrange命令,查看指定范围内的元素。之前说过redis是有正反索引的,所以可以通过lrange key 0 -1 查看所有的元素。因为插入方向不同,元素所在的索引值是不同。二.lpop/rpop:指定方向上删除并返回一个元素lp

2020-10-22 14:18:44 1596

原创 关于redis的type和object encoding

redis 的value类型有5种:=================================我是分隔符======================================================首先看一个例子:mset是string分组下的,也就是说通过mset的value值,都是string类型。通过type命令可以看到数据的类型,发现k1和k2都为string类型。使用object encoding查看k1和k2的编码方式,k

2020-10-20 14:00:00 926 2

原创 Redis关于String类型的value值常用命令操作

系统:linux版本:Redis-5.0.4使用命令help @string查看String类型的value值有哪些命令,命令有很多,今天简单几种常用的。1.set命令:set后面除了接key值value值之外,还可以接延迟时间和NX/XX。首先设置k1的值为hello,然后设置k1的值为world 并后缀nx,发现k1的值,并没有任何变化。设置k1的值为world 并后缀xx,发现k1的值改变为world。set k1 world nx:如果不存在k1,那么设置k1的值为w

2020-10-20 11:17:11 3108

原创 关于Java部署后,控制台中文乱码问题。

项目背景:Springboot+Maven,使用Jenkins部署在Linux上。问题描述:idea本地测试,控制台System.out.print显示无异常,Slf4j日志显示无异常。Jenkins部署jar包启动后,log文件中System.out.print显示中文乱码,Slf4j中log显示中文无异常。分析一:查看linux的编码(使用命令),发现无异常,为UTF-8。在Jenkins中设置java 启动项 -Dfile.encoding=UTF-8重新部署启动,问题依然

2020-09-23 14:45:42 629 1

原创 JAVA的内存模型

本文主要以jdk8为基础,简单陈述一下JMM,下图,是我根据jvms8简单画的一个图。下面详细介绍一下java的运行时数据区:1.The pc Registe(程序计数器) jvm支持多个线程同时运行,每一个jvm线程都有自己的程序计数器。值得注意的是pc中存放的是指令的位置,如果将要执行的方法是被native修饰的,那么pc是undefined。线程从pc中获取位置,然后找到该位置对应的指令,然后执行指令。pc的空间是足够大的,不会溢出(The JavaVirtual Machi...

2020-09-18 14:37:33 99

原创 浅谈MySQL的回表和覆盖索引

MySQL比较常见的三种存储引擎:InnoDB、MyISAM、Memory。这三种引擎实现索引的方式不太相同,InnoDB、MyISAM使用的是B+树,Memory使用的是哈希索引。虽然InnoDB、MyISAM都使用的是B+树,但两者还是不完全相同的。InnoDB中,主键索引的B+树叶子节点存储的是整行数据。MyISAM主键索引的B+树叶子节点存储的是整行数据所在内存中的地址。回表&覆盖索引: 用一个简单的例子来说明。创建一张表emp,如下图。 给ena...

2020-09-11 14:25:30 1378

原创 一件关于Integer有意思的事情

下面是一个关于Integer比较有意思的现象:public class IntegerTest { public static void main(String[] args) { Integer num1 = 1000, num2 = 1000; System.out.println(num1 == num2);//false num1 = 100; num2 = 100; System.out.println

2020-09-04 10:30:46 88

原创 深入解析一道关于String面试题(字节码/ByteCode)

这是一个比较常见的关于字符串的面试题,如下: public static void main(String[] args) { String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo"; String s4 = "Hel" + new String("lo"); String s5 = new String("Hello");

2020-08-28 19:16:02 310

原创 DCL单例(双重检查单例)是否需要加volatile?为什么?

答案是肯定的要说明具体原因,需要先了解以下几点。一.对象的创建过程:以Object的创建作为例子,创建对象一共五个步骤:new:分配内存。 dup:复制一份刚刚创建的内存空间的引用,并压栈。(此时栈中有两个内存空间的引用)。 invokespecial:取出一个引用,调用init方法,这里就指构造函数,到这一步,完成了对象的new Object()过程。 astore_1:将栈顶的引用的值赋值给局部变量表角标为1的变量。当前是main方法,局部变量有两个,角标为0的是args,角...

2020-08-21 16:22:18 495

原创 关于excel表格的导入导出(java)

第一次写,不知道分享什么,思来想去,觉得分享一个小工具吧。---------------------------------------------------------我是分隔符----------------------------------------------importjava.io.InputStream;import java.io.OutputStream

2018-01-31 14:28:49 328

空空如也

空空如也

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

TA关注的人

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