- 博客(110)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 jdk1.8之后的String.intern()方法内存分析
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样才能搞懂1.字符串常量池划分jvm对字符串常量池在不同jkd版本有不同的划分,这里用hotspot来分析,文章后部分会使用,主要有以下三种方式大致划分为这几个部分...
2020-04-05 14:10:55
2124
10
原创 Springboot:ajax向后台传送数据,后台无法接收
js代码: keys = serialKeys.split(","); jQuery.ajax({ type: 'post', url: "/wms/common/validity/updateValidity?"+inforUrl, data : { 'keys' : keys }, });controller: @RequestMapping(value = "updateValidity")
2021-03-18 17:50:09
566
原创 Docker镜像加载原理,通俗易懂
docker镜像大家都知道,就是一个个独立的软件包,包含某个软件所需的代码,环境,配置文件等,其实镜像实际上是由一层一层的文件系统组成,这个文件系统就是联合文件系统(UnionFS),这里简单说一下这个联合文件系统,简单来说,我们每次去pull一个应用(在linux中,一切皆文件),都是分层来的,比如:每个文件叠加过后就是我们的应用,虽然是叠加而来,但是对外却是一个整体的系统文件,这是我们docker镜像基础Docker镜像加载原理简单介绍这个图:bootfs(boot file syste
2020-08-13 13:07:56
1543
1
原创 centos宿主机无法ping通docker容器以及dockers容器curl: (56) Recv failure: Connection reset by peer问题解决
今天在测试docker容器时,本来配置的一切都挺顺利,放出我的测试经过:docker run -d --name nginx05 -p 3344:80 nginx然后这个nginx就在后台启动了,我接着使用命令curl localhost:3344结果给我报错:curl: (56) Recv failure: Connection reset by peer并且在linux上自带的火狐浏览器访问都不能成功!!!!百度了很多都没有解决,花了一个下午的时间,模模糊糊的大概知道了docker是运行
2020-08-12 23:32:53
7410
19
原创 RabbitMQ安装错误:libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed by erlang-22.0.7-1.el7.x86_6
Erlang rpm包安装过程出现的这个错误,出现这个错误的主要原因是没有libcrypto.so.10(OPENSSL_1.0.2)(64bit)依赖,我们去下载一个就可以了下载地址:libcrypto.so.10(OPENSSL_1.0.2)(64bit)下载最后一个下载完成后传输到我们的centos上,使用命令rpm -ivh openssl-libs-1.0.2k-12.el7.x86_64.rpm --force完成后再次安装erlang就可成功[root@localhost op
2020-08-11 11:27:22
10487
3
原创 Redis配置文件
文章目录1.网络2.通用配置3.快照4.安全5.客户端6.APPEND ONLY模式 aof配置1.网络2.通用配置3.快照4.安全requirepass foobared5.客户端6.APPEND ONLY模式 aof配置
2020-07-28 21:14:30
139
原创 Redis事务
首先我们都知道mysql的事务特性ACID:原子性(Atomicity,或称不可分割性)、一致性(Consistency)隔离性(Isolation)持久性(Durability)Redis与mysql不同,redis的事务是一组命令的集合,然后将该事务放入队列中,按照命令顺序执行根据这个特性,redis事务有以下特点:一次性,顺序性,排他性,redis的单条命令保证原子性,但是redis事务不保证原子性,且没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行的命令时才会
2020-07-28 17:38:46
142
原创 Redis入门
文章目录1.什么是NoSQL1.1NoSQL的特点2.NoSql的四大分类2.2 对比3.Redis概述4.基本知识5.RedisKey的基本命令5.1String5.2List5.3Set5.4Hash5.5 Zset(有序集合)截取自B站狂神说1.什么是NoSQL1.1NoSQL的特点2.NoSql的四大分类2.2 对比3.Redis概述4.基本知识1.有16个数据库,默认用的是第0个数据库2.查看数据库大小,DBSIZE3.清除当前数据库4.清除所有数据库:F
2020-07-28 16:48:11
236
原创 CentOS7使用yum提示Trying other mirror
使用命令 yum install XXX ,偶尔会遇到找不到资源的情况,yum源更换为国内的阿里云源即可方法如下1、备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/CentOS 5wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun
2020-07-27 18:21:33
6703
1
原创 redis-6版本之后报错server.c:xxxx:xx: error: ‘xxxxxxxx’ has no member named ‘xxxxx’
出现此原因的错误是版本不一致的问题,centos7默认gcc版本是4.8.5,但是这个版本只适用于redis6以前的版本,redis6之后就会报错:server.c:5101:19: error: ‘struct redisServer’ has no member named ‘sofd’ if (server.sofd > 0) ^server.c:5102:94: error: ‘struct redisServer’ has no.
2020-07-27 18:18:24
1856
原创 CentOS7无法联网问题
1.编辑虚拟机设置2.设置网络适配为NAT模式3.进入centOS设置输入以下命令:ls /etc/sysconfig/network-scripts然后继续输入:vi /etc/sysconfig/network-scripts/ifcfg-ens33只用把ONBOOT=no改为yes即可 然后点击esc,键入:wq保存并退出为了保险起见,编辑 /etc/resolv.conf 在nameserver后面加上虚拟机的ip地址(通过 ip addr查看)...
2020-07-27 18:12:41
257
原创 Spring-bean的生命周期,注解版
由于本人能力有限不能深入源码讲解,这里知识粗略的介绍一下bean的生命周期,先看一下图:用简单的话来说就是:第一步:通过构造器创建bean实例,默认是无参构造器第二步:设置bean的属性值和引入其他的bean(spring的循环依赖),如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID),如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身,由于我们是通过@value
2020-06-29 22:52:35
649
原创 order by是否会产生文件类排序
建表SQL:案例case1:case2:通过这两个案例,我们发现只要order by满足最佳左前缀法则,就可以使用到索引总结:
2020-06-26 19:53:11
241
原创 索引优化,如何避免索引失效
索引失效的前提是建立索引,并且在一定情况下索引失效不起作用了,下面列出的就是避免索引失效的十种情况这里说一下全值匹配和最佳左前缀法则:全值匹配的意思是查找的字段顺序和个数与索引的列的个数和顺序一致我们发现只要索引中第一列没有或者缺少某个复合索引中的索引列都会导致索引失效,这是因为违反了最佳左前缀法则导致的,所以我们在写SQL时最好讲where后的查询列的个数顺序与复合索引的个数顺序一致链接:最佳左前缀法则有的小伙伴在测试的时候会出现明明违反了最佳左前缀法则仍然能够用上索引,建议看一看这篇文章
2020-06-26 15:25:26
566
原创 MySQL索引优化案例
文章目录1.range导致索引失效2.两表优化3.三表优化1.range导致索引失效针对这样的sql语句,它属于article表,并且事先准备了索引:cteate index idx_article_ccv on article(category_id,comments,views);我们执行上面的explain会出现以下结果:原因:解决:重新建立索引,先删除原来的索引drop index idx_article_ccv on article,然后建立新的索引:cteate index
2020-06-26 10:42:48
197
原创 Mysql-Explain用法详解
文章目录1.Explain能干嘛2.Explain包含的表头信息3.Explain-id(表的读取顺序)3.1 id相同3.2 id不同3.3 id相同又不同4. Explain-Select_type(数据读取操作的操作类型)5. Table6. Type7. possible_keys和key使用方式:Explain + SQL语句1.Explain能干嘛2.Explain包含的表头信息3.Explain-id(表的读取顺序)这里的id不是主键,它是一组数字12345这种,表示我们进行表
2020-06-25 14:47:22
458
原创 Mysql-索引
文章目录1.什么是索引?为什么要建立索引?2.哪些情况需要建立索引3.哪些情况不需要建立索引4.索引有哪几种类型5.建立索引命令6.索引结构和检索原理7.索引使用场景1.什么是索引?为什么要建立索引?简介:数据库系统除了维护一张表的数据,还维护着一个满足特定查找算法的数据结构,这种数据结构就是索引,索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置
2020-06-25 11:50:22
224
原创 ConcurrentHashMap和HashMap,HashTable的区别
文章目录1.为什么要使用ConcurrentHashMap1.为什么要使用ConcurrentHashMap由于HashMap的线程不安全:HashMap多线程死循环问题,在多线程环境下并不会使用HashMap,虽然HashTable是线程安全的,但是它的类似put,get方法都是Synchronized修饰的,并发效率十分低下,在这个时候就需要用到ConcurrentHashMap来解决并发条件下HashTable效率低下的问题了ConcurrentHashMap在jdk1.7和jdk1.8中的不同
2020-06-21 21:35:49
311
原创 整理Java基础知识遇到的问题
文章目录1.jdk1.5之后的三大版本2.JVM、JRE和JDK的关系3.java的跨平台性4.关于java的平台无关性5.java为什么要有字节码文件1.jdk1.5之后的三大版本Java SE(J2SE,Java 2 Platform Standard Edition,标准版)JavaSE是Java中的基础部分,不du过后来的各种框架zhi,各种产品都是基于JavaSE,也就是daoJavaSE是java向上发展的基础,Java任何高级产品的底层基础都是JavaSE,所以如果要学习,把它学扎实
2020-06-21 13:31:50
346
原创 整理了一篇关于java集合的文章,有图有真相
文章目录1.概述2.集合框架图2.1 Collection系2.2 Map系3.Collection接口4.Foreach与迭代器4.1迭代器执行原理4.2使用for循环还是迭代器Iterator对比5.List5.1 List概述5.2 ArrayList5.3 LinkedList5.4 Vector5.5 ArrayList和LinkedList5.6 ArrayList和Vector6.Set6.1 概述6.2 HashSet6.3 LinkedHashSet6.4 TreeSet7.List和Se
2020-06-19 23:08:37
391
原创 springMVC处理一个请求的过程-源码详解
文章目录1.springMVC如何寻找对应的controller?2.将method封装到map中2.适配器处理3.处理Handler的参数4.参数处理细节总结:贴上我们用来测试的代码:很简单,就是一个注解的controller,只要从浏览器输入对应的路径,这个方法就会拦截这个请求,进而开始具体的处理1.springMVC如何寻找对应的controller?我们先列出大概的流程,之后会进行详解springmvc中最重要的就是前端处理器,也就是DispatcherServlet了,它会拦截浏
2020-06-17 22:53:23
408
原创 spring如何初始化一个bean
我们都知道,在创建一个spring应用的时候,通过构建spring容器,根据容器获取bean,那么spring是如何创建bean的呢?首先在创建bean容器时,通过上下文也就是非BeanFactory创建时,被标记的java对象就会在容器创建时被创建,如代码所示:ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");IAccountDao adao = ac.getBean("accountDao",IAccount
2020-06-13 21:40:28
1425
原创 三层架构和MVC的区别
1.三层架构三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。表现层(User Interface layer):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得业务逻辑层(Business Logic Layer):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。数据访问层(Data access layer)
2020-06-13 12:47:46
1009
原创 mybatis源码解析-如何执行查询操作
//1.通过输入流解析xml配置文件InputStream inputstream = Resources.getResourceAsStream("xxx.xml")SqlsessionFactory sqlsessionfactory = new SqlsessionFactoryBuilder().build(inputstream);//2.获取和数据库的链接,创建会话SqlSession openSession = sqlsessionfactory.openSession();//3.
2020-06-07 19:41:11
312
原创 mybatis源码解析-getMapper
之前两篇文章:mybatis源码解析-SqlsessionFactorymybatis源码解析-获取Sqlsession介绍了在mybatis运行中的前两步的执行过程和原理,继续摆出我们的demo://1.通过输入流解析xml配置文件InputStream inputstream = Resources.getResourceAsStream("xxx.xml")SqlsessionFactory sqlsessionfactory = new SqlsessionFactoryBuilder(
2020-06-07 16:45:00
264
原创 mybatis源码解析-获取Sqlsession
上篇文章讲了mybatis是怎么创建SqlSessionFactory的:mybatis源码解析-SqlsessionFactory,简单来说就是通过构造模式读取xml配置文件封装到Configuration对象中,返回一个默认的DefaultSqlSessionFactory对象,需要注意的是我们写的每一个mapper映射文件在配置类中定义好了之后会被解析进Configuration中,并且mapper映射文件中的增删改查标签都有与之对应的MappedStatement对象封装,我们还是摆出hello w
2020-06-07 16:12:00
226
原创 mybatis源码解析-SqlsessionFactory
我们通过hello world来调试mybatis源码,先写一段伪代码://1.通过输入流解析xml配置文件InputStream inputstream = Resources.getResourceAsStream("xxx.xml")SqlsessionFactory sqlsessionfactory = new SqlsessionFactoryBuilder().build(inputstream);//2.获取和数据库的链接,创建会话SqlSession openSession =
2020-06-07 10:20:35
256
原创 强引用,软引用,弱引用,虚引用
文章目录1.强引用2.软引用3.弱引用4.虚引用JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用,软引用,弱引用,虚引用4种,这四种引用强度依次逐渐减弱,除了强引用外,其他三种引用类型都在java,lang包下,可直接使用简单介绍下四种引用:强引用:类似Object obj = new Object();这种引用关系就叫做强引用,无论在任何情况下,只要强引用关系还在,垃圾收集器就永远不会回收掉被引用的对象软引用:在系统发生内存溢出之前,将会把这些对象列入回收范围中进行第二次回收
2020-05-27 20:26:46
183
原创 垃圾回收的并发和并行
与多线程同理,并行和并发在垃圾收集器可以做出如下解释:并行(Parallel)指多条垃圾收集线程并行工作,此时用户线程仍处于等待状态,此工作方式的垃圾收集器有:ParNew,Parallel,Scavenge,Parallel Old串行(Serial)单线程执行并发(Concurrent)指同一时间段内,用户线程与垃圾收集线程同时执行,但是我们说过,程序触发GC时,会同时触发STW,所以还是会出现只有垃圾回收线程单独执行的情况,比如:CMS和G1垃圾收集器...
2020-05-27 16:10:38
473
原创 怎么理解内存溢出和内存泄漏
内存溢出(OOM)内存溢出是引发程序崩溃的罪魁祸首之一,当应用程序内存增长速度非常快,造成的垃圾速度已经跟不上内存消耗的速度,容易出现内存溢出问题,大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就触发Full GC,这时候会回收大量的内存,供程序继续使用javadoc对OutOfMemoryError的解释是:没有空闲内存,并且垃圾回收器也无法提供更多内存没有空闲内存一般有两种情况:Java虚拟机的堆内存设置不够代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用),
2020-05-27 15:37:41
504
原创 关于GC垃圾回收及其算法的一点思考
在学过java一些有关GC以及相关算法后,对一些概念以及GC与垃圾回收算法的关系有点混乱,觉得有必要好好总结一下了,虽然GC诞生的时间比java早,并且GC并不是java语言所独有的,但垃圾收集机制是java语言的招牌能力,极大的提高了开发效率,并且成为现代语言的标配,因此我们必须深入学习java的垃圾收集机制1.什么是GC,什么是垃圾,为什么需要GCGC是指垃圾回收机制,所谓垃圾是指在运行程序中没有任何指针指向的对象当一个对象不能再被复后续程序所引用到时,这个对象所占用的内存空间就没有存在的意义了,
2020-05-24 19:10:29
296
原创 垃圾收集算法-如何判定对象死亡
在堆中存放着几乎所有的java对象实例,在GC执行垃圾回收之前,首先要区分出那些对象存活,哪些对象死亡,只有被标记为死亡的对象,GC才会在垃圾回收时释放其所占用的内存空间,这个过程被称为垃圾标记阶段在jvm中,当一个对象已经不再被任何存活的对象继续引用时,就可以被宣判死亡,判断对象存活一般有两种方式:引用计数法可达性算法1.不被java采用的引用计数法引用计数法(Reference Counting),其实现过程相对简单:对每个对象保存一个整形引用计算器属性,用于记录对象被引用的情况,举个例子
2020-05-24 12:22:25
278
原创 字符串变量拼接底层原理
与字面量的字符串拼接不同,有变量的字符串拼接要复杂得多,非常有必要进行研究public static void main(String[] args){ String s1 = "a"; String s2 = "b"; String s3 = "ab"; String s4 = s1 + s2; System.out.println(s4 == s3); }程序运行结果是false,至于底层是怎样进行操作的,我们
2020-05-23 21:58:02
665
2
原创 jvm执行引擎:后端编译的运行过程和原理
文章目录1.概述2.解释器和编译器概述3.java是半编译半解释型语言3.1关于java跨平台性的补充4.HotSpot中的解释器和JIT编译器5.判断是否使用JIT编译器5.1方法调用计数器5.2热度衰减5.3设置程序执行方式6.JIT编译器分类1.概述jvm将java字节码文件转换为与当前平台相关的二进制机器码的过程,是由jvm中的执行引擎来处理,与javac将java文件转化为.class文件的前端编译不同,javac并不处于jvm体系,且执行引擎是java虚拟机核心组成部分之一,它的任务是将字节
2020-05-23 16:31:39
510
原创 jvm中对象是怎么存储的,对象的内存布局是怎样的
对象通过new,反射,clone等方式创建完毕后被存储到堆中,那么对象是以什么样的方式存储在堆中的?对象的内存布局对象在堆内存的内存布局主要有三部分,即对象头,实例数据,对其填充对象头对象头主要包含两部分的内容,一个叫运行时元数据(mark word),一个叫类型指针1.运行时元数据:哈希值(hashcode):对象在堆空间中都有一个首地址值,栈空间的引用根据这个地址指向堆中的对象,这就是哈希值起的作用GC分代年龄:对象首先是在Eden中创建的,在经过多次GC后,如果没有被进行回收,就会在
2020-05-23 09:40:33
1371
1
原创 方法区的垃圾回收
在《java虚拟机规范》中,并没有强制要求堆方法区实现垃圾回收,不同落地实现的虚拟机可以选择实现或者不实现方法区的垃圾回收,要是不实现垃圾回收的话,那么方法区就成真正意义上的‘永久代’了,对于Hotspot虚拟机来说,它是实现了方法区的垃圾回收的一般来说方法区的回收效果比较令人满意,尤其是类型的卸载,条件非常苛刻,但是是必要的,方法区的垃圾收集主要分为两部分内容:常量池中废弃的常量不再使用的类型首先我们需要知道,方法区内常量池中存放的两大类常量,字面量和符号引用,字面量比较接近于java语言层次
2020-05-22 22:39:23
315
原创 jvm-堆详解
文章目录1.堆概述2.堆内存细分2.1设置堆内存大小2.2新生代和老年代3.对象分配过程3.1对象分配特殊情况4.几种垃圾收集比较4.1Minor GC4.2Major GC4.3Full GC5.为什么要分代6.本地线程缓冲TLAB6.1为什么要有TLAB(Thread Local Allocation Buffer)6.2什么是TLAB7.堆是否是对象存储的唯一选择7.1逃逸分析7.2栈上分配7.3同步省略7.4标量分配1.堆概述方法区和堆是线程共享的,是每个进程唯一的,一个java程序对应一个进
2020-05-22 17:08:27
681
1
原创 深入剖析ThreadLocal线程局部变量
文章目录1.简介2.每个线程的变量副本是存储在哪里的3.通过源码分析ThreadLocal具体实怎样工作的3.1set方法3.2get方法4.变量副本【每个线程中保存的那个map中的变量】是怎么声明和初始化的5.不同的线程局部变量,比如说声明了n个(n>=2)这样的线程局部变量threadlocal,那么在Thread中的threadlocals中是怎么存储的呢?threadlocalmap中是怎么操作的?6.总结1.简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行
2020-05-21 22:38:13
436
原创 java并发-走近Callable和Future
1.Callable与Runnable类似,可以执行线程,与Runnable不同的是,它不是调用run方法,而是调用call方法,可以抛出异常,并且有返回值:public interface Callable<V> { V call() throws Exception;}返回值和参数类型保持一致我们搭建一个小的Demo来演示怎么使用callable接口public class callableTest { public static void main(Str
2020-05-21 21:26:39
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人