- 博客(38)
- 资源 (26)
- 问答 (1)
- 收藏
- 关注
原创 JVM创建对象的oom流程
创建一个对象引起oom在jvm内部的流程。1.首先从new字节码的解释器入口找到对应的内存分配代码,具体关键代码如下:
2021-02-27 12:27:31
352
原创 case-记一次业务高峰期接口超时问题
一、背景服务器出现CPU打满情况,并且服务TP99升高到1.3s+。二、分析过程1.查看服务器指标没啥说的第一件事就是马上查服务器的各种指标和趋势,可以看到CPU已经很耗尽了,load彪高比较严重而且此时ygc的次数和耗时都有明显增加,可以看到这些都严重影响了TP99.由于这个服务是我负责的所以还是比较熟悉,飙升的时间正好是业务高峰期。和调用QPS相呼应。2.紧急处理由于是...
2019-11-21 11:01:19
477
原创 获取指定注解类型的方法参数的值
/** * 获取指定注解类型的方法参数的值 * * @param method * @return * @throws Exception */ private Object getParamValueByAnnotation(Method method, Object[] params, Class<?> clazz) throws Excepti...
2019-06-22 06:37:47
2807
原创 CMS垃圾回收
内存分代算法标记-清除特点并发收集器,以最短的停顿时间为目标的收集器不足对CPU资源敏感,GC线程占用CPU资源高影响吞吐量需要预留一些空间,保证触发后台垃圾回收而不是fullgc标记-清除会产生内存碎片,虽然可以设置执行多少次不压缩的GC来一次压缩的GC,但是由于整理过程无法并发所以这时停顿时间会较长回收过程1. 初始标记(STW)标记与GCRoots直接关联的对象...
2019-06-14 16:02:08
502
原创 Mysql慢查询
1.索引的一些概念1.索引概念(重要)排好序的快速查找的数据结构(我们平时说的索引,如果没有特别指明,都是指B树,其中聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引默认使用的都是B+树索引,除B+树这种类型的索引外还有哈希索引等)优缺点---->何种情况建索引优点查找 :提高数据检索效率,降低IO成本。排序:通过索引对数据进行排序,降低排序成本,降低cpu消耗...
2019-06-13 12:12:04
237
原创 HashMap&ConcurrentHashMap源码分析
HashMap首先是构造方法,构造方法可传入初始容量和负载因子。传如的初始化容量会被修正为最接近的2的正次幂的值。public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal...
2019-04-19 17:16:40
1058
原创 Java如何获取到方法入参名称
背景 我们在使用SpringMVC的时候根据参数名获取用户传来的数据的时候就要用到这项技术。具体实现1. 使用Java8+反射实现 在使用javac编译时加入[-parameters]参数,然后通过反射就能获取到方法参数名称,但是如果不加这个参数获取到的会是arg0这样的参数名。如果使用IDEA打开javac设置代码如下:public class TestParameterNa...
2019-04-19 15:30:55
4850
原创 JVM 内存模型 JMM
简介 java内存模型主要定义了各个变量(字段,静态字段这样的共享变量,私有变量不涉及竞争问题,本文变量均为该意思)的访问规则,及将变量存储到内存和从内存中取出的细节。作用 用来屏蔽掉各种硬件(高速缓存、cpu指令重排)、操作系统、编译器优化(JVM指令重排)的一个抽象层。内存模型1.主内存与工作内存: java内存模型规定了所有变量都存储在主内存。每个线程还拥有自己的工作内存。...
2019-04-19 12:31:11
484
原创 JVM笔记
一、Java内存1.1 运行时数据区域程序计数器:线程私有,可以看作是当前线程所执行的字节码行号指示器。类似于寄存器IP虚拟机栈|本地方法栈:线程私有,每个方法执行的同时会创建一个栈帧入栈。栈帧包括:局部变量表、操作数栈(类似寄存器功能)、方法出口等信息方法区:共享内存区域,存放类信息、常量、静态变量、即时编译器编译的代码等。(1.8使用NativeMem实现;1.7字符串常量...
2019-04-18 13:39:12
280
原创 java自定义注解
Java注解一、简介:Java注解是附加在代码中的一些元信息。二、元注解:元注解是指注解的注解在定义注解的时候需要用到。包括 @Retention @Target @Document @Inherited四种。SOURCE: 不包括在class文件中的注解CLASS: 包括在class文件中的注解RUNTIME: 包括在class文件中的注解,...
2019-04-15 19:08:34
285
原创 java中的强、软、弱、虚四种引用
强引用:就是指在程序代码之中普遍存在的,类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。软引用:是用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后...
2019-04-02 15:43:15
849
原创 Java ThreadLocal分析
一、ThreadLocal简介ThreadLocal用于将自定义变量和当前线程绑定,每个线程都拥有自己独立的自定义变量。这些变量可以用来保存一些状态信息,例如用户信息、Span信息、或者非线程安全的对象。举例:SimpleDateFormat是线程不安全的类多线程使用会有并发问题。那么我们可以利用ThreadLoca来解决这个问题。(或者使用JDK8的Datetimeformatter...
2019-03-29 00:21:48
221
原创 JAVA 线程池 ThreadPoolExecutor
目录一、ThreadPoolExecutor简介二、运行原理三、源码分析四、扩展一、ThreadPoolExecutor简介ThreadPoolExecutor是我们在Java中常用的线程池类,当然我们经常用如下方法创建,但是这些方法内部最终还是通过ThreadPoolExecutor构造的。(所以我有时候很不理解,为什么一说直接用ThreadPoolExecutor...
2019-03-28 21:26:25
388
原创 case-内存溢出
目录一、事件背景二、分析过程三、紧急处理措施四、发现问题及后续TODO一、事件背景多个服务突发连接超时报警,迅速查看报警原因发现是因为一个rpc服务的所有接口请求都超时了。二、分析过程发生事故这个服务不是由本人负责而是帮助组内其他小伙伴排查的问题。虽然不是我负责的服务但是由于是组内的服务并且经常会和这个服务打交道所以运行状况基本了解。)注:由于该文章是事...
2019-03-28 16:02:10
366
原创 调用被子类重写的基类方法
首先这是一段普通的代码子类继承父类并重写了print方法public class TestVisualInvoke { public static class Father { public void print() { System.out.println("father's print"); } } p...
2019-03-27 23:49:11
729
原创 case-主从延迟问题排查
一、背景突然有大量业务人员反馈,原有功能不好用。二、解决过程1. 查看数据状态马上查询数据库查询发现该数据valid字段状态不正确,所以不能进行正常功能的操作。2. 修复数据减少影响范围降低损失:由于不是我负责的业务,所以马上查看代码逻辑。找到补救状态而且不影响后续流程的方法,并且确定查找问题的日志都齐全不用保留现场,马上进行操作补救。三、问题分析上一步是为了临时解...
2018-10-25 21:26:25
367
原创 case-服务超时排查
一、问题描述线上的一个服务A连续出现rpc调用服务B超时报错。仔细看了一下报警发现超时的rpc服务B都是在集中在一台服务器h上,并且都是一个接口访问失败。初步排除网络抖动原因和受诉宿主机影响,因为异常还在出现,根据该接口平常qps情况应该是该接口所有请求都超时了。二、原因分析1. 查看系统各项监控指标:CPU:最上边的线就是该服务器,可以看出cpu使用率很高远超出其他机...
2018-10-18 16:14:55
583
原创 springboot jar jsp
我选择springboot 版本1.4.2.RELEASE这个版本。1.5.x的版本已经不再支持这么干了。选择了版本还需要将jsp打包到,springboot jar 包的META-INF/resources/目录下。两个方法:一:<resources> <resource> <!-- 指定resources插件处理哪个目录下...
2017-11-07 23:45:34
637
原创 java文件上传
未完待续...参考:http1.1协议 点击打开链接 点击打开链接百度http协议点击打开链接spring-multipart API 点击打开链接servlet3.0 点击打开链接fileupload 点击打开链接 点击打开链接 点击打开链接单文件servlet API 点击打开链接 点击打开链接http multipart 点击打开链接
2017-08-31 21:02:59
727
原创 AVL 树 学习概要
一、AVL 树是什么?AVL是一种自平衡的二叉查找树,最大的特点是AVL树任意两个节点的高度差最大为1。什么?你问我二叉查找树是啥?拉黑吧有事漂流瓶联系吧。。。那么请你先去看看什么是二叉查找树在来看AVL吧。二、怎么实现的?当然实在二叉树插入或删除数据的时候进行一些 平衡 操作啦。在AVL树中插入或删除一个节点,使得二叉树失去平衡分为四种状态。(图片来自参考内容)1
2017-03-13 13:54:53
284
原创 Floyd算法
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。步骤如下:加权图 G,边的距离dis[][], 前驱节点记录path[][]1:遍历 G 的节点 n1 ,尝试 是否满足 存在两个节点 a,b 使: [a->b] > [a->n1->b], 如果存在那么 修改 dis[a][b] = dis[a][n1]+dis[n
2017-02-24 14:31:35
311
原创 kruskal
最小生成树算法-kruskal:graph[][] 图lines[] 图的所有边nodes[] 所有节点(初始值所有节点,每个节点的父子均为空)static class Line{ public Line(int from, int to, int weight){ this.from = from; this.to = to; this.weight = w
2017-02-17 17:26:39
527
原创 prim
最小生成树prim算法:graph[][] 待生成树的图,used[] 使用过的节点,distance[] 生成树到各节点的最短距离,start 任意起始点。1:将 start 放入 used ,从起始点 start 遍历周边节点,将可到达的节点的距离放入 distance 。public static void init(int[][] graph, boolean[]
2017-02-17 17:14:50
334
原创 a*
a*算法是搜索最短路径的算法(曼哈顿距离)。你要记住一个公式 F=G(从起点到该放个的当前最小消耗)+H(预估到终点距离)整个搜索过程中有:graph[][]搜索地图, used搜索过的节点集合,waiting 等待搜索的节点集合。起始点 start,终点 end1:将 start 放入 waiting2:从 waiting 中取出 F 最小并且不在 used 中的节点为当
2017-02-17 16:54:47
249
原创 Dijkstra
Dijkstra图的最短路径算法。搜索过程中有 一个搜索过的节点 used ,一个 起始点到各点的最短距离distance, 一个前驱节点表 prev 用来标识这个节点在distance存储的距离的前驱节点,最后用于生成最短路径。1:将 start 放入 used ,从起始点 start 遍历周边节点,将可到达的节点的距离放入 distance ,并将 prev 中的对应节点的前驱设置为
2017-02-17 16:35:13
297
原创 KMP
kmp字符串是匹配算法。利用一个next数组大大缩短每次子串对原串的遍历次数。next数组实际保存的就是子串的自我覆盖程度。子串当前位置前有n位数与从头开始到n位数相同,这样当前位置错误判断就可以到n位匹配而不是直接到0匹配。private int[] createNext(char[] str){ int[] next = new int[str.length]; next[
2017-02-17 15:58:12
262
原创 最优二叉树
最优二叉树又叫huffman树。在此直接介绍构造树的方法。构造过程中有一个节点数组 nodes1:从 nodes 中获取权值最小的两个 node。2:将两个 node 组成一个树父节点 nRoot 权值为两个 node 权值之和,从 nodes 中删除两个 node 并将 nRoot 添加到 nodes 中。直到 nodes 中只剩余一个节点。那么huffman tree构造完
2017-02-17 14:42:49
1156
原创 基数排序
基数排序一种基于多关键字的排序。对多关键字进行多次排序,但是排序算法要是稳定的,否则结果会发生不可预估的错误。如:对数字排序,先对个位排序,在对十位进行排序。。。并且可以用桶排序对每个关键字装桶。例子:@Override public int[] sort(int[] source) { int max = source[SortUtils.maxIndex(source)];
2017-02-17 14:34:50
315
原创 计数排序
计数排序有一个source数组,一个count数组,一个sorted数组,count数组是可以表示source最小数 min 到最大数 max 的范围。遍历source在count中记录对应数出现的次数。count[souce[i] - min]++将count数据转换为对应数据应该出现的位置。count[i] += count[i - 1]遍历source并在count获取排序位
2017-02-17 14:21:05
307
原创 桶排序
桶排序不是基于比较的排序算法,最快的效率可以达到 O(n)。但是是很费空间的一种排序算法。将数据按一定原则分桶,如 10,29,18,38 按 n/10分桶,那么可分为 0:[], 1:[10,18], 2:[29], 3:[38] 四桶。然后在对桶中的数据单独排序(如在新增数据的时候作插入排序),极限情况下,一个桶中只有一个数据那么时间复杂度就是O(n)了。
2017-02-17 14:16:28
363
原创 快速排序
时间复杂度:O(n*log2n)算法稳定性:不稳定原理:1:首先在数组中选取一个参照点 T。2:将数组调整为 T 左边所有点Tl小于 T, T 右边所有点Tr 大于等于T。3:递归的对 Tl 和 Tr 执行 1,2,3步骤知道不能再分。没有图!注:本系列算法是用于记录自己学习算法阶段对每个算法的自己理解。
2017-02-17 14:04:51
238
原创 堆排序
时间复杂度:O(n*log2n) 算法稳定性:不稳定原理:利用大根堆进行排序。步骤:整个排序过程中整个数组 E 分为两部分:有一个大根堆区 A(初始为整个数组), 和一个 已排序队列 B(B=E-A,初始为空)。主要步骤分为构建大根堆和排序两部分。--声明 新入节点堆调整步骤 ----trim:新入节点 new
2017-02-17 13:57:01
315
原创 归并排序
时间复杂度:O(n log n) 算法稳定性:稳定原理:将两个有序数组归并为一个有序数组。(元素数量为 1 时也是有序数组哦)步骤:整个排序过程中有一个原数组 S ,有一个临时数组 T。分为两个步骤分割和归并。1:将数组递归的从中间分割为两个子序列,直到不可在分(即子序列元素数量小于 1 )。然后利用 T 对两个子序列进行归并, 在将 T 中数据复制到 S。
2017-02-17 11:28:36
194
原创 选择排序
时间复杂度: 算法稳定性:不稳定步骤:在排序过程中整个数组 E 分为两个部分,第一部分已排序序列 A(在数组前端开始,初始为空),第二部分是未排序列 B( B=E-A)。1:遍历 B ,在 B 中找到最小的元素 min。2:将 B 中开头元素 start 与 min 交换位置,并将 min 加入到 A 中。3:循环 1,2 直到 B 中为空。没有图!注:
2017-02-17 11:09:10
218
原创 插入排序
时间复杂度: 算法稳定性:稳定步骤:在排序过程中整个数组 E 分为两个部分,第一部分已排序序列 A(在数组前端开始,初始为数组第一个元素),第二部分是未排序列 B( B=E-A)。1:选择 B 中最前端的元素,放入 A 中。2:将新加入的元素 c 与在他前一个元素 d 比较,如果 c 3:循环执行 1,2 直到 B 为空。没有图!注:本系列算法是用于记录自己
2017-02-17 10:50:40
171
原创 冒泡排序
时间复杂度: 算法稳定性:稳定(如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的)步骤:在排序过程中整个序列分为两个部分,第一部分未排序部分 A(初始时是整个待排序列),第二部分是已排序列 B(初始时是空的)。1:比较 A 的相邻元素,如果第一个元素大于第二个元素那么交换两个元素位置。2:循环执行 1 ,直到比较完整个 A。此时 A 中最后一个元素就是 A 最大
2017-02-17 10:22:18
189
java并发编程实战
2018-05-18
实现领域驱动设计
2018-01-09
尽在双11:阿里巴巴技术演进与超越
2018-01-02
领域驱动设计(简版和完整版)
2017-12-29
android屏幕同步显示到电脑屏幕
2016-09-27
请问大型网站的权限管理也是通过判断url管理的吗
2017-01-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人