#JAVA

现代计算机为了提高主存访问速度,通常会有多级缓存。CPU不直接读写主存,而是对L1/L2/L3缓存进行读写。为了提高效率,缓存加载并不是一次一个字节,而是一次加载一个缓存行大小的数据到缓存。如果CPU对缓存行的数据进行了修改,就需要将缓存行写回主存。

由于现代计算机的处理器通常不止一个核,那么如果不同的核心对同一个缓存行进行频繁的读写,就可能存在缓存行频繁的加载和写回主存,造成的后果就是缓存行频繁失效,每次操作都需要重新加载缓存行。而缓存命中和缓存miss情况下CPU耗费的时间是有较大差距的,这种情况下通常会导致吞吐量降低。这种情况我们称为伪共享。

阅读更多

缓存是提高性能一种有效手段,从处理器的L1,L2,L3缓存,到各种内存缓存,再到分布式缓存、CDN等,无不是通过增加缓存层,提高数据访问的速度。然而缓存是宝贵的,也是稀有的,必然涉及缓存满了,需要淘汰部分内容的问题。LRU(Least Recently Used), 是其中较为经典的一种算法,翻译过来就是最近最少使用策略。

阅读更多

ParNew是一个比较常用的年轻代垃圾回收期,采用复制算法进行回收。一般ParNew不会占用很高的CPU,之前遇到过的ParNew高CPU的情况也是内存分配很快导致的,这种情况下ParNew的表现是ParNew回收很频繁,单次回收很快。而这次要说的这个情况不是这样,他的GC频率不会太高,但是单次GC花费很长的CPU时间,导致的结果就是服务器CPU使用率打满,这个服务性能降级,负载分担到其他节点。不幸的是,这个症状一段时间后’传染’到其他节点,整个集群的节点一个接一个的跑满CPU,形成一种雪崩效应。

阅读更多

在上一篇博客初窥AspectJ中,我们提到AspectJ给java提供了三种新的结构,pointcut,advice以及inter-type declaration(ITD),而且我们通过一个简单的Demo介绍了如何使用pointcut和advice。而本文将介绍inter-type declaration是什么,可以做什么,最后同样会通过一个Demo来介绍如何使用。后文将主要用ITD来表示inter-type declaration。

本文中Demo的代码可以在github aspect-demo中找到。

阅读更多

AspectJ可以说是Java中当之无愧的黑魔法。说它是黑魔法,一方面是因为它很强大,能够解决一些传统编程方法论解决不了的问题,而另一方面,它也相当的晦涩,有着比较陡峭的学习曲线。

本文将带大家探索下AspectJ是什么,能做什么,以及如何来做,希望通过本文能够让大家初窥AspectJ之门道。

阅读更多

Troubleshooting是我平时工作中的重要内容,我几乎每天都会花一些时间在定位客户环境的问题上,有很多的问题都需要通过抓包来协助分析,比如定位SSL handshake失败,SNMP请求没响应的问题等。Linux平台一般使用tcpdump抓包,由于我们只能通过远程脚本调用的方式执行,所以对windows我没法使用wireshark之类的GUI工具,所以一般用netsh( 参考资料3)进行抓包。但是,linux上有时候并没有安装tcpdump或者登录的用户没有权限执行tcpdump,而且windows上使用netsh抓包很麻烦,而且过滤方式很弱,所以,我们就想着能不能有其他的抓包方式。

阅读更多

BTrace是一个动态追踪工具,那么必然要求所有的操作都是只写操作,不会修改目标程序的运行状态。所以,BTrace能做的事情是有限的。一般来讲,一个BTrace类满足下面的条件:

阅读更多

BTrace是Java平台很强大的动态追踪工具,主要通过写BTrace脚本来实现,其主要功能是通过注解来实现的,这篇文章列出主要的一些注解。

阅读更多

在上一篇博客中,我们知道可以使用JCMD来采集JFR文件。这篇文章将介绍除了JCMD之外的两种录制JFR的方法。

阅读更多

我在上一篇博客中简单介绍了JCMD的几个常见的用法,可以进行线程dump,内存转存,内存对象直方图分析等。可以说,JCMD集成了以前我们常用的jstack,jps,jmap等命令,就像瑞士军刀一样,all in one。除了这些功能,JCMD还能够采集JFR信息进行性能分析。

阅读更多

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×