JMAP

什么是java OOM?如何分析及解决oom问题?【转载】

风格不统一 提交于 2021-01-09 05:45:27
转载自:https://www.cnblogs.com/ThinkVenus/p/6805495.html 最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要继续学习。 1 )什么是OOM ? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector. 意思就是说,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,因为这个问题已经严重到不足以被应用处理)。 2)为什么会OOM? 为什么会没有内存了呢?原因不外乎有两点: 1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。 2)应用用的太多,并且用完没释放,浪费了

JVM之JDK命令行工具

送分小仙女□ 提交于 2021-01-04 03:37:07
JDK 内置了许多命令行工具,可用来获取JVM 不同层面的信息;例如: 工具 作用 场景 jps 查看当前java进程、传递参数 查看PID: jps -l 、查看给jvm传递的参数: jps -l -v jstack 查看java进程内的线程堆栈信息,可用来检测死锁、死循环飙高CPU等。 参见: https://my.oschina.net/u/3457546/blog/1930546 jmap 查看堆各区域的使用情况以及配置信息。 查看堆配置:jmap -heap PID 、查看堆中存活对象:jmap -histo:live PID jinfo 查看和调整JVM的各项参数配置。 查看所有参数:jinfo PID、查看设置过值的参数: jinfo -flags PID 运行过程中动态开启GC日志等 jstat JVM监控工具,Java进程的类加载、垃圾收集、内存使用等信息。 每1000毫秒输出一次java的垃圾回收信息,总共10次:jstat -gc -h3 PID 1000 10 jcmd JDK1.7之后的JVM诊断工具,是一个多功能工具,可用于获取进程的性能统计、内存使用、垃圾收集、线程堆栈、JVM 运行时间等信息;可以理解为上面的命令集成版。 jps 查看PID以及指定参数 通过jps命令配合相关参数可以查看java进程相关信息 #-l参数用来查看端口号和包名 [root

深入拆解Java虚拟机视频教程

不羁的心 提交于 2021-01-03 14:19:34
目录: 第1节说在前面的话 00:05:07分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 00:20:48分钟 | 第5节jvm再体验-jvm可视化监控工具 00:21:17分钟 | 第7节Java的发展历史00:27:24分钟 | 第9节Java技术体系00:08:46分钟 | 第11节lanmbda表达式简介00:07:02分钟 | 第13节Java虚拟机-ExactVM00:03:35分钟 | 第15节Java虚拟机-kvm00:03:04分钟 | 第17节Java虚拟机-j900:04:23分钟 | 第19节Java虚拟机-MicrosoftJVM00:03:57分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第25节Java内存区域-本地方法栈00:02:39分钟 | 第27节Java内存区域-方法区00:06:32分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第33节垃圾回收-判断对象是否存活算法-引用计数法详解00:14:08分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第37节垃圾回收算法-标记整理算法和分代收集算法00:05:24分钟 |

记一次 CMS 回收异常问题 —— 跨代引用和循环依赖

梦想的初衷 提交于 2021-01-02 15:23:54
模型系统加载深度学习模型后,会触发报警,原因是触发了 Full GC,而 GC 后回收效率却不高,回收前 83%,回收后 65%,老年代加载完成单率模型后,竟然从 150M 飙到了 1.5G 以上,而实际上用 jol 计算出来的模型大小才 300M,这明显是不符合预期的。最后排查发现实际是 跨代引用和循环依赖 导致的问题。 GC 日志 GC日志 整理如下: 服务启动 1 YGC,from survivor 占用 64% - 0.59s 2 YGC,from survivor 占用 24%,有 165823K 进入老年代,被回收的不多,差不多 10M - 0.43s 3 YGC,from survivor 占用 10%,老年代使用了 165823K,结果没变,但是发现 eden 区没有用满就触发 Young GC 了,Eden 区用了 47% - 0.03s 【这个过程是在 Full GC 之前,可以看到触发条件是 System.gc()】 - 初始标记 0.01s STW - 并发标记 0.03s - 并发预清理 0.01s + 5.4s - 最后标记 0.11s STW - 并发清理 0.15s - 并发重启 0.04s 也就是说这次 Full GC 有 0.12s 会 Stop the world,而最后老年代还剩余 165820K,回收了 3K 4 YGC,from

How can I analyze a heap dump in IntelliJ? (memory leak)

扶醉桌前 提交于 2020-12-27 08:00:06
问题 I have generated a heap dump from my java application which has been running for some days with the jmap tool -> this results in a large binary heap dump file. How can I perform memory analysis of this heap dump within IntellIJ IDEA? I know that there are tools for Eclipse and Netbeans but I would rather use IDEA if possible. The basic results of the analysis would tell me the number of instances of each object in memory, per-class, to allow me to be able to start debugging memory leaks. 回答1:

服务器性能指标——负载(Load)分析及问题排查

我们两清 提交于 2020-12-26 16:57:29
平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load、cpu、mem、qps、rt等。每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴随着某些指标的异常。大部分情况下,在问题发生之前,某些指标就会提前有异常显示。 对于这些指标的理解和查看、异常解决等,是程序员们重要的必备技能。本文,主要来介绍一下一个比较重要的指标——机器负载(Load),主要涉及负载的定义、查看负载方式、负载飙高排查思路等。 什么是负载 随着 Internet 的快速发展和业务量的不断提高,基于网络的数据访问流量迅速增长,特别是对数据 中心、大型企业以及门户网站等的访问,其访问流量甚至达到了 10Gb/s 的级别;同时,服务器网 站借助 HTTP、FTP、SMTP 等应用程序,为访问者提供了越来越丰富的内容和信息,服务器逐渐 被数据淹没;另外,大部分网站(尤其电子商务等网站)都需要提供不间断 24 小时服务,任何服 务中断或通信中的关键数据丢失都会造成直接的商业损失。所有这些都对应用服务提出了高性能和 高可靠性的需求,这些海量的访问数据均是负载。 查看机器负载 在Linux机器上,有多个命令都可以查看机器的负载信息。其中包括 uptime 、top、w 等。 uptime 命令 命令能够打印系统总共运行了多长时间和系统的平均负载。uptime命令可以显示的信息显示依次为:现在时间

JVM(java 虚拟机)

生来就可爱ヽ(ⅴ<●) 提交于 2020-12-25 03:27:01
JVM(java 虚拟机) 一.JVM简介 1.JVM:Java Virtual Machine (java 虚拟机) 通过软件来模拟出来的具有完整的硬件系统功能、运行在完全隔离的环境中的完整的计算机系统。 2.种类: 1)Sun Classic 经典款 2)Exact VM 准确式内存管理 3)Sun HotSpot VM 热代码跟踪 二.JVM运行时的区域 1.运行时的区域 2.线程隔离区域(程序计数器、java栈) 程序计数器:是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,所以程序计数器这类内存区域为“线程私有的内 如果线程正在执行的是Native方法,这个计数器的值为空。 3.java 栈 执行代码的内存区域,比如执行方法,变量,引用等。包括:java虚拟机栈、本地方法栈;他们作用相似,区别只是:虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。 栈里存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long

记录一次线上内存溢出,server.tomcat.max-http-header-size导致

僤鯓⒐⒋嵵緔 提交于 2020-12-24 18:36:55
不是谷歌找不到,是搜索的方式不对 文件服务挂了,有点不可思议,线上内存设置的堆大小为16G,应该不会出现这种情况的,查看日志,发现在10:37到10:45文件挂掉这期间,发现一直再报org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space 本能觉得是内存泄漏了,不过没办法,线上并没有打印GC日志。涉及文件上传下载的一共就5个接口,开始查看代码压测,并没有复现。 晚上突然想起来线上另外两台服务器并没有挂掉,也应该存在同样的问题,随即去拿两台服务的内存快照,命令如下 jmap -dump:format=b,file=/root/heap.hprof 14714 有点大,两台的快照将近20G,用MAT进行分析,分析结果如下图: 根据报告发现byte[]和Http11OutputBuffer,看Http11OutputBuffer的名字感觉里面就是byte[],跟踪一下Http11OutputBuffer 发现是headerBuffer的问题应该是响应头缓冲区的问题,看下内容,是响应头 在网上查了下应该是配置的问题,去配置文件里找发现有一个配置有点相似

java常见面试题

人盡茶涼 提交于 2020-12-23 20:13:28
http://www.importnew.com/22637.html http://www.importnew.com/22056.html J2SE基础 1. 九种基本数据类型的大小,以及他们的封装类。 2. Switch能否用string做参数? 3. equals与==的区别。 4. Object有哪些公用方法? 5. Java的四种引用,强弱软虚,用到的场景。 6. Hashcode的作用。 7. ArrayList、LinkedList、Vector的区别。 8. String、StringBuffer与StringBuilder的区别。 9. Map、Set、List、Queue、Stack的特点与用法。 10. HashMap和HashTable的区别。 11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。 12. TreeMap、HashMap、LindedHashMap的区别。 13. Collection包结构,与Collections的区别。 14. try catch finally,try里有return,finally还执行么? 15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。 16. Java面向对象的三个特征与含义。 17.

几款Java开发者必备常用的工具,准点下班不在话下

若如初见. 提交于 2020-12-18 13:49:45
摘要 :一问一答的形式轻松学习掌握java工具。 以一问一答的形式学习java工具 Q:检查内存泄露的工具有? A: jmap生成dump转储文件,jhat可视化查看。 Q:某进程CPU使用率一直占满,用什么工具可以排查? A: top -Hp pid找到最占CPU的线程 然后jstack来查找那个线程此时所处的堆栈,确定问题发生位置。 § 各工具详细介绍 § jstack 全称: JVM Stack Trance 作用: 查看某个java进程的堆栈情况, 可用于确认死锁、IO等待、死循环等问题。 命令用法: jstack pid 查看死锁例子如下图,找到wait的lock和已被锁的lock 查看等待IO例子: § jstat 全称: 作用: 查看进程中内存使用情况,但只能给出一些简单统计数据 统计加载了多少类以及占用空间 jstat -class pid 统计编译了多少文件 jstat -compiler 10 Q: jstat -gcutil {pid} 2000 可以每隔2秒,对pid进程打印内存使用统计信息。 gcutil的输出如下 里面哪个百分比如果长期处于99%-100%会有OMM风险?(OutOfMemoryError) A: 如果E和O即新生代、老年代内存区一直都处于满的状态,则很有可能会引发OMM风险。就像下面这个。 § jmap 全称: JVM Memory