我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java中JDK内建工具有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java中JDK内建工具有哪些

这篇文章主要为大家展示了“java中JDK内建工具有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中JDK内建工具有哪些”这篇文章吧。

0、javap

你可以给 javap(Java Class文件反编译器)传递这些有用的参数:

  • -I – 打印行数和局部变量

  • -p – 打印包括非public在内的所有类和成员信息,

  • -c – 打印方法字节码

比如在著名的“你真的懂 Classloader 吗?”演讲里,当出现 NoSuchMethodException 错误时,我们可以执行以下命令来调查这个类究竟有哪些成员方法和获取这个类所有想找的信息:

javap -l -c -p Util2

java中JDK内建工具有哪些

当调试类内部信息或者研究随机字节码顺序时,javap 非常有用。

1、jjs

java中JDK内建工具有哪些

jjs命令可以启动一个 JavaScript 命令终端,你可以把它当做计算器或者用随机的JS字符串测试JS的古怪用法。不要让另一个 JavaScript 谜题让你措手不及!

哈,看到刚刚发生了什么了么?但是 JavaScript 是另一个话题,只需要知道即使没有 node.js 或浏览器你也可以用jjs知道JS是怎么工作的。

2、jhat

Java堆分析工具(jhat)正如它名字描述的那样:分析dump堆信息。在下面的小例子里,我们构造了一个 OutOfMemoryError  ,然后给这个 java 进程指定 -XX:+HeapDumpOnOutOfMemoryError ,这样运行时就会产生一个 dump  文件供我们分析。

public class OhMyMemory {  private static Map map = new HashMap<>();  public static void main(String[] args) {    Runtime.getRuntime().addShutdownHook(      new Thread() {        @Override        public void run() {          System.out.println("We have accumulated " + map.size() + " entries");        }      }    );    for(int i = 0; ;i++) {      map.put(Integer.toBinaryString(i), i);    } } }

产生一个 OutOfMemoryError 很简单(大部分情况下我们无意为之),我们只要不断地制造不让垃圾回收器起作用就可以了。

运行这段代码会产生如下输出:

org.shelajev.throwaway.jdktools.OhMyMemory java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid5644.hprof ... Heap dump file created [73169721 bytes in 0.645 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.resize(HashMap.java:703) at java.util.HashMap.putVal(HashMap.java:662) at java.util.HashMap.put(HashMap.java:611) at org.shelajev.throwaway.jdktools.OhMyMemory.main(OhMyMemory.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) We have accumulated 393217 entries

不错,我们现在有一个可供分析的文件了。我们对这个文件执行jhat开始进行分析,jhat 会分析这个文件开启一个 http 服务器供我们查看结果。

$ jhat java_pid5644.hprof Reading from java_pid5644.hprof... Dump file created Thu Aug 14 14:48:19 EEST 2014 Snapshot read, resolving... Resolving 1581103 objects... Chasing references, expect 316 dots... Eliminating duplicate references........ Snapshot resolved. Started HTTP server on port 7000 Server is ready.

可以通过访问 http://localhost:7000 来查看 dump 的数据。

java中JDK内建工具有哪些

在那个页面我们可以通过堆信息的柱状图了解究竟是什么耗尽了内存。

java中JDK内建工具有哪些

现在我们可以清晰地看到拥有 393567 结点的 HashMap 就是导致程序崩溃的元凶。虽然有更多可以检查内存分布使用情况和堆分析的工具,但是jhat是内置的,是分析的一个好的开端。

3、jmap

jmap 是一个内存映射工具,它提供了另外一种不需要引发 OutOfMemoryErrors 就可以获取堆 dump 文件的方法。我们稍微修改一下上面的程序看一下效果。

public class OhMyMemory {  private static Map map = new HashMap<>();  public static void main(String[] args) {    Runtime.getRuntime().addShutdownHook(      new Thread() {        @Override        public void run() {          try {            System.out.println("Enter something, so I'll release the process");            System.in.read();            System.out.println("We have accumulated " + map.size() + " entries");          }          catch (IOException e) {            e.printStackTrace();          }        }      }    );     for(int i = 0; i < 10000 ;i++) {      map.put(Integer.toBinaryString(i), i);    } } }

注意,现在我们不要消耗大量的内存,只是比较早结束并在进程关闭钩子里等待不让 JVM 退出。这样就允许我们用 jmap 连接这个进程获取珍贵的内存 dump。

因此你可以用 jmap 的两个功能来实现,获取堆统计信息和触发一个堆 dump。因此,当执行:

jmap -heap 1354(这里 1354 是上面程序运行的进程号),就可以获取一个很好的内存使用统计信息:

$ jmap -heap 1354                                                                                                                   Attaching to process ID 1354, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.0-b70  using thread-local object allocation. Parallel GC with 4 thread(s)  Heap Configuration:    MinHeapFreeRatio         = 40    MaxHeapFreeRatio         = 70    MaxHeapSize              = 67108864 (64.0MB)    NewSize                  = 1572864 (1.5MB)    MaxNewSize               = 22020096 (21.0MB)    OldSize                  = 45088768 (43.0MB)    NewRatio                 = 2    SurvivorRatio            = 8    MetaspaceSize            = 21807104 (20.796875MB)    CompressedClassSpaceSize = 1073741824 (1024.0MB)    MaxMetaspaceSize         = 17592186044415 MB    G1HeapRegionSize         = 0 (0.0MB)  Heap Usage: PS Young Generation Eden Space:    capacity = 1048576 (1.0MB)    used     = 628184 (0.5990829467773438MB)    free     = 420392 (0.40091705322265625MB)    59.908294677734375% used From Space:    capacity = 524288 (0.5MB)    used     = 491568 (0.4687957763671875MB)    free     = 32720 (0.0312042236328125MB)    93.7591552734375% used To Space:    capacity = 524288 (0.5MB)    used     = 0 (0.0MB)    free     = 524288 (0.5MB)    0.0% used PS Old Generation    capacity = 45088768 (43.0MB)    used     = 884736 (0.84375MB)    free     = 44204032 (42.15625MB)    1.9622093023255813% used  981 interned Strings occupying 64824 bytes.  $ jmap -dump:live,format=b,file=heap.bin 1354                                                                               Dumping heap to /Users/shelajev/workspace_idea/throwaway/heap.bin ... Heap dump file created

jmap 还可以简单地触发当前堆 dump,之后可以随意进行分析。你可以像下面例子中的那样,传一个 -dump 参数给 jmap。

现在有了 dump 得到的文件 heap.bin,就可以用你喜欢的内存分析工具来分析。

4、jps

jps 是显示 Java 程序系统进程(PID)最常用的工具。它与平台无关,非常好用。想象一下我们启动了上面的程序,然后想用 jmap 连接它。这个时候我们需要程序的 PID,jps 正好的派上用场。

$ jps -mlv 5911 com.intellij.rt.execution.application.AppMain org.shelajev.throwaway.jdktools.OhMyMemory -Xmx64m -Didea.launcher.port=7535 -Didea.launcher.bin.path=/Applications/IntelliJ IDEA 14 EAP.app/Contents/bin -Dfile.encoding=UTF-8 5544  -Dfile.encoding=UTF-8 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djsse.enableSNIExtension=false -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:+HeapDumpOnOutOfMemoryError -Xverify:none -Xbootclasspath/a:../lib/boot.jar -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=225m -XX:+UseCompressedOops -agentlib:yjpagent=probe_disable=*,disablealloc,disabletracing,onlylocal,disableexceptiontelemetry,delay=10000,sessionname=IntelliJIdea14 -Didea.java.redist=NoJavaDistribution -Didea.home.path=/Applications/IntelliJ IDEA 14 EAP.app/Contents -Didea.paths.selector=IntelliJIdea14 5930 sun.tools.jps.Jps -mlvV -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home -Xms8m

我们发现大多数情况下,“-mlv” 参数组合起来***用。它会打印main方法的参数、完整包名、JVM 相关参数。这样你就可以在一大堆相似的进程中找到你想要的那个。

现在有了 dump 得到的文件 heap.bin,就可以用你喜欢的内存分析工具来分析。

5、jstack

jstack 是一个生成指定 JVM 进程的线程堆栈工具。当你程序一直在那里转圈圈,而你想找到线程到底做了什么导致死锁,那么 jstack 最适合。

jstack 只有几个参数选项,如果你拿不准,把它们都加上。如果后面发现有些信息对你意义不大时可以调整参数限制它的输出。

-F 选项可以用来强制 dump,这在进程挂起时非常有用,-I 选项可以打印同步和锁的信息。

$ jstack -F -l 9153 Attaching to process ID 9153, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.0-b70 Deadlock Detection:  No deadlocks found. ….

上面的输出虽然看起来简单,但是它包含了每个线程的状态和它当前的堆栈的信息。

jstack 非常有用,我们在日常工作中使用非常频繁,特别是我们负责启动停止应用服务器的测试引擎。测试工作往往不顺利,jstack 可以让我们知道 JVM 内部的运行状态且没有什么负面的影响。

— Neeme Praks(ZeroTurnaround资深产品工程师)

还有其它的吗?

今天我们介绍了 JDK 发行预装的超棒工具。相信我,将来某天你肯定会用到它们中的一些。所以,如果你有时间,你可以翻一翻它们的官方文档。

试着在不同的场景使用并爱上它们。

如果你想学一些超棒的非 JDK 附带的工具,可以看看 JRebel ,它可以让你马上看到代码的改动效果,还可以看到我们新的产品 XRebel ,它可以像X光眼镜一样扫描你的 web 应用。

如果你知道开发***实践中至关重要的小工具,在本文末尾发表评论或者在 twitter上@shelajev 分享一下这个工具的细节。

Bonus Section: References

奖励环节:参考

下面是一个更加完整的 JDK 工具可用列表。虽然这不是一个完整的列表,为了节省篇幅,我们省掉了加密、web-services 相关的工具等。谢谢 manpagez.com 提供的资源。

  • jar — 一个创建和管理 jar 文件的工具。

  • java — Java 应用启动器。在这篇文章里,开发和部署都是用的这个启动器。

  • javac — Java 编译器。

  • javadoc — API 文档生成器。

  • javah — native 本地方法中用于生成 C 语言头文件和源文件。

  • javap — class 文件反编译器。

  • jcmd — JVM 命令行诊断工具,可发送诊断命令请求到 JVM 中。

  • jconsole — 一个兼容 JMX 的监控 JVM 的图形化工具。可以监控本地和远程 JVM,也可以监控和管理单独的一个应用。

  • jdb — Java 调试器。

  • jps — JVM 进程查看工具,列出了系统运行的所有 hotspot JVM 进程。

  • jstat — JVM 状态监控工具。它可以收集和打印指定的 JVM 进程性能状态。

  • jhat — 堆 dump 信息的浏览器,启动一个 web 服务器来显示你用诸如 jmap -dump 得到的堆 dump 信息。

  • jmap — Java 内存映射工具,打印指定进程、核心文件、远程调试服务器共享内存映射或者堆内存详细信息。

  • jsadebugd — Java 服务调试守护进程—依附到一个 Java 进程或核心文件并且担当一个调试服务器的作用。

  • jstack —Java 堆栈信息工具——打印指定进程或核心文件或者远程调试服务器的线程堆栈。

  • jjs — 运行 Nashorn 命令行脚本 shell。

  • jrunscript — Java 脚本运行工具。不过你要心里有数,这实际上是一个还没支持的测试功能。未来的 JDK 版本里面可能会移除它。

以上是“java中JDK内建工具有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java中JDK内建工具有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java中JDK内建工具有哪些

这篇文章主要为大家展示了“java中JDK内建工具有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中JDK内建工具有哪些”这篇文章吧。0、javap你可以给 javap(Java C
2023-06-17

java中常用的JDK命令行工具有哪些

Java中常用的JDK命令行工具有以下几个:1. java:用于运行Java应用程序的命令行工具。2. javac:用于将Java源代码编译为字节码的命令行工具。3. javadoc:用于根据Java源代码生成文档的命令行工具。4. jar
2023-10-26

Java中的工具类有哪些

这期内容当中小编将会给大家带来有关Java中的工具类有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如下所示:工具类功能BeanUtils提供了对于JavaBean进行各种操作,克隆对象,属性等等Be
2023-05-31

Java工具类有哪些

本篇内容介绍了“ Java工具类有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.org.apache.commons.io.IOUt
2023-06-15

Java中常用的Java工具类有哪些

这篇文章主要介绍Java中常用的Java工具类有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一. org.apache.commons.io.IOUtilscloseQuietly:关闭一个IO流、socket
2023-06-17

Java开发工具有哪些

本篇内容介绍了“Java开发工具有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1、Clover  Clover是一个很赞的工具,它
2023-06-02

Java中有哪些流程监控工具

Java中有哪些流程监控工具,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是Java Profilers?Java Profiler是一种监视JVM级别的Java字节码构
2023-06-16

Java中有哪些常用的工具类

今天就跟大家聊聊有关Java中有哪些常用的工具类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、线程协作、控制并发流程的工具类 什么是控制并发流程?控制并发流程的工具类,作用就是帮
2023-06-15

Java中的时间工具类有哪些

Java中的时间工具类有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体如下:package org.zhy.date;import java.text.DateForm
2023-05-31

Java中有哪些性能分析工具

今天就跟大家聊聊有关Java中有哪些性能分析工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VisualVMVisualVM是一个资源分析工具,一直从JDK 6更新到7。它默认内存
2023-06-17

有哪些新手建站工具

这篇文章主要讲解了“有哪些新手建站工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些新手建站工具”吧!  现在很忙,过两天帮你做吧!”当你从技术部那里碰了一鼻子灰回来,这并不为怪&md
2023-06-10

Java中Lang包的工具类有哪些

今天就跟大家聊聊有关Java中Lang包的工具类有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Lang 中工具类比较多,这里介绍几个主要的:  ClassUtils: get
2023-05-31

Linux内核开发工具具体有哪些

Linux内核开发工具具体有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。进行嵌入式Linux产品开发,往往需要对内核进行裁剪和定制,以满足嵌入式产品的功能
2023-06-16

Java程序员常用的构建工具有哪些

本篇内容主要讲解“Java程序员常用的构建工具有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序员常用的构建工具有哪些”吧!构建工具——调查结果Apache
2023-06-17

java常用工具类有哪些

这篇文章给大家分享的是有关java常用工具类有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java中有用的工具集任何语言都要处理日期,map类型,字符串,数字类型的数据,这里找到一些用java经常处理这些数
2023-06-03

Java有哪些好用的工具

这篇文章主要介绍“Java有哪些好用的工具”,在日常操作中,相信很多人在Java有哪些好用的工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java有哪些好用的工具”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录