精华内容
下载资源
问答
  • COMMAND 10007 bb 20 0 2898m 348m 14m R 100.5 2.2 1:41.31 java 9702 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.00 java 9705 bb 20 0 2898m 348m 14m S 0.0 2.2 0:06.44 java 9706 bb 20 0 2898m 348m 14m S 0.0 ...

    某日,运维同学反馈生产环境有故障,某个JVM进程CPU负载一直居高不下。登入服务器用 top -c 命令查看如下:

    top - 00:37:39 up 48 days, 10:41, 5 users, load average: 3.34, 3.18, 3.10

    Tasks: 166 total, 1 running, 165 sleeping, 0 stopped, 0 zombie

    Cpu0 : 0.7%us, 0.3%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

    Cpu1 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

    Cpu2 : 1.3%us, 0.3%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

    Cpu3 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

    Mem: 16332280k total, 15744336k used, 587944k free, 200632k buffers

    Swap: 8191992k total, 408724k used, 7783268k free, 7201204k cached

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    9702 bb 20 0 2898m 348m 14m S 100.6 2.2 01:47.18 java -server -Xms512M -Xmx512M -Xmn192M -Xss256k -XX:PermSize=64M -XX:MaxPermSize=128M -verbose:

    从输出结果看,CPU load 达到3以上,服务器是4核机器,负载已经不低了。进程ID为9720的进程CPU占用率超过100%。

    定位故障的思路

    首先找出问题进程内CPU占用率高的线程

    再通过线程栈信息找出该线程当时在运行的问题代码段

    定位故障的步骤

    3.1 用top命令查找进程内导致CPU占用率高的线程

    先祭出第一招, top命令加上 -H -b 两个选项:-H 可以查看由某个进程启动的所有线程,-b 选项指定以批处理模式输出结果 。具体命令如下:

    top -Hbp 9702

    top - 00:38:54 up 48 days, 10:43, 5 users, load average: 0.81, 0.36, 0.16

    Tasks: 38 total, 1 running, 37 sleeping, 0 stopped, 0 zombie

    Cpu(s): 3.5%us, 1.4%sy, 0.0%ni, 94.5%id, 0.3%wa, 0.0%hi, 0.2%si, 0.0%st

    Mem: 16332280k total, 15744500k used, 587780k free, 200632k buffers

    Swap: 8191992k total, 408724k used, 7783268k free, 7201392k cached

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    10007 bb 20 0 2898m 348m 14m R 100.5 2.2 1:41.31 java

    9702 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.00 java

    9705 bb 20 0 2898m 348m 14m S 0.0 2.2 0:06.44 java

    9706 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.11 java

    9707 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.11 java

    9708 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.11 java

    9709 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.10 java

    9710 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.00 java

    9711 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.07 java

    9712 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.03 java

    9713 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.03 java

    9714 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.00 java

    9715 bb 20 0 2898m 348m 14m S 0.0 2.2 0:00.00 java

    9716 bb 20 0 2898m 348m 14m S 0.0 2.2 0:05.60 java

    输出结果里的PID其实是线程ID,可以看到线程ID为10007的线程CPU占用率为100.5%,它就是罪魁祸首。上面的命令可以再优化下:查出CPU占用率超过某个值的所有线程,例如超过50%,如下:

    top -Hbp 9702 | awk '/java/ && $9>50'

    3.2 用JVM命令 jstack 精确定位出问题的代码段

    第二招,用jstack 命令dump出线程栈信息,可以直接定位到出问题的代码段。这里也分两步。第一步把上面的线程ID 10007 转化为十六进制:

    $ printf "%x\n" 10007

    2717

    因为jstack输出的线程栈信息中,线程ID是以十六进制展示的。

    展开全文
  • 性能测试-java内存溢出问题排查

    千次阅读 2018-10-31 12:06:05
    关于内存溢出 网上的资料全是坑,都没有一篇写到点上的,我就发现了个问题,要查一个难点,你得至少结合30篇博客的知识点加上自己的悟性才能搞定一个问题。 首先,你windows本机得安装好java,我这里用的是...

    背景:

    最近测试一个智能呼叫系统,就是AI代替人工客服批量给客户打电话作推广活动,在测试的过程中,应用服务器和数据库服务器资源使用都挺正常的,但是长久不重启应用,过个2-3天,执行个几次同时呼叫600个电话拨打任务后,就可能存在:

    org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Java heap space

    上线时间太紧了,被SB总监催着不管质量只管进度的上线。周日被开发喊来看性能问题。周一就要交差了。

    这里我想说的是,这么久以来,我们的开发框架都非常稳定了,一般就是抓抓弱智的慢语句,看看线程在干啥有没有乱搞导致应用负载飙升。关于内存这方面,可以说没有那么大的需求那个高的要求,一直都没啥进步,都是吃老本,包括使用的工具,也是几年都没变的Java VisualVM,变的只有是从jdk1.6升级到了1.8

    关于内存溢出

    网上的资料全是坑,都没有一篇写到点上的,我就发现了个问题,要查一个难点,你得至少结合30篇博客的知识点加上自己的悟性才能搞定一个问题。

    首先,你windows本机得安装好java,我这里用的是java8。java的安装这里不累赘了。不过这里解释几个名词。以免看不懂

    java:开发语言,一种名称

    jdk:java语言的软件开发工具包,全称是:Java Development Kit

    jre:JRE是Java Runtime Environment缩写,指Java运行环境

    jvm:JVM是Java Virtual Machine(Java虚拟机)的缩写

    VisualVM:是JAVA自带的,一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优

    java gc:java垃圾回收,说到这个话就多了。涉及到对jvm堆中无用对象进行回收

    扩展知识:JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来负责这个无用的对象(地球人都知道)。
    JVM堆
        (1) 新域:存储所有新成生的对象
        (2) 旧域:新域中的对象,经过了一定次数的GC循环后,被移入旧域
        (3)永久域:存储类和方法对象,从配置的角度看,这个域是独立的,不包括在JVM堆内。默认为4M。

    GC的工作目的很明确:在堆中,找到已经无用的对象,并把这些对象占用的空间收回使其可以重新利用.大多数垃圾回收的 算法思路都是一致的:把所有对象组成一个集合,或可以理解为树状结构,从树根开始找,只要可以找到的都是活动对象,如果找不到,这个对象就是凋零的昨日黄 花,应该被回收了。

    我们现在存在的问题就是:GC不了垃圾,导致时间久了,内存会溢出,这个即使增大jvm也无济于事,只不过能延缓

    这种问题如果不从代码层面优化,还有个欺骗领导的办法:

    1、应用 每天重启一次,释放垃圾

    2、jvm配置原来的2倍内存

    上面全是废话一般的理论,下面介绍VisualVM的安装与使用

     Java VisualVM安装与使用

    1、打开本机上的F:\Program Files\Java\jdk1.8.0_131\bin\jvisualvm.exe即可

    2、应用服务器-即要监控的java应用部署的机器上

    /usr/java/jdk1.8.0_101/bin

    上传2个文件:链接:https://pan.baidu.com/s/1EZ460Vlz9fesExl10WnN_A  提取码:ibjk

    resin中配置:设置远程连接端口9009

    <jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
    <jvm-arg>-Dcom.sun.management.jmxremote.port=9009</jvm-arg>
    <jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
    <jvm-arg>-Dcom.sun.management.jmxremote.authenticate=false</jvm-arg>

     启动jstatd服务,启动1099默认端口给客户端监控

     nohup ./jstatd.sh &

    查看端口,是否9009和1099都启动成功:netstat -nlp

    3、visualvm连接添加监控及配置

    a、装插件:工具-插件,Visual GC插件地址已经不存在了。所以在线安装是不成功的

    这里介绍手动安装方法

    https://visualvm.github.io/pluginscenters.html 进visualvm的插件中心下载对应版本的插件

    我的java版本是jdk1.8.0_131,对应应该是:https://visualvm.github.io/uc/8u131/updates.html

    进入此页面,下载 要用的插件

    下载后:

    从本地导入插件进入:

    然后勾选安装 ,安装完成即可。

    远程-右键-添加远程机器

     

     如果监控的这台机器上jstatd服务1099端口启动了,然后允许远程监控端口9009也启动了,那么这里就会有结果

    我们看应用进程 pid那一项结果

     

    展开全文
  • 一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好。但是很多时候我们单凭日志无法定位出内存溢出问题,那么...

    一般线上遇到比较头疼的就是OOM内存溢出问题,我们都会先看错误日志,如果错误日志能够定位出哪个类对象导致内存溢出,那么我们只需要针对问题修改bug就好。但是很多时候我们单凭日志无法定位出内存溢出问题,那么我们这时候就需要以下操作来定位问题。

    1、top下对当前服务器内存有个大致了解

    8104abe9c9d66fd525214b5146e92b11.png

    top后 shift+M俺内存占用由大到小排序,RES是此进程实际占用内存,%MEM是占服务器总内存的49.8。

    2、利用ps命令查看服务pid

    [root@speedyao java]# ps -aux|grep java

    3、利用jstat查看虚拟机gc情况

    jstat  -gc:util   [ []

    vmid:虚拟机进程号

    interval:采样时间,默认单位是ms

    count:采样条数

    [root@speedyao java]# jstat -gcutil 17561 1000 10

    以上命令代表1秒钟采样1次,总共采样10次。

    8f8beb62a3086f7be958aaed9a16f777.png

    FULL GC明显大于YOUNG GC次数,并且FULL GC次数很频繁,说明程序有大内存对象,并且一直无法释放。

    4、生成dump文件,有两种方式。 一种是利用jmap直接生成dump文件;另一种是利用gcore先生成core文件,再根据core文件利用jmap生成dump文件。

    (1)先说第一种,这种比较简单,使用这种方案的时候请注意:JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

    [root@speedyao java]# jmap -dump:format=b,file=heap.prof  17561

    format=b:表示生成二进制类型的dump文件

    file=:后面写的是输出的dump文件路径

    17561:jvm进程id

    (2)接下来是第二种。这一种在jmap转换core文件的时候比较耗时,并且生成的dump文件用mat打开的时候分析结果不太正确,不太好定位问题。所以我建议使用第一种,虽然会造成服务挂起吧,但是结果总归是正确的。

    利用gcore保存服务的内存信息,因为gcore比jmap的dump会快很多,也不对线上服务有大的影响

    [root@speedyao java]# gdb -q  --pid=17561

    c4b7ca060626d341a6c9568cbff5e6c7.png

    generate-core-file:生成内存对象,生成的文件存储在当前位置,文件格式pid.core

    detach:断开与进程的连接

    quit:退出

    利用jmap将gcore文件转换为java的dump文件,这一步执行的比较慢,可以用nohup执行,以防止误点Ctrl+C导致退出。

    [root@speedyao java]# jmap -dump:format=b,file=heap.prof /usr/bin/java core.17561

    format=b:表示生成二进制类型的dump文件

    file=:后面写的是输出的dump文件路径

    /usr/bin/java:java命令路径,可以通过命令which java 获取这个路径

    core.17561:表示core文件路径

    6、利用MAT(eclipse开发的可以下载eclipse插件,idea开发的可以下载单独的MAT压缩包)分析dump文件。当然也可以用jdk自带的jvisualvm.exe来分析dump文件

    4a43e9bbbcc090f657720347f567d60b.png

    上图是概要,阴影部分就是大内存对象类,点击选择 “list Object”、“with incoming references”,就出现下图。下图就是这个对象的信息,RunMian 就是map对象所在的类,这样就能快速定位出哪个类中的哪个对象出现了内存异常。

    edf764b90275ef1487e40d404f98e54f.png

    下图Histogram这个tab是堆内存占比从大到小排序。

    707d31777948ccf16073aec451f03ce9.png

    以上就是内存问题排查的大致步骤。

    转载于:https://blog.csdn.net/u010430495/article/details/87283064?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.control

    展开全文
  • java 内存溢出排查

    2021-03-19 09:23:47
    测试代码,如下示例:import .../*** @Description 测试内存溢出, 启动时设置参数,最大堆内存为1m, 内存溢出时dump出内存文件 -Xmx1m -XX:+HeapDumpOutOfMemoryError* @Author luzy* @Date 2018/10/5 11:02*/publi...

    测试代码,如下示例:

    import java.util.ArrayList;

    import java.util.List;

    /**

    * @Description 测试内存溢出, 启动时设置参数,最大堆内存为1m, 内存溢出时dump出内存文件 -Xmx1m -XX:+HeapDumpOutOfMemoryError

    * @Author luzy

    * @Date 2018/10/5 11:02

    */

    public class testOOM {

    public static void main(String[] args) {

    List list=new ArrayList<>();

    while (true){

    list.add("1234567890");

    }

    }

    }

    运行时,设置jvm参数:-Xmx1m -XX:+HeapDumpOutOfMemoryError

    意思是:最大堆内存为1m, 当内存溢出时dump出内存文件。

    执行后会在classpath下产生 内存文件

    4769

    接下来可以使用IBM HeapAnalyzer(下载地址),对内存文件进行分析。

    执行如下命令启动IBM HeapAnalyzer

    4769

    通过界面,打开dump文件

    4769

    可以看到内存中对象所占用的内存比例

    展开全文
  • 面试官:说一下内存溢出排查过程和工具?我... 如何使用MAT进行内存泄露分析 Java线上内存溢出问题排查步骤 1、使用top对当前服务器内存有个大致了解,top后 shift+M俺内存占用由大到小排序 2、利用ps命令查看服务...
  • Java内存溢出排查过程

    2020-04-08 22:52:54
    今天看到了敖丙的一篇关于排查内存溢出的博文,是自己没有接触过的知识,所以仿照过程自己也实验了一遍学习这部分的一些知识! 首先我使用的是Windows电脑,所以查看堆空间的插件在这里! 1、先看自己电脑的堆...
  • Java 内存溢出排查

    2021-03-21 09:31:59
    因此,OOM 的排查及定位是每个 Java 工程师都必备的技能。所遇到的问题在使用 scala 开发的一个 web 服务,在用户使用中,经常出现:java.lang.OutOfMemoryError: Java heap space。而且还束手无策,每次都只能重启...
  • Java内存溢出排查(必看)

    千次阅读 2019-05-17 10:58:44
    因此,OOM的排查及定位是每个Java工程师都必备的技能。 所遇到的问题 在使用scala开发的一个web服务,在用户使用中,经常出现:java.lang.OutOfMemoryError: Java heap space。而且还束手无策,每次都只能重启服务...
  • java内存溢出 原因与排查方法 1、 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,导致剩余的内存不够用,造成的内存溢出。如果出现这种现象可行代码排查: 一)是否应用...
  • 记一次Java线上内存溢出问题排查

    千次阅读 2019-05-07 23:44:45
    1、top下对当前服务器内存有个大致了解 top后 shift+M按照内存占用由大到小排序,RES是...[root@speedyao java]# ps -aux|grep java 3、利用jstat查看虚拟机堆内存情况和gc情况 jstat -gc:util<vmid> [&...
  • java内存溢出问题排查

    2014-10-02 10:33:43
    一、使用工具 Eclipse Memory Analyzer tool, 简称MAT ...二、生成heap dump file (内存溢出时,自动生成) 1、问题代码 package com.mfy.vo; public class User { private int id = 111
  • linux下Java内存溢出排查

    千次阅读 2019-03-07 12:19:27
    1、查询gc情况(每1秒钟打印一次gc情况) ...M:元数据区(java8,相当于java7及之前的永久代的概念)使用大小 ccs:压缩后使用率 YGC:young gc 次数, YGCT:young gc耗时 FGC:full gc次数 FGCT:f...
  • 1、 内存溢出的原因是什么?内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:一)是否应用中的类中和引用变量过多使用了Static修饰 如public staitc ...
  • 文档:【Java内存溢出排查】测试环境服务器挂... 链接:http://note.youdao.com/noteshare?id=783e7ec89950f4167867ef3ef33470b6&sub=48AEFC6FDECB4C60869FAA5FABF57AB0 通过以下命令信息可以确定是内存溢出...
  • 本文以最近碰到的一次线上内存溢出的定位、解决问题的方式展开;希望能对碰到类似问题的同学带来思路和帮助。主要从表现-->排查-->定位-->解决 四个步骤来分析和解决问题。表象最近我们生产上的一个应用...
  • 经过查看日志发现大量的“java.lang.OutOfMemoryError: GC overhead limit exceeded”日志。这个异常的官方解释: Exception in thread thread_name: java.lang.OutOfMemoryError: GC Overhead limit exceeded ...
  • JVM内存溢出问题排查分析

    千次阅读 2019-11-09 10:00:41
    问题背景 分析原因 解决方案 思考 问题背景 前段时间,公司一个老系统从resin4换成了Tomcat8.5,jdk也由1.6升级到了1.8(项目过于老,没敢升级到最新jdk),用nginx做了反向代理,部署完成,启动服务后,一切看...
  • 一、修改一下自己的程序/tomcat配置,将内存调小一点容易调试 -XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m 二、写一个死循环测试 1、 @Test public void memoryTest(){ List<ContractTmpt> ...
  • java的虚拟机异常中,有两个异常是大家比较关心的,一个是StackOverflowError,另一个是OutOfMemoryError。今天我们就来看看OutOfMemoryError是怎么产生的,以及如何去排查这个异常。概念要了解什么是...
  • Java内存溢出和泄漏的排查

    千次阅读 2019-06-19 10:04:53
    一定是有一个项目在跑着,然后突然变慢了,你才会想到排查内存泄露的问题的。作为小白,写写逻辑,我觉得基本上接触不到这个问题。自己写程序报错OOM,那需要很大的代码错误。 我接触到这个问题是上次项目经理面试...
  • 目录首先我们需要掌握什么是内存溢出和内存泄漏内存泄漏:即声明的对象无法被回收,一直存在于内存中,使得占用的内存就像被泄漏消失了一样内存溢出:即剩余可用的内存空间过小,无法分配出下一步工作需要的内存。...
  • 关于Java Tomcat 内存溢出排查

    千次阅读 2018-07-17 11:14:20
    网站不知道什么时候,开始内存飙升,从 Tomcat 启动后,初始内存占用4%~5% ...一、定位造成内存溢出可能存在的问题 io流操作文档没关闭流。 往一个静态集合变量里一直压栈。 连接没释放。 Java队列没消耗。 ...
  • Memory Analyzer(MAT)是一款内存分析工具,可以通过该工具打开.hprof文件进行分析内存溢出的原因。 在开始介绍这款工具使用前,先了解一下如何获取.hprof文件,首先我们需要在tomcat.service文件中加入内存溢出的...
  • 内存溢出排查命令

    2021-03-22 08:05:38
    可以先用top命令查询出占用内存最多的进程,然后使用下面指令分析占用内存较大的代码查看进程的内存镜像信息jmap -572 // 572表示的是进程id显示java堆详细信息jmap -heap -572 // 572表示的是进程id显示堆中对象的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,238
精华内容 5,695
关键字:

java内存溢出问题排查

java 订阅