如何使用 jstack 分析异常线程以及线程状态
使用top命令定位异常进程。找到CPU和内存占用率都非常高的pid,假设为11268 top 此时可以再执行ps -ef | grep java,查看所有的java进程,在结果中找到进程号为11268的进程,可以查看是哪个应用占用的该进程。 ps -ef|grep java 使用top -H -p 进程号查看异常线程,(-H : 加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。) top -H -p 11268 使用printf "%x\n" 线程号将异常线程号转化为16进制,假设异常线程为11422 printf "%x\n" 11422 -> 2c9e 使用jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置(-A90是指输出的日志行数)。可以看到异常代码的位置。 jstack 11268|grep 2c9e -A90 介绍top命令在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序 通过top -Hp 可以查看...
记录雪花算法ID到前端之后丢失精度
问题描述 12345后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况。例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440js中的number类型是16位的,而雪花id是19位 下图可以看出,输入的值超出安全值,可能会被js自动转化 3种jackason解决方式(前端再把String类型的19位数字传回服务端的时候,服务端还是接收long类型即可,这是Spring反序列化参数接收默认支持的行为) 重新注册ObjectMapper的Long类型序列化方式 123456789101112131415161718192021222324@Configurationpublic class LongClassMessageConverter implements InitializingBean { @Resource ObjectMapper objectMapper; private SimpleModule getSimpleModule() { ...
利用KeyTool生成自签名证书
任何机构或者个人都可以申请数字证书,并使用由CA机构颁发的数字证书为自己的应用保驾护航。常用的两个证书管理工具:KeyTool,OpenSSL--->构建CSR(Certificate Signing Request,数字证书签发申请),交由CA机构签发,形成最终的数字证书。 最近用到p12文件,就记录一下如何使用jdk自带的keytool来创建p12文件 打开cmd,切换到jdk的bin目录下 输入命令 1keytool -genkeypair -alias serverkey -keyalg RSA -keysize 2048 -validity 3650 -keystore D:\rabbitmq\tls-gen-master\p12test.keystore 参数解释: 12345678storepass: keystore文件存储密码,不加这个参数会在后面要求你输入密码keypass 私钥加解密密码alias 实体别名(包括证书私钥)dname 证书个人信息keyalg 采用公钥算法,默认是DSA,这里采用RSAkeysize 密钥长度(DSA算...
BigDecimal工具类小记
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120...
一个jdbc批量处理的工具类
12345678910111213141516171819202122232425262728293031323334353637383940414243// batchUtils.batchUpdateOrInsert(数据集合, xxxxx.class, (item, mapper实例对象) -> mapper实例对象.insert方法(item));public class MybatisBatchUtils { /** * 每次处理1000条 */ private static final int BATCH_SIZE = 1000; @Resource private SqlSessionFactory sqlSessionFactory; /** * 批量处理修改或者插入 * * @param data 需要被处理的数据 * @param mapperClass Mybatis的Mapper类 * @param function 自定义处理逻辑 * @return ...
关于Serializable的认识
首先,如果对象需要网络传输或者持久化(我的理解是dto和entity/model),那么就需要实现Serializable接口。为了防止反序列失败,该对象需提供一个默认的serialVersionUID(该值在反序列化的时候会进行校验,如果校验失败会抛异常-InvalidClassException)。 但如果只是转换为json字符串的形式与网络打交道(比如MVC中前后端分离情况下,返回json-response给前端),那么这个response对象就不需要实现Serializable接口。 关于 UID serialVersionUID有两种显式的生成方式: 12一个是默认的1L一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段, 如果没有显式地定义一个名为serialVersionUID的long型的变量,编译器在编译的时候也会根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,这就决定了这个类在序列化上一定不是向前兼容的 使用默认计算的serialVersionUID就会有一个明显的劣势 1234使用默认计算的seri...
各层对象含义
PO(Persistant Object) 持久对象用于表示数据库中的一条记录映射成的 java 对象。PO 仅仅用于表示数据,没有任何数据操作。通常遵守 Java Bean 的规范,拥有 getter/setter 方法。 可以理解是一个PO就是数据库中的一条记录;可以理解某个事务依赖的原始数据;好处是可以将一条记录最为一个对象处理,可以方便转化为其他对象 POJO (Plain Old Java Object)POJO是“Plain Ordinary Java Object”的缩写,意为“简单的Java对象”。POJO通常指的是一个没有任何限制、继承或实现特定接口的普通Java对象。POJO对象通常是一种轻量级的Java对象,没有任何框架或者注解的依赖。在Java开发中,POJO对象通常用于表示简单的数据模型或者数据传输对象。最基本的 Java Bean 只有属性加上属性的 get 和 set 方法。可以转化为 PO、DTO、VO;比如 POJO 在传输过程中就是 DTO。 BO(Business Object) 业务对象封装对象、复杂对象,里面可能包含多个类主要作...
线程池知识记录
七大参数一、corePoolSize 线程池核心线程大小线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了 allowCoreThreadTimeOut。这里的最小线程数量即是 corePoolSize。 二、maximumPoolSize 线程池最大线程数量一个任务被提交到线程池以后,首先会找有没有空闲存活线程,如果有则直接将任务交给这个空闲线程来执行,如果没有则会缓存到工作队列中,如果工作队列满了,才会创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由 maximumPoolSize 指定。 三、keepAliveTime 空闲线程存活时间一个线程如果处于空闲状态,并且当前的线程数量大于 corePoolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由 keepAliveTime 来设定。 四、unit 空闲线程存活时间单位keepAliveTime 的计量单位。 五、workQueue 工作队列新...
(Address already in use xxx) or (No buffer space available (maximum connections reached) connect)
No buffer space available (maximum connections reached?): connect Address already in use xxx 123一般可以先查看代码中是否有一些连接未关闭1. 比如es的restclient,或者其他的httpclient2. 再或者可以检查下是否有长时间占用未被释放的jdbc connection
记录arthas的使用
参考: https://blog.csdn.net/qq_27184497/article/details/118875205 什么是 Arthas摘录一段官方 Github 上的简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。 Arthas 基于哪些工具开发而来 greys-anatomy: Arthas代码基于Greys二次开发而...
