JVM一条龙
JVM,之前觉得是不可触及的东西,怎么也得高级Java程序员才能接触吧,我等鼠辈不感动不感动。然后后面毕业时找工作发现都要求应届生熟悉JVM……额…其实可以试试。
一、JVM架构图
好大一个图
二、类加载
首先得知道什么是类加载?
类加载就是将类信息经过一系列处理放到内存,供实例化使用。
1、加载JVM提供了不同类型的类加载器,采用双亲委派机制。不同类加载器的加载路径不同。
双亲委派的好处:1、反正类的重复加载。2、防止核心API被恶意篡改。
2、链接链接阶段有三个子步骤:
验证:确保class文件的字节流信息符合JVM的规范。
准备:为类中的静态变量分配内存空间。
解析:将常量池中的符号引用转换为直接引用。
ps:符号引用(以符号来描述引用的目标),直接引用(直接指向目标的指针)
3、初始化简言之,为类的静态变量赋予正确的初始值。
三、运行时数据区1、组成部分就用之前画的思维导图大致描述吧
2、如何判断对象是否要被回收?
可达性分析算法
以根对象集合(GCRoots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达,不可达的则会被下次gc回收
引 ...
好文
jvm动图图解 GC 算法
'javax.validation:validation-api常用注解'
一、概述在我们应用程序的业务逻辑中,经常会碰到参数校验的情况,手动的在代码层上面进行校验就会带来很不好的体验,阅读、维护的成本会大大增加,造成冗余。因此有了这个JSR 303。
Bean Validation为JavaBean提供了相应的API来给我们做参数的验证。通过Bean Validation比如@NotNull @Pattern等方法来对我们字段的值做进一步的教研。
Bean Validation 是一个运行时框架,在验证之后错误信息会直接返回。
完整的jar包:javax.validation:validation-api:2.0.1.Final.jar 包
注意:SpringBoot2 项目web组件已经内置了这个依赖了
123456<!--添加依赖--><dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</vers ...
Mysql事务
1、什么是事务?
在mysql中,事务是一组原子性的sql语句,或者说是一个独立的工作单元
事务有四个特性:
原子性(Atomicity):一个事务必须被视为不可分割的最小工作单位
一致性(Consistency)
隔离型(Isolation)
持久性(Durability)
2、redo log 与 undo log如何查看日志
①redo log redo log叫做重做日志,用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中。
redo log 有什么作用?
mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。
总结:redo log是用来恢复数据的,用于保障已提交事务的持久化特性。
②undo log undo log 叫做回滚日志,用于记录数 ...
java简洁编码
一、方法1、方法不要返回 null别处调用方法时,避免不必要的空指针
反例:
正例:
2、总是在 Switch 语句的 Default 中抛出异常
当 value == 3 时,将会出现无法找到的提示,而不会让人不知所谓。
123456789101112// Badswitch (value) { case 1: foo(); break; case 2: bar(); break;}// Goodswitch (value) { case 1: foo(); break; case 2: bar(); break; default: throw new ThreadDeath("That'll teach them");}
二、常量与变量1、如果变量的初值会被覆盖,就没有必要给变量赋初值1234567891011121314// BadList<UserDO> userList = new ArrayList<>();if (isA ...
GitfLow
一、什么是gitFlow工作流
Gitflow 实际上只是 Git 工作流程的抽象概念。这意味着它规定了要设置什么样的分支以及如何将它们合并在一起。
gitFlow流程图:
我们将在下面讨论分支的目的。 git-flow 工具集是一个具有安装过程的实际命令行工具。 git-flow 的安装过程很简单。 git-flow 的软件包可在多个操作系统上使用。
在 OSX 系统上,您可以执行 brew install git-flow。
在 Windows 上,您需要下载并安装 git-flow。安装 git-flow 后,您可以通过执行 git flow init 在项目中使用它.Git-flow 是一个围绕 Git 的包装器。 git flow init 命令是默认 git init 命令的扩展,除了为您创建分支外,不会更改存储库中的任何内容 #
二、操作1.(Feature branches)功能分支 每个新功能都应该驻留在自己的分支中,可以将其推送到中央存储库以进行备份/协作。但是,功能分支不是从主分支分支,而是使用开发作为其父分支。当一个功能完成后 ...
Java Iterator(迭代器)
结构图:
1、简述java迭代器 Iterator迭代器的定义:迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义是,提供一种方法访问一个容器container对象中各个元素,而又不需暴露该对象的内部细节。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
它用于逐个遍历集合对象元素
它适用于所有Collection类,如上结构图所示
它支持read和remove操作
注意:对collection类遍历进行remove时不能使用for或者foreach,只能使用迭代器去操作,否则抛同步异常
2、java Iterator源码
类图
方法
123456789101112131415161718192021222324252627282930public interface Iterator<E> { /** * 检查集合中是否还有元素 */ boolean hasNext(); /** * 返回迭代的下一个元素 * @throws NoSuchEle ...
java Streams操作
Streams(流)java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样你就可以将多个操作依次串起来。Stream 的创建需要指定一个数据源,比如 java.util.Collection 的子类,List 或者 Set, Map 不支持。Stream 的操作可以串行执行或者并行执行。
首先看看Stream是怎么用,首先创建实例代码需要用到的数据List:
123456789List<String> stringList = new ArrayList<>();stringList.add("ddd2");stringList.add("aaa2");stringList.add("bbb1");stringList.add("aaa1");stringList.add("bbb3");stringList.add(&quo ...
springboot分页
一、分页插件(pagehelper) 之前写项目时都是自己去写分页,头大!自己写的分页很可能要写两次查询,一次查内容,二次查条数。这种就是费力不讨好的事,所以去看了一下pagehelper分页插件(都说是最方便使用的分页插件),学完随便做个笔记。
pagehelper插件主要是把PageHelper.startPage(pageNum, pageSize)放在sql查询之前。他会去处理查询内容,进行分页处理。
1、导包123456<!-- pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency ...
docker笔记
一、Docker基本组成
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器(最终项目运行就是在容器中)。
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建。
容器基本命令=》启动、停止、删除
仓库(repository):
仓库就是存放镜像的地方
仓库分为共有仓库和私有仓库
Docker Hub(默认是国外的仓库)
阿里云镜像加速器(配置镜像加速=》常用!!)
二、安装Docker1、安装步骤docker官方安装指南(centos)
1234567891011121314151617181920212223242526# 1、卸载旧的docker版本yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ ...