jvm虚拟机(一):jvm内存溢出问题的分析与解决

??学习一下java虚拟机系列,之一

添加运行参数
-XX:+HeapDumpOnOutOfMemoryError -Xms30m -Xmx30m

-XX:+HeapDumpOnOutOfMemoryError 这个参数会生成堆栈快照,用于定位异常

模拟内存溢出的场景,简单代码:

123456789101112131415161718192021222324252627282930313233
package top.alertcode.demo.jvm;

import java.util.ArrayList;

 * @author alertcode * @date 2018-04-03 * @copyright alertcode.top */public class  {

   * 运行这段代码最终会出现内存溢出的异常   * @param args   */  public static void main(String[] args) {    ArrayList<OutOfMemoryDemo> list = new ArrayList<OutOfMemoryDemo>();    while (true) {      list.add(new OutOfMemoryDemo());    }  }//出现下面的错误/*  Connected to the target VM, address: '127.0.0.1:53483', transport: 'socket'  Exception in thread "main" java.lang.OutOfMemoryError: Java heap space  at java.util.Arrays.copyOf(Arrays.java:3210)  at java.util.Arrays.copyOf(Arrays.java:3181)  at java.util.ArrayList.grow(ArrayList.java:265)  at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)  at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)  at java.util.ArrayList.add(ArrayList.java:462)  at top.alertcode.demo.jvm.OutOfMemoryDemo.main(OutOfMemoryDemo.java:15)  Disconnected from the target VM, address: '127.0.0.1:53483', transport: 'socket'*/}

??使用分析工具MAT(Eclipse Memory Analyzer),进行分析,很容易定位到内存溢出的原因,即频繁的创建对象。参照下图:

原文:大专栏  jvm虚拟机(一):jvm内存溢出问题的分析与解决

原文地址:https://www.cnblogs.com/wangziqiang123/p/11618285.html

时间: 2024-11-18 20:43:47

jvm虚拟机(一):jvm内存溢出问题的分析与解决的相关文章

关于JVM内存溢出的原因分析及解决方案探讨

前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1.内存泄漏和内存溢出区别与联系 内存泄漏:系统分配的内存没有被回收. 内存溢出:分配的内存空间超过系统内存. 2.内存泄漏的原因分析   jvm由5大块组成:堆,栈,本地方法栈,程序计数器,方法区.栈它的主要记录方法的执行和对象的引用.堆则存在真正的引用的对象. 内存泄漏是由于使用不当,把一部分内存“

深入JVM虚拟机(二) JVM运行机制

深入JVM虚拟机(二) JVM运行机制 1 JVM运行机制 1.1 JVM启动流程 JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间.JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置. 2.装载JVM.dll. 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例. 4.调用JNIEnv实例装载并处理class类. J

OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存异常

Java堆内存溢出 只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象, 那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下: import java.util.ArrayList; import java.util.List; public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject>

PHP内存溢出Allowed memory size of 解决办法

PHP内存溢出Allowed memory size of 解决办法 博客分类: php ============================Allowed memory size of  xxx bytes 以前追踪过这个问题,但是那个时候工具用的不太好,没看的这么细,这次搞的比较细,修正了偶以前的看法 .于是写小文一篇总结一下. PHP偶尔会爆一下如下 错误Allowed memory size of  xxx bytes exhausted at xxx:xxx (tried to a

JVM系列之六:内存溢出、内存泄漏 和 栈溢出

1. OOM && SOF OutOfMemoryError异常: 除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能, 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存.即被分配的对象可达但已无用. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误.内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况. 从定义上可以看出内存泄露是内存溢出的一

Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

http://www.cnblogs.com/xrq730/p/4839245.html 前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出和内存泄露的区别 1.内存溢出 内存溢出指的是程序在申请内存的时候,没有足够大的空间可以分配了. 2.内存泄露 内存泄露指的是程序在申请内存之后,没有办法释放掉已经申请到内存,它始终占用着内存,即被分配的对象可

Java虚拟机4:内存溢出

http://www.cnblogs.com/xrq730/p/4833713.html 堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了.所以测试的时候把堆的大小固定住并且让堆不可扩展即可.测试代码如下 package com.xrq.test; import java.util.ArrayList; import java.util.List; /** * 测试内容:堆溢出 * * 虚拟机参数:-Xms

内存溢出常见原因分析

内存溢出原因: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据:  一般比如数据查询未做分页处理2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG:                一般引用第三方jar包过多会出现此类问题5.启动参数内存值设定的过小    这种可能性很小服务器参数设置一般会出现这类问题毕竟都是开发 内存溢出的解决方案: 第一步,修改JVM启动参数,直接堆内存.(-Xms,

Andfroid 内存溢出与内存泄漏的简单分析与解决

<一>内存溢出与内存泄露 首先我们要知道内存溢出与内存泄露的概念,什么是内存溢出和内存泄露. 内存溢出:就想杯子里得水满了,就溢出了.内存溢出就是分配的内存被用光了,不够用了. 内存泄露:就如同杯子里面有石子,导致杯子里面的一部分空间没有被利用,在APP中内存泄露就是指该被回收的内存没有被回收,导致一部分内存一直被占着,可利用内存变少了.当泄露过多 时,可利用的内存越来越少,就会引起内存溢出了. <二> 查找内存泄露与内存溢出 (1) 内存溢出,最明显的地方就是报错,APP奔溃并报