Java线上CPU占用过高问题排查--火焰图
日常开发过程中,有时会出现线上机器CPU飙高,这很可能导致服务宕机,造成线上事故。如何快速找出程序问题所在,是必须掌握的技巧,这里分享使用火焰图来定位问题。 首先得明白什么是火焰图。简单的讲:整个图形看起来就像一团跳动的火焰. 燃烧在火苗尖部的就是 CPU 正在执行的操作, 不过需要说明的是颜色是随机的, 本身并没有特殊的含义, 纵向表示调用栈的深度, 横向表示消耗的时间. 因为调用栈在横向会按照字母排序, 并且同样的调用栈会做合并, 所以一个格子的宽度越大越说明其可能是瓶颈. 所以, 主要就是看那些比较宽大的火苗, 特别留意那些类似平顶山的火苗. 要生成火焰图, 必须要有一个顺手的 Tracer 工具, 如果操作系统是 Linux 的话, 那么选择通常是 perf, systemtap 中的一种. 其中 perf 相对更常用, 因为它是 Linux Kernel 内置的性能调优工具, 多数 Linux 都包含了它, 有兴趣的读者稍后可以参考 Linux Profiling at Netflix 中的介绍. 火焰图生成工具常用的生成工具是Brendan D. Gregg 的...
electron导出excel
前言最近在弄一个Electron小项目,需要生成并导出Excel文件,踩到了一些坑,记录一下,避免以后再翻车。 正文eletron进程分为主进程和渲染进程,文件导出在两个进程中实现不一样,这里主要讲使用json导出excel,其他格式导出方法类似,话不多说,直接上代码 在渲染进程中使用第一步: 安装 file-saver 和 xlsx 1yarn add file-saver xlsx 第二步:在要用的组件用中引入 123456789101112131415161718192021222324import FileSaver from 'file-saver'import XLSX from 'xlsx'// 需要导出的jsonconst json =[{ 'name':'weylan', 'sex':'男', 'age':18}]const exportExcel = ()=>{ ...
spring中发布订阅模式实践
概述在实际开发中,经常会碰到要去解耦合一些依赖调用,比如单成功后会发送手机短信、发送绑定邮箱、数据库更新后通知发送mq等。而且通知这个操作又不希望强耦合在主业务流程中,这个时候我们很容易就想到了发布订阅(观察者)设计模式。 首先看代码实现: 定义事件类型 1234567891011121314151617import org.springframework.context.ApplicationEvent;public class MessageEvent extends ApplicationEvent { private String message; public MessageEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; ...
Java基本容器底层原理分析
概述容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 CollectionList ArrayList:基于动态数组实现,支持随机访问。 LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 Vector:和 ArrayList 类似,但它是线程安全的。 Set HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 LinkedHashSet:具有 HashSet...
Redis面试题归纳
为什么使用 Redis在项目中使用 Redis,主要考虑两个角度:性能和并发。如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis。 性能: 如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 特别是在秒杀系统,在同一时间,几乎所有人都在点,都在下单。。。执行的是同一操作———向数据库查数据。 根据交互效果的不同,响应时间没有固定标准。在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。 并发 如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。 使用 Redis 的常见问题 缓存和数据库双写一致性问题 缓存雪崩问题 缓存击穿问题 缓存的并发竞争问题 单线程的 Redis 为什么这么快这个问题是对 Redis 内部机制的一个考察。很多人都不知道 Redis...
Redis过期策略实现原理
在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。 redis设置过期时间expire key time(以秒为单位)–这是最常用的方式 setex(String key, int seconds, String value)–字符串独有的方式 注: 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间 如果没有设置时间,那缓存就是永不过期 如果设置了过期时间,之后又想让缓存永不过期,使用persist...
Mycat分库分表实战
准备 准备数据库服务,这里作为学习用,我们就用一个数据库服务。dhost1: localhost 在dhost1服务创建三个数据库123CREATE DATABASE db1 CHARACTER SET 'utf8'; CREATE DATABASE db2 CHARACTER SET 'utf8'; CREATE DATABASE db3 CHARACTER SET 'utf8'; 配置好dataHost dataNode12345678910111213<mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 注意:里面的元素一定要按 schema 、dataNode 、 dataHost的顺序配置 -->0 <schema name="mydb" checkSQLschema="true" sqlMaxLimit="100"...
InnoDB为什么要选择B+树来存储数据
关于InnoDB索引,我们可能知道InnDB索引是用B+树实现的,而B+树就是一种能优化查询速度的数据结构。但我们又没想过这样一个问题,能优化查询速度的数据结构有很多,为什么InnoDB要采用B+树? 常见优化查询速度数据结构哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。 假设现在维护着一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下所示: 图中,User2 和 User4 根据身份证号算出来的值都是 N,但没关系,后面还跟了一个链表。假设,这时候你要查 ID_card_n2 对应的名字是什么,处理步骤就是:首先,将 ID_card_n2 通过哈希函数算出 N;然后,按顺序遍历,找到...