内存溢出问题的分析与解决【JVM初体验】

JVM:内存监视手段及各区域内存溢出解决 引言本文仅关注一些常见的虚拟机内存监视手段,以及JVM运行时数据区各个部分内存溢出的发生和对应的解决方案,总体来说属于概括性总结,涉及相对不是很深入,目的是让自己和其它初学者有一个框架性、概念性的了解,当遇到问题时有迹可循、不至于不知所措。一、虚拟机内存监视手段虚拟机常出现的问题包括:内存泄露、内存溢出、频繁GC导致性能下降等,导致这些问题的原因可以通过下面虚拟机内存监视手段来进行分析,具体实施时 阅读详情

这是关于Java虚拟机的第一篇总结,开篇首先介绍一下 jdk , jre , jvm的关系吧。


jdk   jre   jvm  之间的关系

  jdk  java开发工具包 (包含jre) 
  jre  java运行环境 (包含 JavaSeAPI  +  jvm) 

  jvm java虚拟机   (在jdk中通过javac编译生成的字节码文件  加载到jre中运行  也就是加载到道jvm中运行)


官方文档给的结构图:


接下来 首先写一个测试程序:

package cn.zj.jvm;

import java.util.ArrayList;
import java.util.List;

public class firstjvm {

	public static void main(String[] args) {	
		List<Demo> demoList=new ArrayList<Demo>();
		while(true)
		{
		     demoList.add(new Demo());	
		}	
	}
}


通过分析发现,最终会报错:




  我们可见 ,该错误是由于堆内存溢出造成的。


  试想一下,当我们有成千上万行代码,报错时,

  我们怎么定位错误呢?


很显然,我们无法直接定位,这时候需要借用工具帮助。


Step1 : 我们首先需要建立一个堆内存快照.


通过jvm参数:

-XX:+HeapDumpOnOutOfMemoryError (建立堆快照)

-Xms20m -Xmx20m(限制内存为25m)


输入参数:




运行之后:



项目文档中生成的快照:




Step2:下载分析工具(Memroy Analyzer  MAT)




Step3:通过分析工具得出结果


打开快照:



参数说明:

Shallow Heap   表示当前对象本身所占用的内存大小,不包含引用对象

Retained Heap 表示当前对象本身所占用的内存大小以及当前直接或间接所引用的对象总和(如果要进行垃圾回收,可释放的内存)




最终得出结论是Demo对象所占百分比过高,导致内存溢出。


关于jvm入门的第一个例子到此结束了!

Java中JVM内存溢出问题的解决方法 在深入探讨内存溢出问题之前,了解JVM的内存区域划分是很有必要的。堆内存(Heap):用于存储对象实例,是垃圾回收(GC)的主要管理区域。堆内存又分为年轻代(Young Generation)和老年代(Old Generation)。方法区(Method Area):用于存储类的元数据、常量、静态变量等信息。在Java 8之前,方法区也被称为永久代(PermGen);在Java 8及之后,永久代被元空间(Metaspace)取代。栈内存(Stack) 阅读详情

相关推荐

WebSocket高并发客户端连接内存溢出问题分析与解决指南

通过合理设计连接管理策略(心跳检测、自动清理)、优化数据存储结构(对象复用、压缩传输)、采用异步非阻塞IO模型,结合监控告警体系,可有效预防WebSocket高并发场景下的内存溢出问题。建议在项目早期即进行容量规划与压力测试,避免线上环境出现严重故障。延伸阅读《Netty in Action》第11章 WebSocket优化Spring官方文档:WebSocket Scaling Strategies。

m0_67771208的博客 2148

【JVM原理】内存溢出分析

一内存溢出概述 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时数据区域 都有发生内存溢出异常(OutOfMemoryError,简称OOM)的可能。 内存溢出就是在申请内存的时候,没有足够的内存,这个时候就会抛出内存溢出异常。 内存溢出和内存泄漏的区别: 内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。 ...

yhl_jxy的博客 6959

Java领域JVM的内存溢出问题排查

本文的目的是帮助Java开发者全面了解JVM内存溢出问题的排查方法。范围涵盖了JVM内存管理的基本概念、常见的内存溢出类型、排查问题的具体步骤和工具,以及实际案例分析。通过本文的学习,开发者能够在遇到JVM内存溢出问题时,迅速定位问题根源并采取有效的解决措施。本文将按照以下结构进行组织:首先介绍JVM内存管理的核心概念与联系,包括JVM内存模型的架构和各部分的作用;接着阐述排查内存溢出问题的核心算法原理和具体操作步骤,并使用Python代码进行详细说明;然后介绍相关的数学模型和公式,通过举例加深理解;

Java大师兄的博客 915

JVM各种情况内存溢出分析

目录 1 直接内存溢出 2 内存溢出 2.1 堆溢出 2.2.1 堆溢出案例 2.3 永久代或元空间溢出 2.3.1 永久代或元空间溢出案例 2.4 栈溢出 2.4.1 栈溢出案例 2.5 非常规溢出 1 直接内存溢出 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是 JVM 规范中定义的内存区域。但这部分内存也被频繁的使用,而且也可能导致 OutOfMemoryError 异常出现。...

赵广陆 6511

jvm 初体验 内存溢出的分析

公司倒闭了,又要重新找工作,先调整下花点时间补补以前不懂的技术点:其实做Android我们没必要去学jvm,但是个人感觉很有必要去学习下,不管是面试还是对自己的技术提升都是有很大的帮助 先写一段代码来模拟出内存溢出 package com.kd.jvm; import java.util.ArrayList; import java.util.List; public class J...

zhouguizhi 402

jvm内存溢出问题的分析与解决

下面我们看下面这个程序有没有问题 其实这段代码比较简单,我们可以看到不停的往demolist里面添加对象,我们知道,每创建一次对象,就会往堆内存里面开辟一块区域,就会不停的占用内存。 会看到内存一直在不停的增加 出现问题后,发现内存突然降落下来 当达到一定的上限时,会突然看到内存降下来,就是出问题了,我们来看问题。这就是传说中的,堆内存溢出异常,这种时Java堆内存不够。 ...

没有伞的孩子只能快跑,如若不跑,只有一个结果:超过你的人回头鄙视你 875

JVM内存溢出原理及案例分析

前言 再程序中,什么是内存溢出呢?什么情况下会出现内存溢出呢? 内存溢出原理 一般来说,程序中出现内存溢出是非常严重的,一但出现内存溢出,会导致程序无法正常运行。一般再程序中,内存溢出分为两种:一种是 堆内存溢出。,一种是永久代溢出。 堆内存溢出: 堆内存中存在大量的对象,这些对象都被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出 OutOfMemory:java heap space 其实当内存满的时候,程序会触发GC,但是GC之后发现内存都被占用无法进行回收,导致无法腾出空间,内存空

weixin_43865008的博客 1969

深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,jre,jvm的关系 [免费观看] 00:20:48分钟 | 第4节jvm初体验-内存溢出问题的分析与解决 [免费观看] 00:17:59分钟 | 第5节jvm再体验-jvm可视化监控工具 [免费观看] 00:21:17分钟 | 第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | 第8节Java的发展历史续00:02:27分钟 | 第9节Java技术体系00:08:46分钟 | 第10节jdk8的新特性00:07:31分钟 | 第11节lanmbda表达式简介00:07:02分钟 | 第12节Java虚拟机-classic vm00:06:06分钟 | 第13节Java虚拟机-ExactVM00:03:35分钟 | 第14节Java虚拟机-HotSpotVM00:04:23分钟 | 第15节Java虚拟机-kvm00:03:04分钟 | 第16节Java虚拟机-JRockit00:04:12分钟 | 第17节Java虚拟机-j900:04:23分钟 | 第18节Java虚拟机-dalvik00:02:20分钟 | 第19节Java虚拟机-MicrosoftJVM00:03:57分钟 | 第20节Java虚拟机-高性能Java虚拟机00:02:58分钟 | 第21节Java虚拟机-TaobaoVM00:03:06分钟 | 第22节Java内存区域-简介00:07:56分钟 | 第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序计数器00:12:54分钟 | 第25节Java内存区域-本地方法栈00:02:39分钟 | 第26节Java内存区域-堆内存00:05:08分钟 | 第27节Java内存区域-方法区00:06:32分钟 | 第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾回收-概述00:06:20分钟 | 第33节垃圾回收-判断对象是否存活算法-引用计数法详解00:14:08分钟 | 第34节垃圾回收-判断对象是否存活算法-可达性分析法详解00:07:09分钟 | 第35节垃圾回收算法-标记清除算法00:04:36分钟 | 第36节垃圾回收算法-复制算法00:14:35分钟 | 第37节垃圾回收算法-标记整理算法和分代收集算法00:05:24分钟 | 第38节垃圾收集器-serial收集器详解00:09:45分钟 | 第39节垃圾收集器-parnew收集器详解00:04:53分钟 | 第40节垃圾收集器-parallel收集器详解00:11:02分钟 | 第41节垃圾收集器-cms收集器详解00:14:58分钟 | 第42节最牛的垃圾收集器-g1收集器详解00:18:04分钟 | 第43节内存分配-概述00:04:23分钟 | 第44节内存分配-Eden区域00:22:51分钟 | 第45节内存分配-大对象直接进老年代00:06:42分钟 | 第46节内存分配-长期存活的对象进入老年代00:03:40分钟 | 第47节内存分配-空间分配担保00:04:54分钟 | 第48节内存分配-逃逸分析与栈上分配00:10:32分钟 | 第49节虚拟机工具介绍00:10:27分钟 | 第50节虚拟机工具-jps详解00:11:20分钟 | 第51节虚拟机工具-jstat详解00:09:20分钟 | 第52节虚拟机工具-jinfo详解00:05:03分钟 | 第53节虚拟机工具-jmap详解00:08:48分钟 | 第54节虚拟机工具-jhat详解00:08:10分钟 | 第55节虚拟机工具-jstack详解00:10:19分钟 | 第56节可视化虚拟机工具-Jconsole内存监控00:07:09分钟 | 第57节可视化虚拟机工具-Jconsole线程监控00:12:18分钟 | 第58节死锁原理以及可视化虚拟机工具-Jconsole线程死锁监控00:10:38分钟 | 第59节VisualVM使用详解00:08:03分钟 | 第60节性能调优概述00:11:22分钟 | 第61节性能调优-案例100:23:28分钟 | 第62节性能调优-案例200:10:05分钟 | 第63节性能调优-案例300:12:41分钟 | 第64节前半部分内容整体回顾00:15:41分钟 | 第65节Class文件简介和发展历史 [免费观看] 00:11:26分钟 | 第66节Class文件结构概述 [免费观看] 00:16:50分钟 | 第67节Class文件设计理念以及意义 [免费观看] 00:13:41分钟 | 第68节文件结构-魔数 [免费观看] 00:09:49分钟 | 第69节文件结构-常量池 [免费观看] 00:23:44分钟 | 第70节文件结构-访问标志 [免费观看] 00:11:36分钟 | 第71节文件结构-类索引00:11:26分钟 | 第72节文件结构-字段表集合00:13:21分钟 | 第73节文件结构-方法表集合00:10:06分钟 | 第74节文件结构-属性表集合00:18:23分钟 | 第75节字节码指令简介00:09:18分钟 | 第76节字节码与数据类型00:09:34分钟 | 第77节加载指令00:09:33分钟 | 第78节运算指令00:10:24分钟 | 第79节类型转换指令00:13:42分钟 | 第80节对象创建与访问指令00:09:38分钟 | 第81节操作树栈指令00:03:27分钟 | 第82节控制转移指令00:11:58分钟 | 第83节方法调用和返回指令00:06:37分钟 | 第84节异常处理指令00:09:44分钟 | 第85节同步指令00:07:34分钟 | 第86节类加载机制概述00:07:26分钟 | 第87节类加载时机00:13:15分钟 | 第88节类加载的过程-加载00:15:15分钟 | 第89节类加载的过程-验证00:10:24分钟 | 第90节类加载的过程-准备00:05:40分钟 | 第91节类加载的过程-解析00:14:04分钟 | 第92节类加载的过程-初始化00:19:41分钟 | 第93节类加载器00:22:41分钟 | 第94节双亲委派模型00:17:03分钟 | 第95节运行时栈帧结构00:08:46分钟 | 第96节局部变量表00:20:48分钟 | 第97节操作数栈00:08:36分钟 | 第98节动态连接00:02:56分钟 | 第99节方法返回地址和附加信息00:03:24分钟 | 第100节方法调用-解析调用00:09:49分钟 | 第101节方法调用-静态分派调用00:16:21分钟 | 第102节方法调用-动态分派调用00:09:02分钟 | 第103节动态类型语言支持00:09:27分钟 | 第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟

JVM系列(二):深入讲解JVM内存溢出分析!

JVM 内存溢出 1、堆内存溢出 堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾收集回收机制清除这些对象,当这些对象所占空间超过最大堆容量时,就会产生 OutOfMemoryError 的异常。堆内存异常示例如下: /** 设置最大堆最小堆:-Xms20m -Xmx20m 运行时,不断在堆中创建OOMObject类的实例对象,且...

weixin_33739523的博客 250

从零构建无线AM信号模拟系统:基于STM32与AD9959的国赛一等奖方案解析

本文详细解析了基于STM32F103RCT6与AD9959芯片构建无线AM信号模拟系统的国赛一等奖方案。文章从项目背景、核心芯片选型出发,深入剖析了系统架构、硬件电路设计及软件控制逻辑,重点分享了“直流偏置叠加法”实现AM调制、多径模拟以及高频电路调试的实战经验与避坑指南,为参加全国大学生电子设计大赛的选手提供了一套完整、可靠的复现路径。

weixin_29182481的博客 181

virtualbox虚拟机里面最顶部没有控制、设置和帮助等选项

无意中操作,导致virtualbox虚拟机里面最顶部没有控制,设置和帮助选项  virtualbox虚拟机窗口显示如下如: 如何设置,窗口显示如下图所示呢: virtualbox虚拟机窗口模式显示设置,切换可以通过如下图所示操作进行切换: PS:一定要是右边的Ctrl+C

WEL测试 8780

jvm内存溢出分析

包括: 1.    栈溢出(StackOverflowError) 2.    堆溢出(OutOfMemoryError:java heap space) 3.    永久代溢出(OutOfMemoryError: PermGen space) 4.    OutOfMemoryError:unable to create native thread Java虚拟机规范规定JVM的内存分

zhengchao1991的博客 929

MIL-STD-1553B协议解析与工程实践指南

MIL-STD-1553B作为军用航空电子系统的核心通信协议,采用命令/响应式串行总线架构,通过双冗余设计实现高可靠性数据传输。该协议定义了三类终端设备(总线控制器、远程终端、总线监视器)和六种标准消息格式,典型应用包括飞行控制系统、导航设备等关键航电组件的实时数据交互。深入解析模式代码机制和状态字位域定义,其中传输向量字(10000)和同步命令(00001)等关键指令在分布式系统时间对齐、故障诊断等场景发挥重要作用。工程实践中需特别注意78Ω终端阻抗匹配、4-12μs响应时间窗口等硬性指标,结合变压器耦合

weixin_33431149的博客 434

4.jvm初体验-内存溢出问题的分析与解决

新建两类Main类和Demo类 运行就会出错 java.lang.OutOfMemoryError:Java heap space 3. 解决:打开Run Configuration 存快照 用eclipse Memory Analyzer打开 点击Open Dominator Tree for entire heap ...

i_m_jack的博客 245

ubuntu18.04 升级Ubuntu 20.04

Ubuntu 18.04升级20.04指南:首先备份重要数据,更新当前系统并检查新版本可用性(sudo do-release-upgrade -c)。确认升级后执行sudo do-release-upgrade,按提示完成操作。升级过程需耐心等待,完成后重启系统。注意:升级前务必备份数据,确保系统为最新版本,以降低风险。升级后即可使用Ubuntu 20.04系统。

https://ophome.blog.youkuaiyun.com,在IT行业有多年的工作经验,尤其是在Python、Linux、负载均衡、Nginx和服务器运维等领域。 1058

人工智能之语言领域 自然语言处理 第六章 情感分析

情感分析(Sentiment Analysis),又称意见挖掘(Opinion Mining),旨在自动识别和提取文本中表达的主观情感、态度或情绪。从用户评论到社交媒体,从产品反馈到政治舆情,情感分析已成为企业决策、品牌监控和人机交互的关键技术。本章将深入介绍情感分析的层级结构、核心技术、主流模型,并通过社交媒体舆情实战案例完整演示分析与可视化流程。层级目标示例词级(Word-level)判断单个词的情感倾向“好” → 正面;“差” → 负面句级(Sentence-level)判断整个句子的情感极性。

咚咚王者的博客 856

【JVM学习笔记】(一)、初体验-内存溢出问题分析及解决方案

1. 开始 创建Main类和Demo类,在Main类的main方法中创建List,并向List中无限创建Demo对象,造成内存溢出, 并输出内存溢出错误文件在项目目录下,为了使等待时间减小,设置运行堆内存大小。 2. 创建Demo类 package com.cheng.test1; /** * @ClassName: Demo * @Description: TODO * ...

皮卡战记 550

Keil5与ARM编译器V5安装指南:从下载到配置全流程解析

本文提供Keil5与ARM Compiler V5的完整安装与配置指南。针对新版Keil5默认不包含V5编译器导致老工程编译失败的问题,详细解析了从软件下载、授权管理到获取并正确安装ARM Compiler V5(AC5)的全流程,确保开发者能顺利搭建兼容老项目的稳定开发环境。

weixin_29158047的博客 874

JVM内存溢出问题分析与解决(java)

根据JVM规范,JVM 内存共分为五个部分:虚拟机栈、堆、方法区、程序计数器、本地方法栈 内存溢出主要涉及到三个内存区域: Permanent Generation space(永久保存区域) Heap space(堆区域) Java Stacks(Java栈) 容易发生内存溢出问题的内存空间包括:Perman...

itmengzhaojie的博客 2015

如何实现在Go语言中替换程序自身

总结起来,我们可以通过将新的程序二进制文件写入磁盘,并在运行时启动这个新的程序来实现在Go语言中替换程序自身。在Go语言中,有时候我们需要在程序运行时替换程序自身,例如更新程序版本或者进行热重启。本文将介绍一种正确的方式来实现在Go语言中替换程序自身的方法,并提供相应的源代码示例。此外,替换程序自身可能会导致正在运行的程序产生意外行为或终止,请谨慎使用,并确保在合适的时机进行替换操作。实现替换程序自身的关键是将新的程序二进制文件写入到磁盘,并在运行时启动这个新的程序。函数启动新的可执行文件,并在后台运行。

HoUnix的博客 288

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2070

JVM内存溢出问题排查

当然,分析和解决内存溢出相关问题的步骤,不是固定的,还需要根据实际情况去做调整,止损是第一位的,正常情况我们需要快速重启的先,重启可以使服务快速恢复,但是只重启,指标不治本,如果没有定位到溢出的原因,重启一段时间可能又会溢出。内存溢出 out of memory : 通俗理解就是内存不够用了,是我们工作当中经常会遇到的问题,内存溢出有可能发生在正常的情况下,而非代码层面问题导致,比如高并发下,大量的请求占用内存,垃圾回收机制无法进行回收,而导致的内存溢出,这种情况就需要我们去调整架构了。...

Tester_muller的博客 6416

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【实战总结】JVM内存溢出问题排查

这里先说一下结论,堆内存总共3.1G,Suspect1问题指向一个慢SQL,间接导致1.7G内存无法回收,Suspect2 由com.mysql.jdbc.ByteArrayRow导致1.2G内存无法回收,原始sql指向与Suspect1同样的慢SQL,这样就基本可以确定是这一条慢SQL导致的内存溢出。打开MAT,File--->open dump file--->选择本次输出的dump文件,可以看到如下总览页面,点击Leak Suspects查看内存泄露分析。一周前系统有一次投产,之后再没有更新过系统。

雪落夜的专栏 9745

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JVM内存溢出:原因分析与解决方案

内存泄漏是指程序中已分配的内存无法被垃圾回收器回收,导致内存占用逐渐增加,最终可能导致系统崩溃。静态内存泄漏:静态对象在程序运行期间一直存在,无法被垃圾回收器回收。静态内部类内存泄漏:静态内部类持有外部类的引用,导致外部类无法被垃圾回收。静态集合类内存泄漏:静态集合类中的对象无法被垃圾回收器回收。线程内存泄漏:线程在执行过程中未正确释放资源,导致内存泄漏。

我是Java程序员廖志伟,感谢朋友们的支持! 1163

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

内存溢出问题排查及 jvm调参

Eclipse设置JVM虚拟内存的三种方式 1. 修改Elipse运行JRE默认JVM参数(全局所有项目) 打开Eclipse,选择Window–Preferences–Java–Installed JREs,编辑选择的jre 在其中的Default VM Arguments: 框中输入 -Xms128m -Xmx512m 等,这样设置 Java 拟虚机内存使用最小是 128M,最大是512M,再单击“OK” 2. 修改Java运行时参数(单个项目) 右击工程 Run AS(Debug As) -->

lc95270的博客 2744
上一篇: @Autowired用法详解
下一篇: Java虚拟机内存管理
ITgo
博客等级 码龄9年 14粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值