在Java JDK的安用装目录bin下,有一些有非常实用的小工具,可用于分析JVM初始配置、内存溢出异常等问题,我们接下来将对些常用的工具进行一些说明。

JDK小工具简介

在JDK的bin目录下面有一些小工具,如javac、jar、jstack、jstat等,在日常编译运行过程中有着不少的“额外”功能,那么它们是怎么工作的呢?虽然这些文件本身已经被编译成可执行二进制文件了,但是其实它们的功能都是由tools.jar这个工具包(配合一些dll或者so本地库)完成的,每个可执行文件都对应一个包含main函数入口的java类(有兴趣可以阅读openJDK相关的源码(时代Java的JDK8/Java8源码在线阅读),它们的对应关系如下(更多可去openJDK查阅):

javac com.sun.tools.javac.Main

jar sun.tools.jar.Main

jps sun.tools.jps.Jps

jstat sun.tools.jstat.Jstat

jstack sun.tools.jstack.JStack

...

工具/命令简要说明

javac - Java代码编译命令。

jar - 打包工具命令。

jstack - 查看和跟踪Java堆栈信息的工具。

jstat - 于监控虚拟机各种运行状态信息。

tools.jar的使用

我们一般开发机器上都会安装JDK+jre,这时候,要用这些工具,直接运行二进制可执行文件就行了,但是有时候,机器上只有jre而没有JDK,我们就无法用了么?

如果你知道如上的对应关系的话,我们就可以"构造"出这些工具来(当然也可以把JDK安装一遍,本篇只是介绍另一种选择),比如我们编写

//Hello.java

public class Hello{

public static void main(String[] args)throws Exception{

while(true){

test1();

Thread.sleep(1000L);

}

}

public static void test1(){

test2();

}

public static void test2(){

System.out.println("invoke test2");

}

}

可以验证如下功能转换关系

1.编译源文件:

javac Hello.java => java -cp tools.jar com.sun.tools.javac.Main Hello.java

结果一样,都可以生成Hello.class文件

然后我们开始运行java -cp . Hello

2.查看java进程:

jps => java -cp tools.jar sun.tools.jps.Jps

结果一样,如下:

4615 Jps

11048 jar

3003 Hello

3.jstat动态查看内存:

jstat -gcutil 3003 100 3 => java -cp tools.jar sun.tools.jstat.Jstat -gcutil 3003 100 3

发现结果是一样的

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

0.00 0.00 4.00 0.00 17.42 19.65 0 0.000 0 0.000 0.000

0.00 0.00 4.00 0.00 17.42 19.65 0 0.000 0 0.000 0.000

0.00 0.00 4.00 0.00 17.42 19.65 0 0.000 0 0.000 0.000

4.查看当前运行栈信息

正常情况,执行如下命令结果也是一样,可以正常输出

jstack 3003 =》 java -cp tools.jar sun.tools.jstack.JStack 3003

但是有的jre安装不正常的时候,会报如下错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no attach in java.library.path

这是因为jstack的运行需要attach本地库的支持,我们需要在系统变量里面配置上其路径,假如路径为/home/JDK/jre/bin/libattach.so

命令转换成

jstack 3003 =》 java -Djava.library.path=/home/JDK/jre/bin -cp tools.jar sun.tools.jstack.JStack 3003

就可以实现了

在linux系统中是libattach.so,而在windows系统中是attach.dll,它提供了一个与本机jvm通信的能力,利用它可以与本地的jvm进行通信,许多java小工具就可能通过它来获取jvm运行时状态,也可以对jvm执行一些操作。

jstack命令详解

jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",

Windows的jstack使用方式只支持以下的这种方式:jstack [-l] pid

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

需要注意的问题:

l 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的,不同的 JVM版本, dump信息也有差别。

l 在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。

2、命令格式

$jstack [ option ] pid

$jstack [ option ] executable core

$jstack [ option ] [server-id@]remote-hostname-or-IP

参数说明:

pid: java应用程序的进程号,一般可以通过jps来获得;

executable:产生core dump的java可执行程序;

core:打印出的core文件;

remote-hostname-or-ip:远程debug服务器的名称或IP;

server-id: 唯一id,假如一台主机上多个远程debug服务;

--

知识分享,时代前行!~~ 时代Java还有更多好文章……请查看历史文章和官网,有分享,有收获!

java自带工具_深入了解Java JDK自带工具,包括javac、jar、jstack等,实用~相关推荐

  1. java反编译工具_如何保护Java程序 才能防止Java反编译

    简介:Java是一种跨平台的.解释型语言.Java 源代码编译中间"字节码"存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如 ...

  2. java 集成开发工具_最好的Java开发人员测试和集成工具

    java 集成开发工具 通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控. 参加AppDynamics APM导览! 无论您是刚刚起步还是已经从事了一段时间,使用正确的工具进行编程都可 ...

  3. java 查看虚拟机状态_深入理解java虚拟机学习笔记(四)虚拟机性能监控与故障处理工具...

    一.JDK的命令行工具 1.jps:虚拟机进程状况工具 作用:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及查看本地虚拟机唯一id. 参数: m:运行时传入主类的参数: v:虚拟机参数: ...

  4. java 多版本管理工具_简介linux下的多版本管理工具—alternatives

    alternatives是Unix下重要的版本管理工具,它最早是在debain的系统中出现,因为它强大实用性使得它在各个Unix环境中大量的移植使用,而我们在平时的时候可能最经常使用的是java的op ...

  5. java实现镜像系统_谷歌开源Java镜像构建工具Jib

    容器的出现让Java开发人员比以往任何时候都更接近"编写一次,到处运行"的工作流程,但要对Java应用程序进行容器化并非易事:你必须编写Dockerfile,以root身份运行Do ...

  6. java最好用的json工具_推荐 9 个 爱不释手的 JSON 工具!

    Java技术栈 www.javastack.cn 关注优质文章 原文标题:JSON tools you don't want to miss 作者:Paul Krill,翻译:布加迪,出处:51CTO ...

  7. java万能编码转换_分享万能java字符串编码转换工具类

    package com.zuidaima.util; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public cla ...

  8. java虚拟机教程图解_深入拆解JAVA虚拟机学习教程

    搞JAVA的深入下去java虚拟机是必须掌握的知识,最近发现个不错的视频教程,学习了几篇讲得非常不错,推荐给大家.废话不多说,大看直接看目录吧. PS:主讲人是Oracle 高级研究员,计算机博士 郑 ...

  9. java 密码加密 盐_有效提高java编程安全性的12条黄金法则

    安全性是软件开发中最复杂,最广泛和最重要的考量之一.Java是具有许多内置安全性功能的开发平台,java在长期的发展过程中,已经经过了很多高强度的安全测试,并经常更新安全漏洞.并且Java生态系统还包 ...

最新文章

  1. pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引
  2. 在 Azure VM 上使用 Jitsi 搭建私人视频会议
  3. 智能家居实训系统的项目有感!
  4. struts2自己定义拦截器
  5. 注意力机制Attention Mechanism的数学原理
  6. 常用0x000000类型颜色代码表
  7. 基于go websocket写一个聊天室
  8. 一个文字类RPG游戏框架(走过路过别错过)C++
  9. 揭秘传智播客班级毕业薪资超7k的内幕系列 之三 ----国企慕名而来,将未毕业学员“抢走”,传智播客又一次定义“被就业”...
  10. css中的各种选择器
  11. 树莓派语音控制开关灯
  12. java导出excel 【POI 3.17】POI 版本不匹配解决方法
  13. 北京软件项目外包流程及管理
  14. jquery插件之进度条
  15. tomcat跨域请求
  16. 粤港澳大湾区9城最新购房政策一览
  17. PMP与ACP有什么区别?
  18. Keil5使用第一步
  19. 如何利用XMLSpy实现从多个XML实例生成架构
  20. Verycd上.net一些教程,自己留着做备忘..

热门文章

  1. 129. Leetcode 202. 快乐数 (哈希表)
  2. 数据挖掘流程(三):特征工程
  3. 文巾解题 面试题 03.06. 动物收容所
  4. java编写自动化脚本生成apk_Unity3D研究院之Android全自动打包生成apk(六十九)
  5. 今日话题:坚持真的有用吗?
  6. 【Python刷题】_10
  7. matlab读取.xyz文件及任意有间隔符数据
  8. 基于面板数据的熵值法
  9. 机器学习业务实践之路-李博-专题视频课程
  10. 【LeetCode从零单排】No198.House Robber No91.Decode Ways139 word break(动态规划典型应用)