- 博客(124)
- 收藏
- 关注
原创 服务器端排查问题常见命令
top:查看资源信息ps -mp 30477 -o THREAD,tid,time 查询线程ID(tid)jstack pid | grep tid -A 30 : 显示该进程中的线程的堆栈情况netstat -ntu : 查看那些IP访问服务器lsof -i:31002 查看端口进程netstat -tunlp 查看udp与tcp访问信息netstat -lnp : 查询所有的监听端口...
2021-12-24 10:52:18
1606
原创 Redis的lru算法
LRU:least Recently Used的缩写,最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据予以淘汰。
2021-06-02 15:08:36
238
原创 Redis的相关问题
redis只存热点高频的数据1.生产上Redis的内存设置为多少(在conf文件夹里面进行配置)maxmemory 决定redis的默认配置(它的单位为:字节类型)默认的redis内存大小:在64位的操作系统下是不限制内存大小,如果是32位操作系统最大内存为3GB生产推荐是占物理内存的四分之三修改内存设置的两种方式:1.conf文件进行配置2.redis动态进行修改进行redis内部:操作命令#设置最大内存config set maxmemory 1024#获取相关信息config
2021-06-01 14:24:24
256
原创 Redis的分布式锁
两种加锁类型:1.JVM加锁2.分布式微服务架构,拆分后各个微服务之间为例避免冲突和数据库故障而加入的一种锁,分布式锁。多个服务间+保证同一个时间段内+同一个用户只能有一个请求(防止关键业务出现数据冲突和并发错误)创建微服务的口诀:1.建Module2.改pom3.写yaml4.主启动5.写业务6.小测试Synchronized:要不线程释放锁,要么报错,可能导致线程大量的积压ReentrantLock:在规定时间内拿不到锁就放弃。tryLock分布式加锁的问题:1.如果在每个服
2021-06-01 13:23:37
176
1
原创 Redis基础
Redis中文官网:http://redis.cn/Redis英文官网:https://redis.io/注意:redis的命令是不区分大小写,但是redis的key是区分大小写帮助命令: help @类型例如: help @StringString的使用场景:商品编号,订单号 使用的是INCR#查看key什么时候过ttl key的名称hash的使用场景:redis的hash 类似于 java的map<String,Map<k,v>>适用于早期
2021-05-31 13:38:23
115
原创 spring的循环依赖(Spring创建bean的大致流程)
循环依赖在spring当中的简介:循环依赖官网简介spring的循环依赖:bean之间存在相互依赖,形成一个闭环。两种注入方法对循环依赖的影响。构造方法注入与setter方法注入。使用构造方法注入会出现循环依赖的问题,抛出异常;使用setter方法注入不会出现循环依赖的问题,而且是用的singleton,如果setter注入用的prototype,则会出现初始化异常:BeanCurrentlyInCreationExceptionspring使用的三级缓存来解决循环依赖:DefaultSingl
2021-05-28 11:10:58
182
原创 spring不同版本下的AOP
springBoot 1.5.9 底层用的spring 4正常代码执行顺序:环绕通知before执行代码环绕通知afterafterReturning异常代码执行顺序:环绕通知beforeafterafterThrowingspringBoot2.3.3 spring是5正常代码执行顺序:环绕通知before执行代码afterReturningafter环绕通知异常代码执行顺序:环绕通知beforeafterThrowingafter...
2021-05-27 09:21:30
265
原创 AQS源码解读
以ReentrantLock进行AQS讲解ReentrantLock有个Sync内部类继承AQS接口。ReentrantLock的公平锁与非公平锁都是继承SyncReentrantLock的加锁的三个步骤:1.尝试加锁2.加锁失败后,线程进入队列。3.加入队列只会,进入阻塞状态。...
2021-05-26 11:25:36
146
1
原创 AQS体系
AQS:通常指的是AbstractQueuedSynchronizer(但是它们三是相互关联的关系)—抽象的队列同步器与LockSupport相关的锁有:ReentrantLock,ReenTrantReadWriteLock,CountDownLatch.SemaPhone等相关。脑图:锁:面向锁的使用者同步器:面向锁的实现者将抢占资源的线程封装成一个node节点使用一个valatile修饰的变量(state)来表示同步状态state状态等于0表示现在没有线程在等待,可.
2021-05-25 09:38:14
154
原创 LockSupport
在java.util.concurrent.locks包下使用java在线API:https://www.matools.com/api/java8LockSupport是线程的wait/notify的改良加强版LOckSupport的park和unpark的作用分别是阻塞线程与解除阻塞线程的事三种线程的等待/唤醒方法1.Object对象的wait方法使线程等待,notify方法唤醒线程注意:不在同一个代码块等待和唤醒功能是不能被用的,会报异常注意:要等待在前,唤醒在后。如果唤醒在前。等待在
2021-05-24 13:32:03
88
原创 可重入锁
可重入锁:同一个线程在外层方法里面获取了锁,在进入内层方法的时候会自动获取锁,不会因为之前获取锁还没有释放而阻塞。ReentrantLock与synchronized都是可重入锁,可在一定程度上避免死锁。隐式锁(即使用Synchronized的锁):synchronized默认是可重入锁,synchronized分为同步代码块和同步方法显式锁(Lock):也有Reentrant这样的可重入锁实例1–synchronized之同步代码块package com.example.demo.LockTe
2021-05-23 14:56:40
113
原创 java字符串常量池内部加载
关于String的intern方法事例:package com.example.demo.javaconstant;public class ConstantTest { public static void main(String[] args) { String str1 = new StringBuffer("58").append("tongcheng").toString(); System.out.println(str1); S
2021-05-21 15:55:55
151
原创 github网址能ping通,但是浏览器访问不了
github网址能ping通浏览器请求超时解决方法#使用命令刷新dnsipconfig /flushdns注意:可能不会马上生效,多刷几次,会通的
2021-05-21 11:18:29
4588
原创 生产环境服务器变慢,诊断思路和性能评估
案例步骤:1.先用top命令查看cpu占用最高的2.使用ps -ef 或者 jps 来找到到底是那个程序导致cpu占用高ps -ef | grep 进程号 | grep -v grepjps -l3.定位到具体的线程与代码ps -mp 进程id -o THREAD,tid,time 找出进程里面线程占cpu最多的线程找到时间长且占用率大的线程id转换成16进制(英文字母小写)线程id:9379 十六进制:24a34.讲需要的线程id转换成16进制(英文小写格式)线程id:9
2021-05-20 16:16:21
86
原创 Linux常用命令
生产环境服务器变慢,诊断思路和性能评估1.整机:top(按1可以查看具体cpu的状况)load average : 系统的负载均衡三个参数的含义:一分钟的负载均衡的平均参数,五分钟的负载均衡的平均参数,十五分钟的平均参数三个参数相加/3 > 60% 表示系统负担压力大可以使用uptime来查看 load average2.CPU:vmstat (主要查看CPU)公式: vmstat -n 2 3每两秒采样一次,总共采样3次查看所有cpu核信息 mpstat -P ALL 2
2021-05-20 16:09:28
96
原创 JVMGC+SpringBoot微服务的生产部署和参数调优
1.先把springBoot项目打包成war包2.知道war包存放地址使用cmd3.内部运行: java -jar war包名称外部运行:java -server JVM参数 -jar war名称4.使用 jps -l 查看进程号使用 jinfo -flags 进程号:查看进程参数...
2021-05-20 14:20:43
216
原创 G1回收器
G1是面向服务端的垃圾收集器在jdk9以后将G2变成默认的垃圾回收机制以替代CMS注意:G1是横跨两区(新生区和老年区)JVM参数-XX:+UseG1GCGC也分4个回收过程设置GC的JVM参数-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=100-XX:MaxGCPauseMillis 最大GC停顿时间单位毫秒,软目标,JVM将尽可能(但不保证)停顿小于这个时间...
2021-05-20 14:04:47
80
原创 GC收集器之Serial,ParNew,Parallel Scavenge,CMS,Serial Old Parallel Old
新生代:1.GC之Serial收集器(串行收集器)单线程收集器,在进行垃圾回收的时候会暂停所有的用户线程,直至收集结束。限定于单个CPU环境。对应单CPU环境,它没有其他的线程交互的开销,实现了CPU的最大的利用率。是Client模式下默认的新生代垃圾回收器JVM参数:-XX:+UseSerialGC开启后 :YoungGC使用的是SerialGC+OldGC使用的是 Serial Old(MSC)的收集器组合模式2.GC值Parnew收集器(并行收集器)多个线程进行垃圾回收,其他的用户线.
2021-05-20 10:46:46
270
原创 查看默认的垃圾收集器,七种垃圾收集器的概述与约定参数说明
四种算法:引用计数复制拷贝标记清除标记整理落地实现的垃圾回收器:串行回收并行回收并发回收:并发标记清除G1回收查看默认的垃圾收集器java -XX:+PrintCommandLimitFlags -version添加默认垃圾收集器串行:-XX:+UseSerialGC并行:-XX:+UseParallelGCCMS:-XX:+UseConcMarkSweepGC-XX:+UseParNewGC-XX:+UseParallelOldGC-XX:+UseG1GCjps
2021-05-18 15:04:43
73
原创 Mysql对时间进行操作
1.在时间上进行添加或者减少1.使用Date_add 进行时间的添加公式:Date_add(initDate,INTERVAL 变量 type) 2.使用Date_SUB 进行时间的减少公式:Date_SUB(initDate,INTERVAL 变量 type) 2.进行时间的比较使用 UNIX_TIMESTAMP公式:UNIX_TIMESTAMP(start) > UNIX_TIMESTAMP(end)...
2021-05-18 13:52:00
141
原创 垃圾回收器粗略介绍
GC回收算法:(引用记数,复制,标清,标整)复制用在新生代,标清和标整用在老年代。垃圾回收器是垃圾回收算法的落地实现。主要的垃圾回收器Serial回收器:串行Parallel回收器:并行CMS回收器:并发标记清除GI回收器:串行回收器:Serial回收器为单线程环境设计,使用单线程进行垃圾回收,并且暂停所有用户线程,不适合服务器环境设计。并行回收器:parallel回收器多个垃圾回收线程并行工作,暂停用户线程。适用于科学计算/大数据处理首台处理等弱交互场景。CMS回收器:并发标记清除
2021-05-18 13:41:40
62
原创 java编写路径时“/“在运行时自动变成“\“
实例String filePath =“local/myservice.txt”运行结果local\myservice.txt解决方法:使用File工具类的路径分隔符String filePath ="local"+File.pathSeparator+"myservice.txt"
2021-05-17 11:01:31
986
1
原创 StackOverFlowError(栈堆溢出错误)和OOM(OutOfMemoryError)
Throwable是所有异常的父类StackOverFlowError产生原因:递归的深度调用可能会产生StackOverFlowError(深度的方法调用出不来)实例:package com.example.demo.Throwable;/** * 实现堆栈溢出异常 * 深度进行递归 */public class StackOverErrorFlowDemo { public static void shen(){ shen(); } p
2021-05-17 10:57:28
147
原创 强引用,软引用,弱引用,虚引用
继承关系图强引用定义:强引用(系统默认):当内存不足是,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收最常见的强引用:把一个对象赋给一个引用对象,这个引用对象就是强引用。当一个对象被强引用变量引用时,它是处于可达状态,它是不可能被垃圾回收机制回收的。实例:package com.example.demo.Reference;import com.example.demo.entity.DateDemo;/** * 强引用类型 */public
2021-05-13 16:49:10
100
原创 JVM的常用基础参数
1.-Xms初始大小内存:默认为物理内存的1/64-Xms:等价于-XX:InitialHeapSize2.-Xmx最大分配内存:默认为物理内存的1/4-Xms:等价于-XX:MaxHeapSize3.-Xss设置单个线程栈的大小,一般默认为512k~1024k-Xss:等价于 -XX:ThreadStackSize查看命令:jinfo -flag ThreadStackSize 23876显示效果:0表示默认值-XX:ThreadStackSize=0修改相关的参数,需
2021-05-10 15:37:52
106
原创 JVM的参数类型(XX类型为重点)和查看JVM的默认值
JVM分为三种参数类型一:标配类型-version-helpjava -showversion二:X类型-Xint 解释执行-Xcomp 第一次使用就编译成本地代码-Xmixed 混合模式执行命令java -Xint -versionjava -Xcomp -versionjava -Xmined -version三:XX类型(重点)1.Boolean类型公式: -XX:+ 或者 - 某个属性+表示开启-表示关闭Case一:是否打印GC的收集细节二:是否使用串
2021-05-10 13:37:12
196
原创 对GCRoots的理解
java中的垃圾:指的是在内存中不在被使用的空间判断对象是否可以被回收:1.引用计数法每当有一个地方引用,计数值加1有一个地方引用失效,计数值减12.枚举根节点做可达性分析(根搜索路径)可以作为GCRoots对象的东西...
2021-05-09 14:50:44
112
原创 线程池的底层工作原理与四种拒绝策略
线程池拒绝策略生效的条件:1.当阻塞队列里面的线程数已经达到最大2.当线程池的线程数量已经达到max值满足这两个条件时,拒绝策略就会生效
2021-05-08 16:11:02
158
原创 线程池七大参数(详解ThreadPoolExecutor构造方法的七个参数)
ThreadPoolExecutor的七参构造方法public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQ.
2021-05-07 14:36:27
185
原创 Executors创建线程池的三种方式与它的底层ThreadPoolExecute(浅谈)
线程池的底层用的是ThreadPoolExecutor线程池不需要new,已经写好池化注意:使用池化线程,永远使用关闭,关闭比使用更重要实例一:创建固定大小的线程池 /** * 创建固定大小的线程池 */ private static void ExecutorNewFixedThreadPool() { ExecutorService executorService = newFixedThreadPool(5); try{ .
2021-05-07 13:52:17
439
原创 线程池的使用和优势三种实现方法(主聊callable)
使用和优势1.省略了上下文的切换课外扩展:int availableProcessors = Runtime.getRuntime().availableProcessors(); System.out.println("可用的处理器: "+availableProcessors);线程池的优势,特点三种实现方法:1.继承Thread类,不可以抛异常,无返回值public class MyThread extends Thread{ @Override
2021-05-07 11:05:24
225
1
原创 线程通信之生产者消费者阻塞队列版本(线程池)
注意:在多线程下 i++等类型可能出现错误为了保证程序的通用性,使用构造方法进行全局变量的赋值编写生产者消费者版的阻塞队列package com.example.demo.threads;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.
2021-05-06 17:00:21
67
原创 Synchronized与Lock的区别,新的Lock与以前有什么好处
synchronized属于jvm层面,属于java的关键字Lock是java的API层面的锁,在java.util.concurrent.locks.lock1.原始构成synchronized:monitorenter(底层是通过monitor对象来完成,wait/notify方法都是通过monitor对象来完成,只有在同步代码快里面才能使用wait/notify等方法)monitorexitLock:是具体类2.使用方法synchronized不需要手动释放,当线程执行完成之后,系统会
2021-05-06 15:23:29
72
原创 线程通信之传统的生产者消费者(await在while的原因)
sync的等待(wait)与解锁(notify) 老版lock的等待(wait)与解锁(singal) 新版多线程的判断需要用while判断await要放在while方法里面防止正在waiting被别的原因唤醒,放在while里面,会判断while里面的条件可能会重写挂起。错误情况一:如果有两个生产者A和B,一个消费者C。当存储空间满了之后,生产者A和B都被wait,进入等待唤醒队列。当消费者C取走了一个数据后,如果调用了notifyAll(),注意,此处是调用notifyAll(),则生产者
2021-05-06 13:26:15
280
原创 synchronousQueue
synchronousQueue是一个没有容量的阻塞队列每一个put操作必须等待一个take操作,否则不能添加元素注意这个要放在两个线程里面进行调用,不然没有效果相当于A放,有B来拿能,A才能放synchronousQueue实例package com.example.demo.Queues;import java.util.concurrent.BlockingQueue;import java.util.concurrent.SynchronousQueue;/** * 测试 s
2021-04-30 16:06:07
98
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人