文章字数:108,阅读全文大约需要1分钟
1 | package com.colin.tool.img; |
- 视频截取关键帧
1 | package com.colin.tool.img; |
文章字数:108,阅读全文大约需要1分钟
1 | package com.colin.tool.img; |
1 | package com.colin.tool.img; |
文章字数:69,阅读全文大约需要1分钟
1 | <dependency> |
chi_sim
和英文eng
1 | package com.colin.tool.img; |
文章字数:812,阅读全文大约需要3分钟
JIT(Just in time compilation)及时编译,能够让java程序执行速度提升
cpu编译优化
:针对特定的处理器型号指令集编译热点代码,提升性能减少查表次数
:调用Object.equals()
方法,在运行时发现一直是在调用String
的equals()
编译后直接调用String.equals()
逃逸分析
:变量默认分配在主存上,但是方法中变量未逃出使用的生命周期则可以考虑在栈上分配内存。如果是对象则可以标量替换(对象替换成相应字段的变量)寄存器分配
:部分变量可以分配在寄存器中,相对主存,读取性能提升。热点代码机器码缓存
:缓存热点代码的机器码,但是缓存空间有固定大小,到达上限就不能缓存了方法内联
:热点方法的内部调用的方法会被复制到调用方法里,减少调用开销。1 | //次数限制 |
1 | 1.更小的方法体,JVM总是偏好更小的方法。 |
变量在HotSpot VM中逃逸分析的类别分为
NoEscape
:未逃逸,可以进行标量替换(用局部变量替换对象字段)ArgEscape
:作为参数被传入其它方法中,此情况下如果被调用的方法和调用方法产生方法内联,也可以进行标量替换。GlobalEscape
:无法标量替换文章字数:737,阅读全文大约需要2分钟
javap
工具avap是JDK提供的一个命令行工具,javap能对给定的class文件提供的字节代码进行反编译。相对于
jd
,javap
能够查看java编译器为我们生成的字节码,有利于程序调优。
使用方式:(命令行状态下)
1 | javap <选项> <类名> |
部分常用命令(1.8)
1 | -l 打印行和本地变量表 |
Fernflower.jar
批量反编译java字节码,idea使用的就是这种方法。、
使用
1 | # 二、java -jar fernflower.jar <目标>.jar <文件夹名>/ |
java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。
能够使加载的类与物理保存的.class文件不同,热部署的实现支持之一。常用于累的监控。
就是使用代理类,类加载前会执行代理类的指定方法处理字节码。
javap
和Fernflower.jar
是反编译java class文件的工具,只是各有特点。Instrumentation
可以代理类,在加载前使用asm修改类。(JavaAgent java探针、代理)的实现
Instrumentation
可以编写代码使用javaagent代理执行其它java文件,在代码里使用上面的asm库动态修改代码。也可以直接将所有字节保存,并加载其它class文件。
文章字数:125,阅读全文大约需要1分钟
用
sql
的脚本生成了数据,再使用jpa
修改数据时出现报错。
看提示发现是Integer
报了空指针的异常。查看出错位置IntegetType.class
1 | public Integer next(Integer current, SessionImplementor session) { |
查看调用栈,大致定位到jpa
在进行CAS
修改操作时旧版本号的数据没找到。Versioning.class
1 | public static Object increment(Object version, VersionType versionType, SessionImplementor session) { |
查看Model
的定义,发现有一个被@version
注解的字段没有被赋值。
在脚本中添加上版本字段的值
文章字数:225,阅读全文大约需要1分钟
dump
是将虚拟机运行时的快照,将运行时信息保存到文件。分为线程dump
纯文本、堆dump
包含线程dump
和堆对象,二进制。
jdk
的bin
目录下,包含java
命令及常用工具
jps
: 查看本机的java
中进程信息jstack
: 打印线程的栈信息,制作线程dump
jmap
: 打印内存映射,制作堆dump
jstat
: 性能监控工具jhat
: 内存分析工具jconsole
: 简易的可视化控制台jvisualvm
: 功能强大的控制台dump
1 | -XX:+HeapDumpOnOutOfMemoryError |
图形化工具制作dump
使用jdk
自带的工具Java VisualVM
命令行制作
jstack
: 打印线程的栈信息,制作线程dump
jmap
: 打印内存映射,制作堆dump
1 | ps -ef | grep java |
文章字数:476,阅读全文大约需要1分钟
浏览器访问
java
后端的页面,然后一直在转圈圈。很久了也没有反应
http
连接没有设置超时java
的日志,发现没有任何日志输出。redis
信息1 | redisTemplate.getConnectionFactory().getConnection().info() |
redis
信息,并且输出信息到前端。connectionFactory
获取了连接,但是会不会自动释放。看了一下源代码,似乎没有释放的环节。redisTemplate
代码,看看执行其他命令的时候是怎么获取到连接的execute
方法
1 | public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) { |
RedisConnectionUtils.getConnection(factory);
的内部实现也是getConnectionFactory().getConnection()
,所以可以知道确是没有自动释放,需要手动释放一下
1 | RedisConnectionFactory factory = redisTemplate.getConnectionFactory(); |
现在看来无响应应该就是获取redis
连接的代码堵塞了,循环导致被占用的连接数越来越多,直到连接池被沾满。这也解释了为什么后台无信息输出,因为很多的线程也是依赖redis
文章字数:103,阅读全文大约需要1分钟
Vert.x
是一款依托于Netty
的事件驱动的框架,相对于传统的服务器架构,更加轻量级,高性能。
springWebFlux
是随着Spring 5
推出的响应式web框架。基于HTTP/Reactive Streams
,运行环境需要支持异步运行的环境,如Netty
、Undertow
。开发模式上支持Spring WebMVC
风格的注解@Controller
RequestMapping
和java8的lambda
风格函数。
文章字数:149,阅读全文大约需要1分钟
1 | //B应用为服务端:将udp监听放到一个线程中,当有客户端请求时就会进行响应 |
1 | /*** |