文章摘要
Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。项目中的定时任务有使用到Quartz,这里就简单记录下其有关概念以及时间设置,方便记忆及以后查看。
Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
Arthas 采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
挖坑待填…
之前项目中怼Netty的高性能编程进行了实践,其中Netty 的接收和发送 ByteBuffer有用到堆外内存 DIRECT BUFFERS。使用堆外直接内存进行 Socket 读写,好处是不需要进行字节缓冲区的二次拷贝,实现了Netty的零拷贝。但是堆外内存不能被GC回收,必须遵循“谁分配,谁释放”的原则,在使用堆外内存后如果没有及时的释放,则很有可能导致OOM问题,具体可以参考这篇文章:Netty直接内存泄露;而如果对堆外内存进行了重复释放,服务则会抛出Netty引用计数异常问题。
本文旨在结合源码,对Netty的引用计数对象进行简析。
最近在做接口服务内存和CPU优化,使用Netty版本为netty-all-4.1.29.Final
,对于行情数据我们采用Netty的直接内存进行存储,Netty的几种ByteBuf
介绍见:Netty常见内存结构 ,当前我们使用的是PooledByteBufAllocator
,所以每次内存使用完毕后都需要通过release()
方法手动回收直接内存。
使用Netty的直接内存有点与C类似,自己malloc的对象需要自己free;但与C不同的是,在内有引用计数器,外有Java的GC的场景下,Netty直接内存的使用更为复杂,对内存的使用稍有纰漏就会导致整个服务挂掉。在一次优化版本中,就出现了很严重的Netty直接内存泄露的问题。