• 【JVM译文】JVM问题定位前的准备工作有哪些


    一、序

    最近在学习jvm工具时,不少链接直指oracle官网。才发现有不少好东西。

    本文翻译自:

    https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/prepapp002.html

    二、正文

    这一节描述如何设置环境及JVM选项,以方便收集定位问题时的相关数据。

    1、开启core文件转储

    如果java崩溃,比如因为一个段错误,系统将在磁盘上留下一份线索(core文件,也叫核心转储,是内存的完整dump)。在Linux和Solaris,core文件有时默认是被禁止的。

    要开启对core文件的支持,通常只需要运行命令 ulimit -c unlimited。当然,这需要在程序启动之前。(有些系统可能方式不同)

    注意:core文件占用大量的磁盘空间,尤其是分配的java 堆很大的情况下。

    要决定是否允许core文件,考虑下如果你的系统崩溃了你会做什么。是否会想要一览core文件呢?很多java用户看core文件也没多大用处。然而,如果你想要debug一个发生在gdb中的可能的崩溃,

    那么确保在程序启动前你开启了core文件支持。

    很多时候,崩溃很难复现;因此,在程序启动前开启core支持。

    2、增加 -XX:+HeapDumpOnOutOfMemoryError 到JVM选项中

     -XX:+HeapDumpOnOutOfMemoryError 在程序遇到OutOfMemoryError时,生成一会java的堆转储到磁盘上。使用jhat工具去检查java的堆,找出哪个对象占用了最多的恐惧,然后

    核查那些本来应该已经死亡的却还活下来的对象。

    就像core文件一样,堆转储可能很大,尤其java运行堆很大的情况下。

    再说一次,考虑下如果程序遇到OutOfMemoryError你会怎么处理。难道不希望检查错误发生时的堆文件吗?因此,打开这个参数,因此程序内存溢出时,你能得到堆转储数据。

    3、运行一个持续的Java Flight recording。

    这个不太懂。大家先看原文吧。等我琢磨出来了再补充。

    4、增加-verbosegc 到jvm选项

    -verbosegc 记录关于java垃圾收集器的基础信息。这能帮助你发现以下问题:

    • 垃圾收集是否运行了很长一段时间?
    • 可用内存是不是在随着时间降低

    垃圾收集器帮助分析问题,当程序抛出内存溢出异常时,或者程序遇到性能问题。

    注意:使用日志轮转,好让程序重启后不会删除之前的日志。从jdk7后,UseGClogFileRotation 和NumberOfGCLogFiles 参数可以用来

    设置日志轮转。关于这些的细节,可以查看“jvm的debug选项

    5、打印java版本和jvm参数

    在提交一个bug或者从论坛寻求帮助前,获取基础信息。比如,打印出java版本和jvm选项就很有用。

    如果你的程序是从脚本启动,运行java -version打印java版本,打印命令行参数。另外一个可选方案是

    添加-XX:+PrintCommandLineFlags  和-showversion到JVM的启动参数。

    注:我自己在tomcat试了下,修改了catalina.bat:

     启动,如下(这有个问题,这东西只打印到console了,没法写入日志啊,有知道的同学吗):

     6、开启jmc jmx来进行远程监控

    JMX可以连接到远程的java应用,通过Mission Control或者Visual VM。除非你能在本机(要监控的java程序所在的机器)运行你的这些工具,否则开启jmc jmx对你以后会很有用。

    开启JMX没有什么性能负担。

    具体可以查看 “怎么开启JMX监控

    当一个程序已经启动了的话,再去开启jmx监控的办法是:使用ManagementAgent.start命令。运行jcmd <pid> help ManagementAgent.start 查看该命令的选项。

    jcmd的更多细节,可以查看“jcmd工具”。

  • 相关阅读:
    asp.net mvc 下载文件 txt doc xsl 等等
    MySQL用户管理:添加用户、授权、删除用户、删除用户、修改用户密码
    Vue打包时Unknown plugin "external-helpers" in "xxx\.babelrc" at 0" 解决方案
    vue中Axios的封装
    Docker部署ASP.NET Core应用到Linux中bash脚本
    Linux CentOS7系统中安装Nodejs、cnpm、Git环境
    C#之获取PDF张数以及PDF转JPG
    C#Amr转MP3
    mysql 之C#使用insert批量插入时日期字段为null,插入报错解决方案
    Windows服务器共享文件,Linux服务器实现挂载共享文件
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/9244173.html
Copyright © 2020-2023  润新知