- 博客(28)
- 资源 (1)
- 收藏
- 关注
原创 JVM学习笔记四:各种垃圾收集器的理解
参考资料:《深入理解Java虚拟机——JVM高级特性与最佳实践》-周志明各种垃圾收集器的理解所谓的引用计数法,复制算法,标记清楚,标记整理算法都是垃圾收集的相关的概念,垃圾收集器则是对垃圾收集算法的具体实现Serial收集器简单高效的新生代收集器,现仍用于Client模式下的垃圾收集。它是单线程的收集器(顾名思义串行的),虽然它在进行垃圾收集时会暂停其他用户线程,但是在用户的Client端,一般应用程序的虚拟机不会很大,所以使用serial收集器足够使用了,Client不会感觉到明显的卡顿。
2020-08-20 16:34:48 808
原创 到底为什么TCP建立连接要三次握手,而不是两次或者四次或者其他?
为什么不是两次根本问题就在于:客户端发送了一个请求,因为网络拥堵或者其他原因没有传过去,客户端一直收不到确认。超时重传,并且成功建立连接。此时没有传过去的请求又恢复了发送,服务器认为这是一个正常的新的请求。接受并且发送确认給客户端,但是对于客户端,他真正想要的连接已经建立了,此时再次接受到这个请求他想发送拒绝的请求给服务端,但遗憾的是这时候只有两次握手。不能发送。这个连接就一直占用网络资源,被服...
2020-04-03 15:11:05 387
原创 Spring相关面试题总结(含工厂模式和代理模式的简单释义)
Spring相关面试题总结Spring 概念Spring IOCioc容器ioc的好处ioc怎么实现的?Spring Bean概念和配置方式Spring Bean的作用域有哪几种?Spring 概念Spring是一个轻量级的控制反转和面向切面的容器框架。可以支持任何类型的Java企业级应用的开发。并且可以容易地整合其他开源框架,比如springmvc,mybatis,structs,hiber...
2020-03-28 11:15:38 771
原创 JUC学习笔记六:synchronized和ReentrantLock详解
synchronizedsynchronized关键字是通过jvm实现的在jdk1.6之前:简单粗暴的字节码层面实现同步。如果使用同步代码块,那么就是通过monitorenter和monitorexit指明同步代码块开始和结束的位置,synchronized代码块会维护一个锁计数器,当enter时,先判断计数器是不是0,如果是0就进入,进入之后将计数器加1,在退出时将计数器设为0,表明锁被...
2020-03-15 21:10:14 275
原创 阿里云个人服务器搭建项目笔记八:使用Redis实现分布式锁
因为应用程序服务器有两台,所以如果仅仅在每台机器上面同步时不够的,因为获取到的不是同一把锁。这里使用redis实现分布式锁注意事项使用redis作为分布式锁要注意几点:原理:在redis上面定义一个锁的key,每台应用程序服务器的下单请求先要去redis尝试创建一个锁的key,如果锁的key已经存在,那么说明其他线程已经进入,这个线程就阻塞。如果锁的key不存在,那么就说明锁是可以获取的状...
2020-03-10 11:27:28 286
原创 阿里云个人服务器搭建项目笔记七:nginx lua脚本实战
一、nginx为什么高性能epoll多路复用1.传统模型:基于缓冲区的传输首先,假设这里有两台主机进行通信client ----- server当client要向server传输数据的时候:数据不会直截了当地发到server处,而是先进行一个socket.write操作,并将要发送的数据包放到缓冲区中。如果有一个数据包要发送,这时候缓冲器被占满了,那么tcp/ip会先将缓冲区里面的数据...
2020-03-06 14:49:47 516
原创 正则表达式学习大总结
\d 匹配单个数字\d\d\d 匹配3个数字\d* (星号的用法)匹配0个或多个数字\d+ (加号的用法)匹配1个到多个数字\d{10000} (花括号的用法)匹配一万个数字\d{m,n} 匹配m个到n个数字\d{m, } 匹配m个及以上个的数字\d{0, n} 匹配小于等于n个数字\w 匹配单个字符(字母,数字,下划线)\s 匹配单个空格(普通空格,tab空格...
2020-03-04 18:38:59 187
原创 阿里云个人服务器搭建项目笔记六:商品详情信息缓存策略
一、商品详情页面缓存商品详情页面存入redis缓存中获取商品详情controller接口方法更改//根据商品详情页的id到redis内获取,实现这个功能需要序列化itembo以及itembo内部聚合的killbo itemBO = (ItemBO) redisTemplate.opsForValue().get("item_" + id); ...
2020-03-01 15:54:59 236
原创 MySQL进阶及优化
一、MySQL常用存储引擎进入mysqlshow engines;常用的mysql引擎主要有两种,一种是InnoDB(mysql默认),另一种是MyISAM.显示所有引擎之后从引擎的注释中可以发现,InnoDB是支持事务和外键的并且使用行级锁。而MyISAM不支持事务。除此之外,两个引擎的其他区别如下表:二、MySQL索引...
2020-02-29 20:00:39 462
原创 阿里云个人服务器搭建项目笔记零:基础项目构建流程
应用springboot2,mybaits3开发的前后端分离基础商城项目tips:项目我已经部署到了云端服务器,欢迎给本菜鸡提供宝贵意见~注册入口:点击直接进入注册:http://47.115.19.41/resources/getotp.html本篇README所有内容仅包括基础部分的构建,项目优化的历程放在了我的博客内,不会再到README中更新。项目使用项目根据业务...
2020-02-22 11:40:11 989
原创 阿里云个人服务器搭建项目笔记五:分布式扩展之后的分布式session问题解决
项目添加redis的session依赖将分布式session存储在redis内:打开项目的pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</a...
2020-02-22 10:41:32 259
原创 阿里云个人服务器搭建项目笔记四:nginx反向代理优化,分布式扩展
首先我们需要思考上一个章节并发上不去的原因。发现在并发环境下mysql数据库的压力时钟很大,一台服务器上面不仅仅要跑java的jar包程序,还要承受高并发访问数据库的压力。这样的压力都在同一台服务器上显然存在缺陷。所以我们可以购买多台服务器。一台专门用来部署项目的数据库。两台或多台用来部署项目jar包。一台用来配置部署nginx反向代理。首先这里购买4台服务器,两台跑java,一台部署数据...
2020-02-20 19:57:27 440
原创 java知识补充四:HashMap细节回顾
HashMap的存储方式一般情况下,HashMap是以数组加链表的形式存储的,和数据结构中的散列表的概念基本相同。在java的HashMap中,每一对key-value键值对被看做一对Entry.java会根据entry中的key计算hash值。根据这个hash值计算出哈希表中要存储的哈希桶中,如果计算出不同key的哈希值相同,那么此时就产生了哈希碰撞(哈希冲突)那么在同一哈希桶中以链表形式...
2020-02-19 21:59:17 684
原创 阿里云个人服务器搭建项目笔记三:jemeter工具对项目接口进行并发压测,初步优化。
下载并启动jemeter下载好jemeter5并解压之后,可以先打开jemeter目录下的bin\jmeter.properties文件设置语言:在#language=en下面新加一行添加:language=zh_CN 设置显示中文。然后直接运行jemeter.bat可以直接在windows端打开压测工具。jemeter压测配置jemeter压测主要需要以下配置:线程组:启动多个并发的线...
2020-02-14 10:14:30 529
原创 阿里云个人服务器搭建项目笔记二:springboot项目打包部署到服务器
maven打包:进入项目根目录:踩坑1:mvn clean package,运行target中的jar包java -jar seckill_boot-1.0-SNAPSHOT.jar 报错:jar包中没有主清单属性。原因是这种方式打包的jar没有入口main,也没有各种依赖jar包。需要在pom.xml中导入 <plugin> <groupId...
2020-02-13 17:32:40 237
原创 阿里云个人服务器搭建项目笔记一:云服务器安装并部署jdk, mysql
作为小白一步一步傻瓜式搭建自己的服务器,一步一来吧…购买服务器首先购买阿里云ECS服务器。根据需求购买,最近因为疫情阿里云还有学生活动,学生党学习课程答题可以免费领,这里我购买的是CentOS的系统。配置服务器1.购买服务器之后,会自动创建实例,如果没有的话看看左上角的区域有没有选错。2.系统创建好实例之后,最好重新设置实例密码和远程连接密码。3.重设密码之后,在网络与安全-安全组-配...
2020-02-13 13:38:52 373
原创 java知识补充三:java锁有哪几种?公平/非公平,可重入,递归锁,自旋锁...
公平锁和非公平锁:所谓公平锁就是各个线程争抢锁的时候要按照申请锁的顺序来,不能随意加塞,类似排队打饭 先来后到。非公平锁则相反,谁先抢到锁,谁就先执行,没有抢到,才按照申请锁的顺序来执行。有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象。公平锁/非公平锁的创建:并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公...
2020-02-12 16:10:05 133
原创 java知识补充二:CAS以及产生的的ABA问题
CAS概念:之前复习volatile关键字的时候,指出volatile不保证原子性。但是使用Atomic包内的类可以保证其原子性。CAS: Compare And Swap 比较并交换,即java.util.concurrent.atomic下的AtomicXxxx类里面定义的各种比较并交换方法。CAS的全称为Compare-And-Swap ,它是一条CPU并发原语.它的功能是判断内存某...
2020-02-11 16:30:01 160
原创 java知识补充一:volatile关键字
说到volatile关键字,第一反应就是三点:保证可见性不保证原子性禁止指令重排概括:它是java虚拟机提供的一个轻量级的同步机制,基本上遵守了jmm的规范,它保证可见性,不保证原子性,保证有序性。下面将一一展开学习volatile关键字的使用及原理:可见性JMM:java内存模型JMM(Java内存模型Java Memory Model)本身是一种抽象的概念 并不真实存在,它...
2020-02-10 22:41:26 153
原创 JVM学习笔记三:JVM堆内存调优(初步)
永久代大小在Java8中,永久代已经被移除,被一个称为元空间的区域所取代。元空间的本质和永久代类似。元空间与永久代之间最大的区别在于:永久带使用的JVM的堆内存,但是java8以后的元空间并不在虚拟机中而是使用本机物理内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据...
2020-02-10 17:04:58 186
原创 JVM学习笔记二:JVM堆
概述堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三部分:新生区 young老年区 old永久区 perm下图是更加详细的分区:新生区 young新生区概述:新生区当中包括eden区,from区和to区(from和to即两个幸存者区)因为young区的GC为复制算法,所以有两块f...
2020-02-10 12:32:10 435
原创 leetcode #31 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1来源:力扣(LeetCode)链接:https://lee...
2020-02-10 11:08:59 117
原创 JVM学习笔记一:JVM体系结构概览
一、jvm总览:jvm的位置:在运行操作系统上,与硬件没有直接的交互。jvm与操作系统,底层硬件三者的关系如下:下面是JVM虚拟机的结构图:方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序计数器是运行是线程私有的内存区域。下面几个部分逐个对上图的各个部分进行剖析:二、类加载器Class Loader类加载器负责加载class文件,class文件在文件开头有特定的...
2020-02-09 20:13:10 196
原创 JUC学习笔记四:ThreadPool线程池
一、ThreadPool线程池线程池的优势:在多核cpu没有普及的年代,单核cpu就像是假的多线程。一个cpu需要在多个线程之间来回切换。现在的多核电脑,多个线程可以各自跑在独立的CPU上,不用切换,效率高。线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务...
2020-02-07 21:15:11 208
原创 JUC学习笔记二:线程间的通信;同步方法锁的理解;juc集合类简介
线程间的通信之while防止虚假唤醒在对多个线程操作共享数据的逻辑进行同步时,要避免使用if判断的方式使某线程进入waiting状态,要改为使用while。原因是while可以防止虚假唤醒:用if使线程进入waiting可能会使判断过的正在等待被唤醒的线程直接进入,不管符不符合if的条件;而while则会重新判断当前正在waiting的线程是否符合while()内的条件,保证多个线程之间不会有...
2020-02-06 12:16:51 246
原创 JUC学习笔记一:复习多线程操作资源类的方法
高内聚,低耦合所谓高内聚,低耦合就是每个程序要实现的特定功能要尽量多的在自己的内部完成,对外部提供很少量的接口以便调用。并行和并发并行即多个任务在自己的分配的各自的资源上执行,即多个任务同时跑,互不冲突。并发即多个任务在统一的一个资源内执行,多个任务会抢占同一资源,在cpu中体现为交替执行,并不能同时执行,但是cpu在多个线程中切换的速度会非常快,所以宏观上看似是同时的。最大的区别体现在...
2020-02-04 21:32:19 823 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人