一、序

最近在学习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工具”。

【JVM译文】JVM问题定位前的准备工作有哪些的更多相关文章

  1. 记一次公司JVM堆溢出抽丝剥茧定位的过程

    背景 公司线上有个tomcat服务,里面合并部署了大概8个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这8个服务是属于边缘服务,并发不高,就算宕机也不会影响核心业务. ...

  2. 深入理解JVM之JVM内存区域与内存分配

    深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...

  3. Spring IOC源码分析之-刷新前的准备工作

    目录 ClassPathXmlApplicationContext的注册方式 加载父子容器 配置路径解析 容器刷新 刷新容器之刷新预处理 ClassPathXmlApplicationContext的 ...

  4. JVM(七):JVM内存结构

    JVM(七):JVM内存结构 在前几节的文章我们多次讲到 Class 对象需要分配入 JVM 内存,并在 JVM 内存中执行 Java 代码,完成对象内存的分配.执行.回收等操作,因此,如今让我们来走 ...

  5. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  6. 详细的App推广前的准备工作

    App开发完成后,推广App自然就成为下一步工作的重点.兵马未动,粮草先行,这里为大家整理了一份App推广前需要准备一些事项,希望能给正在准备开展App推广的小伙伴们一些帮助. 众所周知,App推广的 ...

  7. [转帖]JVM总结--JVM体系结构

    JVM总结--JVM体系结构 https://blog.csdn.net/samjustin1/article/details/52215274 需要不断的学习才可以. 2016年08月15日 22: ...

  8. JVM之JVM的体系结构

    一.JDK的组成 JDK:JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品.JDK中包含JRE(在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin ...

  9. JVM解毒——JVM与Java体系结构

    你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...

随机推荐

  1. Linux中的软链接与硬链接

    软链接相当于windows的快捷方式,当源文件不存在时,软链接失效. 链接是指向文件名,当指向的文件名字删除的时候,就找不到源文件了.硬链接是指向文件本身,删除一个文件名字,还是可以找到源文件的.ls ...

  2. Android图片编码机制深度解析(Bitmap,Skia,libJpeg)

    问题 工作中遇到了Android中有关图片压缩保存的问题,发现这个问题还挺深,而且网上资料比较有限,因此自己深入研究了一下,算是把这个问题自顶至下全部搞懂了,在此记录. 相关的几个问题如下: 1.An ...

  3. php public,static,private,protected,final,const,abstract

    public:权限是最大的,可以内部调用,实例调用等. protected: 受保护类型,用于本类和继承类调用. private: 私有类型,只有在本类中使用. final:PHP 5:不被改,不被继 ...

  4. 大内核锁 BKL

    参考:http://blog.csdn.net/universus/article/details/5623971                                            ...

  5. C# DataTable转实体 通用方法

    public static T GetEntity<T>(DataTable table) where T : new() { T entity = new T(); foreach (D ...

  6. 2014-07-08 hibernate tenancy

    http://en.wikipedia.org/wiki/Multitenancy http://www.infoq.com/news/2012/01/hibernate-4-released htt ...

  7. SQL优化|Java面试题

    转载:https://www.cnblogs.com/Jacck/p/8030455.html 数据库的优化问题 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂 ...

  8. [SLAM] Little about SLAM

    Books from Zhihu: 幽默一把 看完Gonzalez:嗯,好像很好玩的样子,我也来搞一搞.看完Price:什么鬼,怎么这么多公式,公式看不懂肿么破.看完Szeliski:原来用一千页的书 ...

  9. HTTPS原理,以及加密、解密的原理。

    https://blog.csdn.net/Yang_yangyang/article/details/79702583 摘要:本文用图文的形式一步步还原HTTPS的设计过程,进而深入了解原理. A在 ...

  10. 扩展方法(DateTableToList)

    public static IList<T> ToList<T>(this DataTable dt) where T : class,new() { var prlist = ...