深入了解JVM
1、什么是JVM定义:Java Virtual Machine - Java虚拟机(Java字节码的运行环境),其分为三大组成部分,包括:类加载器、内存结构以及执行引擎。
字节码:我们通常所说的Java字节码,是指Java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的jvm上运行。
Java虚拟机与Java语言并没有必然的联系,它只与特定的二进制文件格式:Class文件格式所关联,Class文件中包含了java虚拟机指令集和符号表,还有一些其他辅助信息。
JVM整体结构图:
2、JVM内存结构内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略。保证了JVM的高效稳定运行。
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着 ...
Java集合详解
一、集合概述
Java使用数组对多个对象进行存储具有一些弊端,而Java集合可以动态的将多个对象的引用存入到容器中(内存层面的存储,不涉及持久化存储)。
数组在存储时的缺点:
数组初始化后,长度就确定了,不利于扩展。
数组所提供的属性和方法较少,不便于添加、删除、插入等操作,且效率不高。同时无法直接获取存储元素的个数
数组存储的数据是有序的,可重复的。对于无序、不可重复的数据无法满足需求。
Java集合的继承及实现关系图:
Java集合可以分为Collection和Map两种体系
Collection接口:单列数据,定义了存取一组对象的方法集合
List:存储有序、可重复的集合(可以理解为“动态”数组)
ArrayList、LinkedList、Vector
Set:存储无序、不可重复的集合(可以理解为数学上的集合)
HashSet、LinkedHashSet、TreeSet
Map接口:双列数据,保存具有映射关系的Key—value键值对的集合(可以理解为数学上的函数:y = f(x))
HashMap、LinkedHashMap、TreeM ...
最新文章让Tomcat的日志按天进行分割,每天输出一份新的日志文件
在使用Tomcat运行项目时,项目的日志一般会输出到tomcat的logs文件夹下的catalina.out文件中,日积月累,该文件会非常的大,导致一般的文本编辑器根本无法打开,更别说从几百G的文件里找报错日志去定位问题了,因此我们可以利用Cronolog这个工具使日志按照日期输出,让tomcat每天输出一份日志文件,方便我们查找定位线上问题。
1、下载并安装Cronolog点击此处下载cronolog-1.6.2.tar.gz
123456789101112# 解压安装包tar -zxvf cronolog-1.6.2.tar.gz# 进入目录cd cronolog-1.6.2# 安装./configure && make && make install# 查看是否安装成功(记下路径,后面有用)which cronolog/usr/local/sbin/cronolog
2、修改Tomcat文件本文使用Tomcat 8.5作为示例,不同版本的catalina.sh文件可能稍有区别
1234567891011# 进入Tomcat的bin目录下cd ap ...
使用Spring的InitializingBean接口实现策略模式
1、首先定义一个策略接口,并给个默认实现
12345public interface StrategyService { default Result handle(){ throw new SysException(R.FAIL_OPERATION); }}
2、定义一个策略上下文类
1234567891011121314public class StrategyContext { // 使用Map结构来存放各种策略 private static final Map<Integer, StrategyService> MAP = new HashMap<>(); // 获得相应的策略实现类 public static StrategyService getHandleBean(Integer key){ return MAP.get(key); } // 将策略注册到Map中 public static ...
Docker学习记录
Linux下安装Docker
环境:CentOS7
参考文档:Docker安装文档
1、卸载原有的docker
12345678sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2、设置yum仓库地址
123sudo yum install -y yum-utilssudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安装Docker
1sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx ...
Nginx配置
Nginx最小配置文件12345678910111213141516171819202122232425262728293031323334353637383940414243# 工作进程的个数worker_processes 1;events { # 每个工作进程的连接数 worker_connections 1024;}http { # include是将外部的配置文件引入到此配置中 # mime.types中定义了服务器端返回的二进制流所对应的文件类型 include mime.types; # 默认的类型,即mime.types中没有包含的,那么就会使用默认类型 default_type application/octet-stream; # 数据零拷贝,不开启数据就需要从磁盘读到应用的内存,再从内存发到网络接口 # 开启后Nginx直接向操作系统发送一个信号,数据就直接发送至网络接口,省去了一步IO操作 sendfile on; keepalive_timeout 65; ...
如何高效的将结果集组装成树状结构
最近遇到了查询出树状结构返回给前端的场景,最常见的思路就是在数据库中将数据全部查询出来,然后在内存中组装,因此记录下三种组装树状结构的方法并对比下执行效率。
首先先来看下VO的结构(以区划作为例子):
注意:想要组装一棵树结构,不可或缺的三要素:自身id、父节点id、子节点的集合
123456789101112131415161718192021222324@Datapublic class AreaVO implements Serializable { private static final long serialVersionUID = 1L; /** * id */ private Long id; /** * 区划名称 */ private String areaName; /** * 区划编码 */ private String areaCode; /** * 上一级id */ private Long fatherId; /** ...
在Linux上安装MySQL服务
安装MySQL12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091# 检查是否存在mariadb数据库rpm -qa | grep mariadb# 存在,删除rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64# 检查是否存在mysql数据库rpm -qa | grep mysql# 存在,删除rpm -e --nodeps XXX# 将/usr/lib64/libLLVM-7.so也一并删除rm -rf /usr/lib64/libLLVM-7.so# 检查是否删除成功rpm -qa | grep mysql# 查询残余文件夹whereis mysql#解压tar -zxvf mysql-8.0.33-el7-x86_64.tar.gz#移动到/us ...
在Linux服务器上安装RocketMQ
1、准备工作需要准备以下环境
JDK安装包:前往下载
RocketMQ安装包:前往下载
Apache Maven安装包:前往下载
RocketMQ可视化界面:前往下载
2、安装JDK12345678910111213141516171819# 上传服务器并解压tar -zxvf jdk-8u381-linux-x64.tar.gz# 进入解压后的目录cd jdk1.8.0_381/# 查看当前所在文件夹pwd # /home/jdk1.8.0_381# 配置环境变量vim /etc/profile# 在文件最低端插入以下内容export JAVA_HOME=/home/jdk1.8.0_381PATH=$JAVA_HOME/bin:$PATH:$HOME/.location/bin:$HOME/bin# 使环境变量生效source /etc/profile# 验证java -version# 获得如下结果,成功安装java version "1.8.0_381"Java(TM) SE Runtime Environment (build 1.8.0_381-b0 ...
快速初始化搭建SpringBoot项目
闲来无事,突发奇想因为每次写一些小的demo或者写新的项目都要从0开始一点一点的搭建环境,CV配置文件,写无聊的实体类、DTO以及粘贴一些重复性的东西……想想就头大,而这些操作往往占据了前期开发的大量时间。
因此,为了今后更好的偷懒写代码,就想着如何才能解决这些问题。
然后就联想到了Vue的脚手架项目,不需要去自己搭建环境,开箱即用。
于是就自己搭建了一个SpringBoot项目,将自己常用的依赖、目录、配置文件、工具类这些每个项目几乎都会用到的东西放了进去,当作自己个人的一个脚手架。
此外还有mybatis-plus的代码生成器,使我们免去了需要根据数据库创建大量的类跟字段的操作。但是,又考虑到mybatis-plus的代码生成器个性化程度太低,自己从0写又不会写太麻烦。
因此就找到了大名鼎鼎的人人开源的代码生成器,对其进行了个性化的定制修改,修改简化成符合我个人风格的代码模板跟目录。
SpringBoot脚手架Github地址:spring-boot-demo
介绍:
此项目包含了几乎必备的常用依赖,基本的目录结构,基本的配置文件,以及一些必备的类(统一返回类、统一异常处理、常量 ...