- 博客(182)
- 收藏
- 关注
原创 Docker的工作原理
Docker能做什么?比较Docker和虚拟机技术的不同:传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。容器内的应用直接运行在宿主机的上,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了。每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。Docker是怎么工作的?Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。Docker-Server接收到Dock
2020-10-27 20:13:12
5136
原创 JVM--垃圾回收机制--04垃圾回收器详解
文章目录一、GC分类与性能指标二、不同的垃圾回收器概述三、Serial回收器:串行回收四、ParNew回收器:并行回收五、Parallel回收器:吞吐量优先六、CMS回收器:低延迟七、G1回收器:区域化分代式八、垃圾回收器总结九、GC日志分析十、垃圾回收器的新发展一、GC分类与性能指标按线程数分,GC可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用内存等硬件
2020-10-27 17:34:16
397
原创 JVM--垃圾回收机制--03相关概念
文章目录一、System.gc()的理解二、内存溢出与内存泄漏三、Stop The World四、垃圾回收的并行与并发并发五、安全点与安全区域六、再谈引用1. 强引用-- 不回收2. 软引用--内存不足即回收3. 弱引用--发现即回收4. 虚引用--对象回收跟踪5. 终结器一、System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。Syste
2020-10-13 20:51:27
277
原创 JVM--垃圾回收机制--02相关算法
一、垃圾回收相关算法垃圾标记阶段:对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。1. 标记阶段:引用计数算法(java没有采用)引用计数算法比较简单,对每个对
2020-10-07 16:32:18
256
原创 JVM--垃圾回收机制--01概述
垃圾回收概述1. 什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空 间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。关于垃圾收集有三个经典问题:➢哪些内存需要回收?➢什么时候回收?➢如何回收?2. 为什么需要GC对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一
2020-10-06 15:30:46
293
原创 JVM--字符串常量池--StringTable(重要)
一、String是基本特性String声明为final的, 不可被继承。String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小。String在jdk8及以前内部定义了final char[],value用于存储字符串数据。jdk9时改为byte[]。String不用char[] 来存储,改成了byte[] 加上编码标记,节约了一些空间。StringBuffer和StringBuilder也做了一些修改。
2020-10-05 18:07:24
333
原创 JVM--执行引擎总结
一、执行引擎概述执行引擎是Java虚拟机的核心组成部分之一虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的
2020-09-28 20:29:47
307
原创 JVM--运行时数据区--06方法区
一、堆、栈、方法区的交互关系二、方法区的理解方法区与Java堆一样,是各个线程共享的内存区域。方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展。方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang,OutOfMemoryError:Metaspace,比如:加载大量的第三方jar包Tomcat部署的工程过多
2020-09-24 21:08:31
374
原创 JVM--运行时数据区--05堆--堆是分配对象的唯一选择吗?
堆是分配对象的唯一选择吗?在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。 此外,
2020-09-23 19:01:59
391
原创 JVM--运行时数据区--05堆
文章目录一、堆的核心概述二、设置堆空间的大小三、年轻代与老年代四、对象分配的一般过程五、Minor GC、Major GC、Full GC六、堆空间分代思想七、内存分配策略总结八、TLAB(堆当中的线程私有缓存区域)一个进程对应一个jvm实例,一个jvm实例对应一个运行时数据区。一个进程又包含了多个线程,这些线程共享运行时数据区中的方法区和堆,每个线程又各自拥有程序计数器、本地方法栈和虚拟机栈。一、堆的核心概述一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域。Java堆区在
2020-09-18 10:46:31
333
原创 JVM--运行时数据区--04本地方法栈
Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用。本地方法栈,也是线程私有的。允许被实现成固定或者是可动态拓展的内存大小。(和Java虚拟机栈在内存溢出方面情况是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那..
2020-09-13 15:15:05
218
原创 JVM--本地方法接口
简单来讲,一个本地方法就是一个java调用非java代码的接口,一个本地方法是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。在定义一个本地方法时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编程语言为java所用,它的初衷是融合C/C++程序。标识符.
2020-09-13 15:02:39
479
原创 JVM--运行时数据区--03虚拟机栈
文章目录一、虚拟机栈的概述二、Java虚拟机栈的特点三、栈中可能出现的异常四、设置栈的内存大小五、Java虚拟机栈的存储单位六、Java虚拟机栈的运行原理七、栈帧的内部结构1. 局部变量表2. 操作数栈八、、虚拟机栈的相关面试题一、虚拟机栈的概述虚拟机栈出现的背景:由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。栈是运行时的单位,而堆是存储的单位
2020-09-13 14:39:18
320
原创 JVM---方法的调用
方法的调用在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。静态链接当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时。这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接。动态链接如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用方法的符号引用转换为直接引用,由于这种引用转换过程具备动态性,因此也就被称之为动态链接。对应的方法的绑定机制为:早期绑定(Early Binding)和晚期绑定(Late
2020-09-13 11:15:17
423
原创 JVM--运行时数据区--02PC寄存器
程序计数寄存器(Program Counter Register)也称作PC寄存器。一、PC寄存器介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。作用:PC寄存器用来存储指向下一条指令的地址,也就是即将要执行的指令代码。由执行引擎读取下一条指令。它是一块很小的内存空间,几乎可以忽略不计。也是运行速
2020-09-12 16:14:40
363
原创 JVM--运行时数据区--01结构及线程
一、Java内存空间内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。灰色的区域为单独线程私有的,红色的.
2020-09-12 10:45:04
163
原创 JVM--类加载子系统--01
内存图:一、类加载器ClassLoader从字节码开始,后续的工作都由JVM负责。类加载子系统负责从文件系统或者网络中加载Class文件,放在方法区------DNA元数据模板。Class文件在文件开头有特定的文件标识。类加载子系统只负责class文件的加载,至于它是否可以运行,则由执行引擎发挥决定。加载的类信息存放在一块称为方法区的内存空间。除了类信息外,方法区中还会存放运行时的常量信息。通过调用构造方法创建的对象存放在堆空间中。二、类的加载过程step1. 加载通过一个类的
2020-09-11 11:22:09
264
原创 Redis的主从复制及哨兵模式
文章目录一. 主从复制1. 什么是主从复制2. 主从复制的作用3. 主从复制的工作流程1. 建立连接阶段2. 数据同步阶段3. 命令传播阶段4. 常见问题二. 哨兵模式1. 哨兵的作用2. 启用哨兵模式一. 主从复制1. 什么是主从复制为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份。主从复制即将master中的数
2020-07-22 14:00:48
450
原创 Redis的删除策略
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态XX :具有时效性的数据(还有XX秒过期)-1 :永久有效的数据-2 :已经过期的数据 或 被删除的数据 或 未定义的数据删除策略定时删除创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作优点:节约内存,到时就删除,快速释放掉不必要的内存占用缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量总结:
2020-07-22 10:41:29
1036
原创 Redis的事务操作
简介什么是事务?redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。事务的基本操作开启事务multi作用设定事务开启位置,此指令执行后,后续所有指令均加入到事务中。执行事务exec作用设定事务的结束位置,同时执行事务。与multi一起出现,一起使用。注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行例:取消事务discard作用终止当前事
2020-07-19 14:00:01
496
原创 Redis的持久化操作
文章目录简介RDB1. RDB启动方式 - save1. save指令相关配置2. 工作原理2. RDB启动方式 - bgsave1. bgsave指令相关配置2. 工作原理3. 自动执行3. RDB特殊启动形式4. RDB优缺点AOF1. AOF写数据三种策略2. AOF功能开启3. AOF重写4. AOF自动重写方式RDB与AOF区别简介为什么要进行持久化:防止数据的意外丢失,确保数据安全性持久化过程保存什么?将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据。将数据
2020-07-19 13:16:10
312
原创 基于Linux环境安装Redis
基于Center OS7安装Redis下载安装包wget http://download.redis.io/releases/redis-4.0.0.tar.gz解压tar –xvf 文件名.tar.gz编译make安装make install [destdir=/目录]Redis基础环境设置创建软链接ln -s 原始目录名 快速访问目录名创建配置文件管理目录mkdir confmkdir config创建数据文件管理目录mkdir dataRedis服务启动默认配置启动
2020-07-19 10:41:01
178
原创 Jedis的操作与使用
一. Jedis基本操作导入mawen配置<dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency> <dependen
2020-07-18 16:11:06
316
原创 Redis通用指令
一. key通用操作1.key的基本操作删除指定keydel key获取key是否存在exists key获取key的类型type key2. key的扩展操作为指定key设置有效期expire key secondspexpire key millisecondsexpireat key timestamp (时间戳)pexpireat key milliseconds-timestamp获取key的有效时间ttl keypttl key切换key从时效性转换为永久性
2020-07-18 14:14:43
176
原创 MyBatis--08--常用注解
一. 常用注解总结@Insert:实现新增@Update:实现更新@Delete:实现删除@Select:实现查询@Result:实现结果集封装@Results:可以与@Result 一起使用,封装多个结果集@ResultMap:实现引用@Results 定义的封装@One:实现一对一结果集封装@Many:实现一对多结果集封装@SelectProvider: 实现动态 SQL 映射@CacheNamespace:实现注解二级缓存的使用二. 使用注解实现基本CRUD映射配置文件不
2020-07-14 13:43:25
235
原创 MyBatis--07--延迟加载与缓存
一. 延迟加载1. 什么是延迟加载延迟加载:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。坏处 :因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。立即加载:不管用不用,只要一调用方法,马上发起查询。问题:有一个用户,他有100个账户。在查询用户时,用户
2020-07-14 12:02:41
189
原创 MyBatis--06--多表查询
示例:用户与账户一个用户可以有多个账户。一个账户只能属于一个用户(多个账户也可以属于一个用户)。步骤:建立两张表:用户表和账户表让用户表和账户表之间具备一对多的关系:在账户表中添加外键。建立两个实体类:用户实体类和账户实体类建立两个配置文件:用户配置文件、账户配置文件实现配置:查询用户时,同时得到该用户下所包含账户信息。查询账户时,同时得到账户所属用户信息。1、 创建表:CREATE TABLE `account` ( `ID` INT(11) NOT NULL COMMEN
2020-07-14 09:34:58
411
1
原创 MyBatis--05--连接池、事务控制与动态SQL语句
一. 连接池的使用1. Mybatis 连接池的分类Mybatis 连接池提供了3种方式的配置,配置的位置在 SqlMapConfig.xml 中的 dataSource 标签的 type 属性type 的取值:POOLED: 使用连接池的数据源UNPOOLED: 不使用连接池的数据源JNDI: 使用 JNDI 技术获取 dataSource 对象,不同的服务器拿到的 dataSource 不一样。且如果不是web或者mawen的war工程是不能使用的。2. 连接池的使用<dataSo
2020-07-13 12:03:55
218
原创 MyBatis--04--配置文件详解
一. properties标签的使用在 SqlMapConfig.xml 中使用properties标签<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><!-- mybatis的主配置文
2020-07-13 10:14:17
168
原创 MyBatis--03--输出结果封装
resultType 配置结果类型一. 基本类型示例1. Dao 接口/*** 查询总记录条数*/int findTotal();2. 映射配置<!-- 查询总记录条数 --><select id="findTotal" resultType="int"> select count(*) from user;</select>二. 实体类类型示例1. Dao 接口/*** 查询所有用户*/List<User> findAl
2020-07-12 16:47:08
165
原创 MyBatis--02--实现CRUD操作
使用要求:1、持久层接口和持久层接口的映射配置必须在相同的包下2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名3、SQL 语句的配置标签<select>,<insert>,<delete>,<update>的 id 属性必须和持久层接口的方法名相同。先将测试类简化public class MybastisCRUDTest { private InputStream in ; private Sq
2020-07-12 16:21:53
180
原创 MyBatis--01--基础入门
MyBatis入门案例1. 创建user表CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(32) NOT NULL COMMENT '用户名称', `birthday` DATETIME DEFAULT NULL COMMENT '生日', `sex` CHAR(1) DEFAULT NULL COMMENT '性别',`user``user` `address` VARCH
2020-07-12 13:54:15
160
原创 SpringBoot项目中自定义异常
自定义异常因为某些业务需要进行业务回滚。但spring的事务只针对RuntimeException的进行回滚操作。所以需要回滚就要继承RuntimeException。public class MyException extends RuntimeException { //异常错误码 private int code; //异常信息 private String msg; //异常构造方法 在使用时方便传入错误码和信息 public MyException(int cod
2020-06-14 15:53:24
817
原创 点餐系统---日志
1. 创建Loggertest类@RunWith(SpringRunner.class)@SpringBootTestpublic class Loggertest { private final Logger logger = LoggerFactory.getLogger(Loggertest.class); @Test public void test1(){ String name = "jess"; String password
2020-06-14 14:45:34
306
原创 SpringBoot 获取配置文件
1. 配置文件内容wechat: mpAppId: wxdf2b09f2812ef6e2 mpAppSecret: f924b2e9f140acdjf559cb5317a8951c71 project: url: sell: http://localhost:8080 2. 获取配置文件信息方法一:使用@ConfigurationProperties注解@Data@Component@ConfigurationProperties(prefix = "wechat
2020-06-14 14:26:14
199
原创 点餐系统---消息02---WebSocket消息推送
一. 什么是WebSocketWebSocket:客户端与服务端的通信WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,
2020-06-14 14:08:50
610
原创 点餐系统---消息01---微信模板消息推送
没有正式账号就在微信公众平台获取测试账号1.新建service接口/** * 推送消息 */public interface PushMessageService { /** * 订单状态变更消息 */ void orderStatus(OrderDTO orderDTO);}2.实现接口先将模板id配置@Service@Slf4jpublic class PushMessageServiceImpl implements PushMess
2020-06-14 13:27:13
502
原创 点餐系统---卖家登录/登出(Redis)
Redis操作1.引入Redis依赖包,在application.yml中配置redis<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>Spring: redis: host: port:
2020-06-14 12:18:50
276
原创 点餐系统---AOP实现身份验证
在进行操作前,先判定用户是否登录1.创建一个SellerAuthorizeAspect类切面类@Aspect@Component@Slf4jpublic class SellerAuthorizeAspect {}2.在SellerAuthorizeAspect 中设置切入点public class SellerAuthorizeAspect { //是拦截对商品还有订单的操作,排除登陆登出的操作 @Pointcut("execution(public * com.jess.sell
2020-06-14 11:16:01
362
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅