JAVA的JMH:微基准性能测试利器

得益于OPENJDK的贡献,JAVA领域出现了JMH这样的微基准性能测试利器。 平时在对比两个功能实现的时候,预热,多次测试,平均值,性能度量等要考虑一堆要素,使用JMH,可以通过注解的方式,非常快速的解决这些常见的诉求,使得开发人员只要聚焦在被测试的代码段上就好了。 介绍JMH详情用法的很多,这里只提两点,第一个就是POM依赖的正确引入,第二个就是如何运行起来。 一、POM依赖引入 注意,一定要记得引入第二个。否则。。。 二、如何运行起来 看起来这个问题是一个不应该存在的问题,但是我看了一堆JMH的文章,大家都在认真的介绍JMH的各种特性,但是对于初学者来说,先把例子跑起来,最直观的感受才会 …

JAVA隔离机制漫谈

最近遇到一个事情,一个JAVA业务系统进程频繁崩溃,测试环境几乎每天一次,多的时候一天多次,非常让人恼火,而且这种崩溃,不是报一个异常业务流程终止,而是JVM进程崩溃掉了。分析过程就不谈了,挺曲折,最终使用gdb和jstat联合分析程序崩溃时的现场,发现是企业微信提供的SDK导致的问题。 至此,现象首先明确了。企业微信的JAVA版的SDK实际上是使用了JNI技术调用了C编写的动态库。而底层C动态库在执行时遇到了问题(比如内存分配问题)出现异常,这种异常导致了整个JVM进程的崩溃。 详细的避免方案以及解决方案还在分析中。不过也让我想到另外一个问题,多年之前也遇到过一个JNI的问题,因为参数没有校 …

关于JVM垃圾收集器相关的一点事情

最近在翻JAVA官方的一些文档。关于JAVA垃圾收集器GC的内容,是重点之一。 GC名称 中文名称 启用参数 特性 备注 Serial Collector 串行收集器 -XX:+UseSerialGC 单线程垃圾回收 Parallel Collector 并行收集器 -XX:+UseParallelGC 多线程垃圾回收 Garbage-First(G1) Garbage Collector G1收集器 -XX:+UseG1GC 延迟可控垃圾回收 The Z Garbage Collector Z收集器 -XX:+UseZGC 低延迟垃圾回收 用于延迟敏感型 至于大家常提起的CMS,过渡阶段的产 …

JAVA中阻塞队列BlockingQueue接口方法的多场景支持设计

BlockingQueue是JDK中的常用接口类型,对于队列来讲,最常用的操作当属元素的入队与出队,而BlockQueue虽然叫阻塞队列,但是却通过对于入队和出队操作的分场景设计,实现了对多种场景需求的满足。需要阻塞的,需要抛出异常的,还是需要等待一个时间间隔不满足再失败的,都完美支持。 场景需求 抛出异常的 返回特定值的 阻塞的 超时的 插入元素(入队) boolean add(e) boolean offer(e) void put(e) boolean offer(e, time, unit) 移除元素(出队) boolean remove(Object o) E poll() E ta …

架构杂谈:JAVA包命名设计

常见的JAVA Package命名规范如下: 在java开发的过程中,每名Java开发人员都可以编写属于自己的java package,为了在编写中保证每一个java package命名的唯一性,要求开发人员在自己定义的包名前加上唯一的前缀。所以多数开发人员采用自己公司的名称.项目名.模块名…在互联网上的域名称作为自己程序包的唯一前缀。例如: com.sun.xml… 但要是个人的项目我们又应该怎么命名呢?indi :个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,版权主要属于发起者。包名为indi.发起者名.项目名.模块名*..pers :个人项目 …