前言
在不同服务部署在不同的机器上的前提下,服务器之间存在大量的网络通信,这时候就需要写大量的网络通信的代码,十分不方便。如果能够让服务器调用远程方法就像是调用本地方法一样,将会大大减少工作量,这种方法的实现其实就是RPC。
在看JVM性能调优和故障处理工具的时候JDK提供了一些比较好用的工具,比如说jps是一个用来监控虚拟机的进程状况的工具,jstat是一个虚拟机统计信息监视的工具,jinfo是一个Java配置信息工具,jmap是一个Java内存映像工具,jstack是一个堆栈跟踪工具等等,这些工具都十分小巧实用。但是最近发现一个阿里开源的Java在线诊断工具Arthas(阿尔萨斯),可堪称诊断利器。官方文档是这么介绍的:
当你遇到以下类似问题而束手无策时,
Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
这么强大的功能,看起来就十分吸引人,赶紧学起来。
先放上官方的链接 Arthas用户文档
垃圾收集(GC)与内存动态分配,是JVM中很重要的一块内容,与C++语言不同的是,Java语言能够自己对内存进行回收以及动态分配,但是仍然可能产生内存的溢出或者内存泄漏的问题,所以了解垃圾收集与内存分配的原理是必须的。从JVM的内存划分区域来看,栈区(由于是以HotSpot虚拟机为例,将Java虚拟机栈以及本地方法区栈统称为栈区)、程序计数器是线程私有的,随着线程的消亡而消失,这几个区域的内存分配与回收都存在确定性,所以这几个区域就不必去过多考虑回收的问题。但是,堆和方法区就不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中多个分支需要的内存可能也不一样,我们只有在程序运行的过程中才会知道创建哪些对象,这部分的内存分配和回收是动态的,所以这两个区域是垃圾回收和内存分配所重点关注的区域。其中Java堆区是垃圾收集器主要管理的区域。