常用的 JDK 自带命令行工具

heap

这里 可以找得到这些工具的列表,虽然官网上免责声明为 “The tools described in this section are unsupported and experimental in nature and should be used with that in mind. They might not be available in future JDK versions.”,但实际上这些工具还是非常有用的,尤其可以站在 JVM 的角度来定位问题。我在此简单罗列一些常用的工具和命令,以及相应的执行结果示例。如果你经常和 JVM 打交道,最好对这些工具的常用命令熟记。

 

jst

[……]阅读全文

使用堆外内存

有时候对内存进行大对象的读写,会引起 JVM 长时间的停顿,有时候则是希望最大程度地提高 JVM 的效率,我们需要自己来管理内存(看起来很像是 Java 像 C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的 EhCache(给它包装了个酷一点的名字,叫 BigMemory),以及现在项目中的 Memcached。在 nio 以前,是没有光明正大的做法的,有一个 work around 的办法是直接访问 Unsafe 类。如果你使用 Eclipse,默认是不允许访问 sun.misc 下面的类的,你需要稍微修改一下,给 Type Access Rules 里面添加一条所有类都可以访问的规则:

config

在使用 Uns

[……]阅读全文

JVM 问题定位工具

VisualVMJDB

JDB 是基于文本和命令行的调试工具,Jikes 在 JDB 的基础上提供了 GUI。熟悉 JDB 还是有价值的,很多情况下需要我们在命令行下完成简单的 debug 问题定位。

jdb -classpath bin com.xx.Example
jdb -connect com.sun.jdi.SocketAttach:hostname=myhost,port=8000
jdb -connect "com.sun.jdi.CommandLineLaunch:main=Hello 1 2 3"

我们可能更熟悉使用下面这样的方式来进行调试,但本质上就是在使用 JDB:

-agentlib:jdwp=tran

[……]阅读全文

JVM 致命错误日志(hs_err_pid.log)解读

java 致命错误出现的时候,JVM 生成了 hs_err_pid<pid>.log 这样的文件,其中往往包含了虚拟机崩溃原因的重要信息。因为经常遇到,在这篇文章里,我挑选了一个,并且逐段分析它包含的内容(文件可以在文章最后下载)。默认情况下文件是创建在工作目录下的(如果没权限创建的话 JVM 会尝试把文件写到/tmp 这样的临时目录下面去),当然,文件格式和路径也可以通过参数指定,比如:

java -XX:ErrorFile=/var/log/java/java_error%p.log

这个文件将包括:

  • 触发致命错误的操作异常或者信号;
  • 版本和配置信息;
  • 触发致命异常的线程详细信

[……]阅读全文

back to top