自己对JVM的理解
内存模型线程独占:
虚拟机栈:先进后出的 又称方法栈,线程执行方法都是创建一个栈帧,用来存储局部变量表(存放局部变量的),操作数栈(后进先出的操作数栈。负责写入数据和提取数据),动态链接(执行常量池中的方法引用),方法出口等信息,JVM对栈的操作有2种,出栈和入栈。方法调用就是入栈。方法返回就是出栈
本地方法栈:区别是虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务 什么是native方法呢 就是非Java方法。与Java环境外交互。因为JVM一些底层是C写的。比如Thread类中的setPrioruty方法
HotspotJVM中 将本地栈和虚拟机栈合二为一的 栈是运行时单位 堆是存储的单位
程序计数器:一块较小的内存空间,是当前线程所执行的字节码的行号指令器,每条线程都要有一个独立的程序计数器,这类内存也被称为线程私有的内存。用来记录程序执行到哪一个地方,下次可以在这个地方继续执行
线程共享:
堆:java虚拟机内存最大的一块,被所有线程共享,几乎所有线程实例都在这里分配内存。
1.7包含新生代、老年代、永久代
1.8只有新生代和老年代(永久代被删 ...
Spring基于注解使用AOP
概念面向切面编程。将多个对象的公共行为抽取封装成一个可重用的模块。降低了模块之间的耦合度。同时提高了系统的可维护性。一般用于权限认证,日志等。
AOP是基于动态代理实现的。如果要代理的对象实现了某个接口,那么AOP就会使用JDK动态代理创建对象。而没有实现接口的对象,就无法使用JDK动态代理。使用Cglib动态代理生成一个被代理的子类来作为代理。
Aspect(切面): 切点+通知。在什么时候,什么地方,做的什么增强
Joint point(连接点):使用通知的一个时机,一般是方法的调用,或异常被抛出
Pointcut(切点):通过通配、正则表达式等方式,定义了切面发生在哪里
Advice(通知):告诉切面要做什么,什么时候开始,比如Before、After、Around等等
Target(目标对象):被通知的对象
Weaving(织入):把切面应用到目标对象,创建对象的一个过程。可以在编译时或运行时完成织入操作。
Spring AOP 和 AspectJ AOP的选择Spring AOP属于运行时增强。AspectJ是编译时增强,Eclipse基金会出品。SpringAOP基于代理, ...
Linux安装Docker和MySQL
1.安装准备
11.1 确保cenos版本是7.X
使用uanme -a查看docker内核版本
1uname -a
这里使用cenos7来安装docker
11.2 安装docker运行环境
安装docker运行环境之前,我们先来配置一下yum
2.配置yum 2.1 备份
1mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2.2 配置国内镜像加速
1wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2.3 生成缓存
1yum makecache
2.4 安装docker运行环境 因为docker是基于C和C++开发的 需要安装对应的环境
12yum -y install gccyum -y install gcc-c++
2.5 继续 ...
服务器上Nginx的安装和使用
nginx介绍 nginx是一款使用C语言编写的高性能的代理服务器。优点是占用内存小,并发能力强。达到了5W。一般用来做负载均衡
1.官网下载nginx压缩包
我们先去官网下载一个最新稳定版的nginx
http://nginx.org/en/download.html
然后使用xftp或者rz上传到我们的服务器
# 解压压缩包
tar -zxvf nginx-1.22.0.tar.gz
然后进入到目录里面,查看是否有可执行权限(是不是绿色的),没有赋予执行权限
# 赋予执行权限
chmod +x configure
2.安装nginx所需要的环境在安装之前先安装nginx所需要的一些环境
12345678# c编译器yum -y install gcc gcc-c++ autoconf automake make# 解析正则的pcre库yum install -y pcre pcre-devel# 添加对gzip的支持yum install -y zlib zlib-devel# SSLyum -y install pcre pcre-devel ...
linux常用的插件安装
阿里云买一台服务器,部署自己的项目,让别人访问,多有成就感。但是刚买的服务器,上面什么都没装,很多时候都是软件装完了,这里缺一个php,那里缺一个c环境,想要解压个zip文件,发现没有工具…这些都是我们碰到的。这篇文章就把常用的插件一网打尽,到手执行完指令就可以使用。
wget wget不用多说了吧 linux的应用市场
net-tools 网络工具包
gcc C编译器
xinetd 网络守护进程服务
unzip 解压缩软件,支持解压缩zip
lrzsz 替代xftp的工具 直接使用rz命令上传
initscripts 一些启动脚本
sudo 让我们获得管理员权限的东东
libaio 提供给我们异步非阻塞方式读取文件
gcc-c++ C++编译器
vim* Vim文编编辑神器
lsof 方便我们更好的查看端口
epel-release 一个第三方源,帮助我们扩展yum
pcre-devel PCRE库,支持正则表达式,用nginx必须得有
zlib-devel 一些软件会用到的依赖库
开始安装之前,我们先下载一下wget
1yum -y install wget
我们切换成国内镜 ...
什么是Docker?
容器技术的起源假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。
测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。
从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。
有的同学可能会说:“等等,先别改变世界,我们有虚拟机啊,VMware好用的飞起,先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗?”
在没有容器技术之前,这确实是一个好办法,只不过这个办法还没有那么好。
先科普一下,现在云计算其底层的基石就是虚拟机技术,云计算厂商买回来一堆硬件搭 ...
Redis-集群
哨兵模式sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能:
集群监控:负责监控 redis master 和 slave 进程是否正常工作。
消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。
哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。
故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题。
即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很坑爹了。
哨兵的核心知识
哨兵至少需要 3 个实例,来保证自己的健壮性
哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。
对于哨兵 + redis 主从这种 ...
超好用的Docker可视化管理工具
今天给大家介绍一个超好用的一款Docker容器可视化工具。叫Portainer,中文名叫集装箱起重机。听名字就知道是个狠角色。把Docker吊起来打
首先来看下页面 非常的大气简洁,有一些功能很实用,像什么重启,停止,删除点个按钮就可以实现。
1.安装镜像 我们先创建portainer的目录,这里我选择/usr/local/docker下 创建portainer文件夹
下载最新版的portainer
1docker pull portainer/portainer
2.安装汉化包因为portainer默认英文,我们需要下载汉化包,进入portainer的目录(这一步很重要,不然汉化包挂载不到容器内部)
12cd portainerwget https://labx.me/dl/4nat/public.zip --2022-05-01 23:09:00-- https://labx.me/dl/4nat/public.zip
解压汉化包(这里如果报错,是因为没有下载unzip解压软件)
12# 解压unzip public.zip
12# 没有 ...
研究guava布隆过滤器
介绍 布隆过滤器采用一个很长的二进制数组,通过一系列的Hash函数来确定该数据是否存在
使用场景
redis防止缓存击穿的解决方案
数据去重
过滤垃圾信息
简单原理
布隆过滤器本质上是一个二进制数组,元素的值不是1就是0. 当我们存一个商品id为10的商品,假设我们经过三次哈希,存的数组下标为1,3,7,就将这三个下标的元素改为1.这样每次访问redis之前,先访问布隆过滤器。查询id为10的商品的时候,经过布隆过滤器的哈希算法,获取到该商品对应的下标是1,3,7。那么,如果这三个数组的下标对应的元素都为1 则表示存在该商品,放行这次请求。如果有一个为0,则不存在该商品。
布隆过滤器判断存在不一定真的存在,但是,判断不存在则一定不存在。
针对布隆过滤器的一些误判,我们可以增加二进制数组位数或者增加Hash次数来解决。
使用布隆过滤器并测试引入谷歌guava依赖
12345<dependency> <groupId>com.google.guava</groupId> <artifactId& ...
SpringBoot通过Ajax异步上传图片
由于之前使用的是SSM框架,使用的是自己的Tomcat,换上SpringBoot之后Tomcat就成内置的了,继续用以前的方法上传都上传在了随机位置,研究了一下图片上传和预览 记录一下需要用到2个工具类(工具类也是从网上下载的),文末会附上工具类
首先我们要知道ajax上传需要的三个重要属性cache: 默认值true 代表缓存 当设置为false的时候,再次发送请求,读的是浏览器的数据而不是之前缓存在浏览器中的数据 可以保证每次都是新的数据processData: 是否序列化数据,默认值是true 代表将数据序列化,这里我们上传文件设置为falsecontentType: 默认值application/x-www-form-urlencoded 是设置我们发送给服务器的数据格式,而常用的dataType则是设置我们收到服务器数据的格式先来看一下前台页面,一个简单的上传图片按钮和一个下载按钮 js中是对应的函数
12345678910111213141516171819202122<html lang="en" xmlns:th="http ...