jvm专题
文章平均质量分 92
smart哥
一名有10余年经验的互联网老兵,历经从传统软件公司到大型互联网公司的洗礼,早年在中兴通讯等大型通信公司担任项目leader,后随着互联网的崛起,先后在前美团支付等大型互联网公司担任架构师。对互联网架构底层技术有相当的研究和独特的见解,在多个领域有着丰富的实战经验。
展开
-
OutOfMemoryError系列(8): Kill process or sacrifice child
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!为了理解这个错误,我们先回顾一下操作系统相关的基础知识。原创 2024-07-17 11:31:28 · 763 阅读 · 0 评论 -
OutOfMemoryError系列(7): Requested array size exceeds VM limit
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!Java平台限制了数组的最大长度。各个版本的具体限制可能稍有不同, 但范围都在1 ~ 21亿之间。如果程序抛出错误, 就说明想要创建的数组长度超过限制。原创 2024-07-17 11:28:58 · 1007 阅读 · 0 评论 -
OutOfMemoryError系列(6): Out of swap space?
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!JVM启动参数指定了最大内存限制。如-Xmx以及相关的其他启动参数. 假若JVM使用的内存总量超过可用的物理内存, 操作系统就会用到虚拟内存。错误信息表明, 交换空间(swap space,虚拟内存) 不足,是由于物理内存和交换空间都不足所以导致内存分配失败。原创 2024-07-17 07:46:54 · 755 阅读 · 0 评论 -
OutOfMemoryError系列(5): Unable to create new native thread
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!Java程序本质上是多线程的, 可以同时执行多项任务。类似于在播放视频的时候, 可以拖放窗口中的内容, 却不需要暂停视频播放, 即便是物理机上只有一个CPU。线程(thread)可以看作是干活的工人(workers)。原创 2024-07-17 07:43:11 · 760 阅读 · 0 评论 -
OutOfMemoryError系列(4): Metaspace
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!JVM限制了Java程序的最大内存, 修改/指定启动参数可以改变这种限制。Java将堆内存划分为多个部分, 如下图所示:【Java8及以上】这些内存池的最大值, 由-Xmx和等JVM启动参数指定. 如果没有明确指定, 则根据平台类型(OS版本+JVM版本)和物理内存的大小来确定。原创 2024-07-17 07:40:52 · 835 阅读 · 0 评论 -
OutOfMemoryError系列(3): Permgen space
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!JVM限制了Java程序的最大内存使用量, 可以通过启动参数来配置。而Java的堆内存被划分为多个区域, 如下图所示:这些区域的最大值, 由JVM启动参数-Xmx和指定. 如果没有明确指定, 则根据操作系统平台和物理内存的大小来确定。原创 2024-07-16 15:02:04 · 795 阅读 · 0 评论 -
OutOfMemoryError系列(2): GC overhead limit exceeded
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!Java运行时环境内置了模块. 上一代的很多编程语言中并没有自动内存回收机制, 需要程序员手工编写代码来进行内存分配和释放, 以重复利用堆内存。在Java程序中, 只需要关心内存分配就行。如果某块内存不再使用,模块会自动执行清理。一般来说, JVM内置的垃圾收集算法就能够应对绝大多数的业务场景。原创 2024-07-16 14:55:14 · 1033 阅读 · 0 评论 -
OutOfMemoryError系列(1): Java heap space
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!每个Java程序都只能使用一定量的内存, 这种限制是由JVM的启动参数决定的。而更复杂的情况在于, Java程序的内存分为两部分: 堆内存(Heap space)和 永久代(Permanent Generation, 简称 Permgen):这两个区域的最大内存大小, 由JVM启动参数-Xmx和。原创 2024-07-16 14:46:55 · 710 阅读 · 0 评论 -
GC参考手册 - GC 调优(实战篇)
JVM上运行的程序多种多样, 启动参数也有上百个, 其中有很多会影响到 GC, 所以调优GC性能的方法也有很多种。还是那句话, 没有真正的银弹, 能满足所有的性能调优指标。我们能做的只是介绍一些常见的/和不常见的示例, 让你在碰到类似问题时知道是怎么回事。深入理解GC的工作原理, 熟练应用各种工具, 就可以进行GC调优, 提高程序性能。原创 2024-07-16 07:52:56 · 672 阅读 · 0 评论 -
GC参考手册 - GC 调优(工具篇)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响。有多种监控GC的工具和方法, 本章将逐一介绍常用的工具。JVM 在程序执行的过程中, 提供了GC行为的原生数据。那么, 我们就可以利用这些原生数据来生成各种报告。原生数据(raw data。原创 2024-07-16 07:46:52 · 893 阅读 · 0 评论 -
GC参考手册 - GC 调优(基础篇)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!: 性能,能力,系统容量;文中翻译为"意为硬件配置和并发服务能力。GC调优(Tuning Garbage Collection)和其他性能调优是同样的原理。初学者可能会被 200 多个 GC参数弄得一头雾水, 然后随便调整几个来试试结果,又或者修改几行代码来测试。原创 2024-07-16 07:41:01 · 927 阅读 · 0 评论 -
GC参考手册 - GC 算法(实现篇)
通过本节内容的学习, 你应该对G1垃圾收集器有了一定了解。当然, 为了简洁, 我们省略了很多实现细节, 例如如何处理巨无霸对象(humongous objects)。综合来看, G1是HotSpot中最先进的准产品级(production-ready)垃圾收集器。重要的是, HotSpot 工程师的主要精力都放在不断改进G1上面, 在新的java版本中,将会带来新的功能和优化。可以看到, G1 解决了 CMS 中的各种疑难问题, 包括暂停时间的可预测性, 并终结了堆内存的碎片化。原创 2024-07-15 14:49:32 · 737 阅读 · 0 评论 -
GC参考手册 - GC 算法(基础篇)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!Mark,标记;Sweep,清除;Compact,整理;也有人翻译为压缩,译者认为GC时不存在压缩这回事。Copy,复制;copy 用作名词时一般翻译为拷贝/副本,用作动词时翻译为复制。第一步, 记录(census)所有的存活对象, 在垃圾收集中有一个叫做的过程专门干这件事。原创 2024-07-15 14:41:43 · 1029 阅读 · 0 评论 -
GC参考手册 - Java中的垃圾收集
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!(Mark and Sweep)是最经典的垃圾收集算法。将理论用于生产实践时, 会有很多需要优化调整的地点, 以适应具体环境。下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保证JVM能安全持续地分配对象。原创 2024-07-15 14:34:29 · 670 阅读 · 0 评论 -
GC参考手册 - 垃圾收集简介
顾名思义,垃圾收集(Garbage Collection)的意思就是 —— 找到垃圾并进行清理。但现有的垃圾收集实现却恰恰相反:垃圾收集器跟踪所有正在使用的对象,并把其余部分当做垃圾。记住这一点以后, 我们再深入讲解内存自动回收的原理,探究 JVM 中垃圾收集的具体实现,。我们不抠细节, 先从基础开始, 介绍垃圾收集的一般特征、核心概念以及实现算法。免责声明: 本文主要讲解 Oracle Hotspot 和 OpenJDK 的行为。原创 2024-07-15 14:31:25 · 664 阅读 · 0 评论 -
JVM 工具-jinfo:jvm配置信息工具
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-07-14 16:54:45 · 708 阅读 · 0 评论 -
JVM 工具-jstat:虚拟机统计信息监控工具
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-07-14 16:52:46 · 947 阅读 · 0 评论 -
JVM 工具-jps:虚拟机进程状态工具
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-07-14 16:50:55 · 481 阅读 · 0 评论 -
Jvm 系列(八):Jvm 知识点总览
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。原创 2024-07-14 10:37:25 · 1064 阅读 · 0 评论 -
Jvm 系列(七):Jvm 调优-工具篇
VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据。原创 2024-07-14 10:33:46 · 881 阅读 · 0 评论 -
Jvm 系列(六):Java 服务 GC 参数调优案例
jvm调优就是根据gc日志分析jvm内存分配、回收的情况来调整各区域内存比例或者gc回收的策略;本文主要是通过分析eclipse gc日志为例来示例如何根据gc日志来分析jvm内存而进行调优,像根据关闭eclipse启动项、关闭各种校验等措施来优化eclipse本文不再阐述,网上有很多,本次测试的eclipse已经进行了配置上面的优化。启动时间缩小到15秒,但是 young gc已经缩短到只有7次,说明因为gc回收导致eclipse 启动慢的问题已经初步解决。摘录GC日志一部分(蓝色为年轻代gc回收;原创 2024-07-13 08:34:17 · 1068 阅读 · 0 评论 -
Jvm 系列(五):Java GC 分析
Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清理机制。原创 2024-07-13 08:30:49 · 838 阅读 · 0 评论 -
Jvm 系列(四):Jvm 调优-命令篇
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!原创 2024-07-13 08:26:49 · 608 阅读 · 0 评论 -
Jvm 系列(三):GC 算法 垃圾收集器
垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。原创 2024-07-12 18:32:53 · 985 阅读 · 0 评论 -
Jvm 系列(二):Jvm 内存结构
局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。原创 2024-07-12 18:30:40 · 1049 阅读 · 0 评论 -
Jvm 系列(一):Java 类的加载机制
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载。原创 2024-07-12 18:27:47 · 985 阅读 · 0 评论 -
JVM实战(34)——内存溢出之消息队列处理不当
本章,我们将介绍一个因为处理消息队列中的数据不当而引起的内存溢出问题,先来看下系统的背景。本章,我们分析了一个因为内存队列处理不当引起的内存泄漏问题,本质是程序逻辑没写好,这也是本系列的最后一章。通过本系列的各个实战案例,相信读者也积累了不少JVM优化的经验,最重要的还是要归纳总结、举一反三,在实践中去印证自己所学的知识,然后再总结完善,最终融会贯通。原创 2024-01-25 09:37:16 · 671 阅读 · 0 评论 -
JVM实战(33)——内存溢出之内存使用率过高
本章,我们将讲解一个已经稳定运行的系统的内存溢出问题,该内存溢出问题的元凶是类加载器,我们先来看下系统的背景。本章介绍的案例和之前有点区别,程序其实并没有发生OOM异常,但又确实是因为内存占用过多而被OS杀死。这个案例告诉大家,无论如何优化分析,它们背后的原理都是一套东西,掌握分析问题的思路才是最重要的。原创 2024-01-25 09:35:35 · 1482 阅读 · 0 评论 -
JVM实战(32)——内存溢出之堆外内存
本章,我们将讲解一个使用Jetty作为Web容器的应用的内存溢出问题,该内存溢出问题发生的区域是堆外内存,主要原因是JVM内存区域划分不合理,我们先来看下系统的背景。本章中,我们的案例之所以发生堆外内存溢出,其实是很多因素综合的结果。包括JVM内存划分不合理、处理请求速度较慢、屏蔽了System.gc()。所以,生产环境一旦发生OOM异常,除去一些程序bug等很明显的原因,往往是比较难排查的,可能是很多因素综合在一起导致了内存异常,我们要做的就是抓住主要矛盾,先按照最基本的优化思路去分析。原创 2024-01-25 09:33:52 · 1444 阅读 · 0 评论 -
JVM实战(31)——内存溢出之请求超时
本章,我们将通过实际案例讲解一个Web应用的内存溢出问题,该内存溢出问题的排查涉及Tomcat的一些底层原理,最终排查发现是由于请求超时问题导致,我们先来看下系统的背景。本章,我们通过一个实际案例分析了因为请求超时引起的内存溢出问题,以及相应的排查思路。解决这类问题的思路其实都是一致的,需要一步步去分析,在实践中积累经验,举一反三。原创 2024-01-24 16:47:41 · 1205 阅读 · 0 评论 -
JVM实战(30)——模拟堆内存溢出
本章,我们将通过示例代码演示Java堆内存区域是如何发生内存溢出的,并根据内存快照进行分析。我们回顾下堆内存溢出的一个场景:系统负载很高,不停的在Eden区创建新对象,直到触发Young GC,但是由于并发太高,Young GC发现Eden区存活对象非常多,Survivor无法容纳,只能把大批存活对象转移到老年代。经过几次这种Young GC之后,老年代也满了,于是触发Full GC,但是Full GC之后老年代里还是塞满了对象,导致Young GC过后的存活对象无处可安放,最终引发堆内存溢出。原创 2024-01-24 16:45:06 · 1372 阅读 · 0 评论 -
JVM实战(29)——模拟栈内存溢出
本章,我们将通过示例代码演示Java虚拟机栈区域是如何发生内存溢出的,并根据内存快照进行分析。我们回顾下栈内存溢出的一个场景:每个线程的栈内存是固定的,如果某个线程不停的无限制调用方法,每次方法调用都会有一个栈帧入栈,此时就会导致线程的栈内存被耗尽。本章,我们通过代码示例模拟了栈内存溢出的场景,大家可以看到1MB的栈内存大约可以支撑5000次的递归调用,这个数量已经很高了,一般的方法根本不可能出现连续几千次的调用。所以,栈内存溢出在生产环境是很少出现的,即使有,一般都是程序bug导致的。原创 2024-01-24 16:43:06 · 631 阅读 · 0 评论 -
JVM实战(28)——模拟Metaspace内存溢出
本章,我们将通过示例代码演示Metaspace区域是如何发生内存溢出的,并根据内存快照进行分析。我们回顾下Metaspace区发生内存溢出的一个场景:程序不停的动态生成类,然后不停的加载类到Metaspace区域,而且这些动态生成的类必须得是不能被回收的,一旦Metaspace区满了,就会触发Full GC,而由于Metaspace区中的对象无法被回收,此时就触发了Metaspace内存溢出。本章,我们通过一个程序示例,不断利用CGLIB生成动态代理类的方式,模拟了Metaspace区内存溢出的场景。原创 2024-01-18 08:22:41 · 1734 阅读 · 0 评论 -
JVM实战(27)——内存溢出概述
从本章开始,我们将介绍JVM中的内存溢出异常——Out of Memory。我们运行Java程序时,本质是创建了一个JVM进程,然后在里面执行Java字节码。既然是进程,就一定有内存限制,当Java程序使用的内存空间超过限制时,就可能发生内存溢出异常。在JVM中,一共有三种可能出现OOM的地方:方法区(元数据区)、Java栈内存、Java堆内存。本章,我们就来一一看一下各个区域内存溢出的情况。本章我们介绍了JVM中可能出现内存溢出的几个区域,以及引发OOM的基本原因。原创 2024-01-18 08:20:42 · 1243 阅读 · 0 评论 -
JVM实战(26)——SystemGC
针对本章案例中的问题,我们平时自己写代码时,不要自己去调用方法随便触发GC,一方面可以通过在JVM参数中加入显示禁止代码中的GC操作,另一方面也要加强对开发人员的JVM相关知识的培训。原创 2024-01-18 08:19:44 · 662 阅读 · 0 评论 -
JVM实战(25)——元数据区优化
本章,我们通过示例分析了元数据区被占满导致的频繁Full GC问题,通过参数可以配置软引用对象的平均存活时间,从而避免了元数据区频繁被占满。原创 2024-01-18 08:18:34 · 1233 阅读 · 0 评论 -
JVM实战(24)——大对象优化
本章,我们通过示例分析了大对象导致的频繁Full GC问题,并一步一步展现了发现问题、分析问题、解决问题的思路。当我们发现Young GC过后并不是每次都有很多存活对象进入老年代的时候,就要从别的角度考虑下到底为什么会有那么多存活对象进入老年代。原创 2024-01-17 10:39:40 · 2149 阅读 · 1 评论 -
JVM实战(23)——内存碎片优化
本章,我们通过示例分析了频繁Full GC导致的内存碎片问题,通过参数可以配置内存碎片整理的次数,从而提升系统的运行效率。原创 2024-01-17 10:37:44 · 1693 阅读 · 0 评论 -
JVM实战(22)——jamp和MAT实战
我们通过jstat进行分析,发现Full GC非常频繁,基本上每隔两分钟就会执行一次,而且每次Full GC的时间长达10秒。本章通过一个内存泄漏的案例,讲解了分析此类问题的思路和解决方法。jmap和MAT经常组合在一起使用,用于线上问题此类的排查。原创 2024-01-17 10:35:31 · 1430 阅读 · 0 评论 -
JVM实战(21)——jstat实战(2)
上一章,我们通过jstat命令分析了BI系统中新生代对象的GC情况,也就是Young GC。本章,我们再来通过jstat命令分析下Full GC的情况。本章,我们通过一个示例引出频繁Full GC的问题,并通过jstat命令观察JVM运行情况,然后对JVM进行调优,最后再通过jstat观察优化后的JVM运行情况,将系统的运行效率提升了,避免了频繁Full GC。通过本章和前一章的两个示例,相信读者已经掌握了jstat的核心用法。原创 2024-01-16 08:35:03 · 2011 阅读 · 0 评论