jvm内存溢出问题,为什么jvm没及时回收。

面试官问了2个问题。

1:内存溢出如何造成的

2:内存溢出前,为什么jvm没去回收。

10个回答

正在使用中的变量太多了,程序执行自动回收,发现你变量都在使用 无法回收

下面死循环为例,程序一直在生成新变量a,一直占用内存,内存满后自动释放时,你list还在方法内,没有结束,不能释放,就会内存溢出

 List<Integer> list = new ArrayList<Integer>();
while(true){
    int a = 1;
    list.add(a);
}

可以这样回答,那你要看哪种情况的溢出,在JVM的内存模型里,Java栈,Java堆,方法区都定义了OutOfMemoryError的异常,
1、先说Java栈的溢出情况
首先Java栈的结构是线程私有的一排一排的栈桢,每个线程在执行方法时,都会对应一个栈桢的入栈操作,而在Java编程语言规范中,并没有指定
在Java栈进行内存回收的要求,因此也就是说,执行线程越多,或某个线程执行过程中递归调用的层级太多,都会造成可能的栈溢出。这个溢出是
由于进行内存回收导致的
2、Java堆的内存溢出
Java堆定义了内存回收,但也是分情况的,虚拟机会把对象的引用程度分为四种:强引用、弱引用、软引用、虚引用。只要有类似于Object obj =
new Object(); 这样的引用存在,obj对象就永远不会被回收。这是强引用,而弱引用,则是在Java堆空间不足时的优先回收对象,而弱引用只能逃
过一次内存回收,下一次内存回收时一定会回收掉弱引用的对象,而虚引用最弱,这种引用的存在仅仅是为了虚拟机回收对象,这是一种一定会被
回收的对象。因此,Java堆的内存溢出,完全可以归结于程序中出现大量的强引用对象,无法回收。可以通过扩大Java堆的空间来进行优化。
3、方法区的溢出
方法区的溢出要看里面存了什么东西,在java8以前,方法区不只要存储静态变量、字面量,还要存储编译器生成的代码和Class对象,而随着
热部署的出现,程序运行过程中动态加载的类,不会释放旧的类加载器所加载的类,部署次数过多时就会导致方法区的内存不足,同时,如果
程序中出现大量的字符串字面量、静态变量,也会把撑爆方法区,但这种情况比较少,这种情况下的回收一般也可以通过Jvm的选项来调整方法
区的内存大小来进行优化。同时程序也要优化。减少静态变量和字符串字面量的数量。

不好意思,上面四种引用程序的顺序说反了,正确的是下面的:

虚拟机会把对象的引用程度分为四种:强引用、软引用、弱引用、虚引用。

后面一句也描述反了:
而软引用,则是在Java堆空间不足时的优先回收对象,而弱引用只能逃过一次内存回收,下一次内存回收时一定会回收掉弱引用的对象,

JVM并非不想回收而是没办法回收,比方说有100张图片都在被java程序引用,内存马上满了,回收哪一个合适,假设选择一个回收了,应用莫名其妙地出了问题,去哪里找原因呢

JVM回收内存只有条件的,根遍历遍历不到的对象才会被回收,如你所说,如果有一些对象一直持有强引用,那么就算JVM内存溢出也不会被回收。

溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生了溢出

无用的对象,仍然有强引用支撑,所以无法回收,导致内存溢出

系统如果认为文件还有用的话就不会回收

内存溢出:操作系统分配给每个进程的内存是有限的,虚拟机提供参数来设置java堆和方法区这两部分内存的最大值,可以创建线程的数量 = 剩余内存 / 线程的容量所有,若每个线程分配的栈容量(-Xss)越大,可以创建的线程数量就越小,那么,不断的创建线程,把剩余内存逐渐耗尽,当剩余内存不足时,就会抛出内存溢出。
jvm回收:垃圾回收是判断一个对象有没有任何引用与之关联,如果有,就不能被回收,在内存溢出时,jvm肯定要去回收。

什么时候会进行垃圾回收

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
jvm内存溢出
页面加了一个file框rn只要选择了文件··程序不管处不处理··JVM的内存都会升··而且又不会自动降下来·多上传几次后会报溢出了rnFile用了MultipartFilernspring3的rn大神们救救·谢谢诶·
JVM内存溢出
Permanent Generation Space (永久保存区域)通常报错java.lang.OutOfMemoryError: PermGen space 主要存.class文件,刚被load就会放进来。 Heap Space (堆区域) 主要用来存放class实例,每次new创建对象实例,就会放在这里。(被jvm垃圾回收机制管理) Java Stacks (java栈) 基本类型
was jvm 内存溢出
环境:rnWAS40,Domino5,AIX4。33rn应用中有访问Notes创建的Sessionrn发现应用服务器的JAVA进程的内存从启动的70多Mrn随着应用被访问逐渐增加到150M多rn有时候报java.out. memoryrn内存溢出?rn是不是垃圾回收失效
jvm 内存溢出-直接内存溢出
jvm 内存溢出-直接内存溢出 DirectMemory 容量可通过 -XX:MaxDirectMemorySize 指定,如果不指定,则默认与 Java 堆最大值( -Xmx 指定)一样,下面程序利用 DirectByteBuffe 模拟直接内存溢出的情况 import java.nio.ByteBuffer; import java.util.ArrayList; import java.ut...
JVM内存溢出解决方案之及时释对象引用
当需要程序处理大批量数据时,经常会遇到内存不足,程序运行一段时间后,就会抛出内存溢出异常。 问题之一:可能就是程序在运行时产生了大量的对象,而jvm没能及时释放这些对象占用的内存空间, 这时需要分析程序,看看是否存在循环创建List、Set、Map这类集合,如果存在,就需要在对它使用完后, 手动将其赋值为null,这样jvm就能在第一时间将其所引用的资源回收。 场景:批量处
谈论JVM内存溢出问题
1、问题描述       这两天公司项目的项目进行测试,服务器会偶尔出现访问不通,EJB远程调用全部失效的情况,经过对JVM监控,发现是JVM内存FullGC造成系统停顿造成的。目前基础系统jboss启动jvm内存设置为3G,之前出现过out of memory heap 的错误。现在正常开发情况下,基础系统平均一两天就会因为内存爆满,出现系统停顿,不得不重启jboss来解决。       一
jvm 内存溢出的问题
请问一下,你们有没有遇到过这样的问题rnrnJava HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminatedrnrn怎么解决
JVM内存溢出问题解析
程序运行要用到的内存大于虚拟机能提供的最大内存就发生内存溢出了, 内存溢出的问题要看业务和系统大小而定,对于某些系统可能内存溢出不常见,但某些系统还是很常见的解决的方法
关于jvm内存溢出的问题。
我现在用jb2006生成的exe文件,当读文件过大时,就会出现内存溢出。rn现在想寻求一个可以在执行exe文件前,先设置jvm的内存大小,或是将jvm的默认值就设置成512M,比如想系统环境变量什么的。rn我现在有一个解放方法是java -Xmx512m -jar xxxx.jar可以用,但是这样的话,就不通过exe文件执行了。rn想问一下有没有什么办法让他通过exe文件运行的。因为不能把jar文件给别人,这样不安全。rn请达人帮忙解决一下。rnrnrnrn[color=#339966]--------------------------------------------------------------------rn以下内容为自动编辑的内容,并非楼主的发贴内容,此仅用于显示而已,并无任何其他特殊作用rn楼主【axu20】截止到2008-08-05 11:11:00的历史汇总数据(不包括此帖):rn发帖的总数量:10 发帖的总分数:290 每贴平均分数:29 rn回帖的总数量:54 得分贴总数量:25 回帖的得分率:46% rn结贴的总数量:10 结贴的总分数:290 rn无满意结贴数:1 无满意结贴分:30 rn未结的帖子数:0 未结的总分数:0 rn结贴的百分比:100.00% 结分的百分比:100.00% rn无满意结贴率:10.00 % 无满意结分率:10.34 % rn敬礼![img=http://p.blog.csdn.net/images/p_blog_csdn_net/java2000_net/381633/o_medal1.gif][/img][/color]rn取消马甲机器人,请点这里:[url=http://www.java2000.net/mycsdn/robotStop.jsp?usern=axu20][/url]
JVM碎片回收堆
JVM碎片回收堆   Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。   在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收...
JVM内存分配与回收策略
JVM内存分配与回收策略1对象优先在Eden分配//-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGCDetails //-XX:+UseSerialGC public static void testAllocation(){ byte[] allocat
JVM内存分配与回收
JVM内存分配 Java虚拟机在运行时将所管理的内存区域分为以下五个部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。其中,程序计数器、Java虚拟机栈与本地方法栈这三个区域为线程私有,随线程产生和消亡,不需要过多的考虑内存的回收问题,Java堆是Java垃圾收集器管理的最主要区域,故也被称为“GC堆” 程序计数器:一块较小的内存区域,是当前所执行的字节码的行
JVM回收算法
1. Reference Counting 循环引用 2. Mark and Sweep 第一遍,标记所有活跃的对象;第二遍清除未标记的对象 产生碎片 3. Copying 两个相等的内存空间,回收时,将一个里的活跃对象复制到另一个中。回收之前,总有一个为空。 占用空间较大,需两份相等空间。 4. Mark and Compact 第一遍标记所有活跃的对象,第二遍整理。 不...
JVM 方法区回收小结
JVM 方法区回收小结方法区也会发生垃圾回收,只是效率和性价比较低。回收主要分为两部分内容:废弃常量和无用的类。废弃常量的回收这与堆中对象的回收类似。以常量池的字符串为例,如果没有任何对象引用了此字符串,那么它就有可能被系统清理出常量池。废弃类的回收此类回收条件较为苛刻,需要满足如下的3点: 该类所有实例已被回收,即Java堆中不存在该类的任何实例 加载该类的ClassLoader已经被回收 该类对
JVM堆内存回收流程图
JVM堆内存回收流程图
JVM(三)JVM内存分配与回收策略
新生代和老年代 现代商用JVM大都采用分代收集算法,将java堆分成新生代、老年代和永久代。如下图所示 新生代回收策略 主要是用来存放新生的对象。一般占据堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。 新生代又分为 Eden区、ServivorFrom、ServivorTo三个区。 Eden区:Java新对象的出生地(如果新创建的对象占用内存...
jvm GC回收算法
如何判断对象已死 引用算法 对对象中添加一个引用计数器,每当有一个地方引用它,引用计数器加1。任何时候对象的引用计数器为0,则表示对象不会再被使用,可以回收该部分内存 弊端:若存在两个对象,A,B。A引用了B,B引用了A。导致的结果是AB的引用计数器永远不为0,永远无法回收 根搜索算法(jvm使用的算法) 通过名为“GC Roots”的对象作为起始点,想下搜索。搜索路径称
jvm内存溢出会导致jvm停止工作吗
一直以来以为当java应用程序的内存溢出后,整个jvm就会停止工作,最近做了个小实验发现并不是这样。 java弱引用 一段示例代码如下: /** * 弱引用 * -Xms5m -Xmx10m 时抛出 * Exception in thread "Thread-0" java.lang.OutOfMemoryError: GC overhead limit exceeded * */...
JVM回收方法区
很多人习惯称方法区为永久代(hotspot以永久代来实现方法区) java虚拟机规范中提到:可以不要求虚拟机在方法区实现垃圾收集。而且在方法区的垃圾回收“性价比”一般比较低。在堆中,尤其是在年轻的,一次垃圾回收一般可以回收70-95%的空间 永久代的垃圾回收分为两部分内容:废弃常量、无用的类      回收常量与java堆的对象回收非常相似。“没有地方引用”类回收需要满足
JVM方法区回收方法
1、方法区         JVM中的方法区,按分代算法属于持久代,所以一般也被称为持久代。 2、回收对象     方法区主要保存类信息(构造器)、常量、静态变量等,可回收对象为:废弃常量,无用的类。 回收废弃常量与JAVA对象一致,无用即删;        以常量池中字面量的回收为例, 例如一个字符串“abc”已经进入常量池,但是无任何String对象引用常量池的此常量,也无其它引...
JVM之方法区的回收
很多人都认为在方法区(或者HotSpot虚拟机中的永久代)中是没有垃圾回收的,Java虚拟机规范中确实说过可以不要求虚拟机在方法去实现垃圾回收,而且在方法区中垃圾回收的 “性价比” 一般是比较低的,因为方法区中的东西一般是不需要回收的,所以扫描一遍回收的很少。 永久代的垃圾收集主要分为两部分内容:废弃常量和无用的类,回收废弃常量与回收Java堆中的对象特别类似,即当方法去中的常量没有被任何Str...
JVM深入浅出(二)--了解JVM内存溢出
JVM内存溢出大概分为以下几种情况: 1.内存中加载的数据量过大。  比如一次性从数据库加载过多的数据。 2.并发数量太高。  并发数量太高,导致在短时间内创建大量的对象,GC也不及回收。 public class HeapOOM { public class NewObjectTest { static class ObjectTest { } public static vo
jvm 内存溢出模拟
模拟内存溢出: 在上万行代码,该怎么样去定位内存溢出的地方; 第一步写一个死循环,一直持续的占用内存最后导致溢出; List list=new ArrayList&amp;lt;&amp;gt;(); while(true) { list.add(new Arrays()); } 第二步配置虚拟机的参数,右键 run configurations —Arguments—VM arguments —设置参数 -X...
内存溢出及Jvm监控工具
内存泄露与内存溢出 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory! 内存溢出分类 ...
JVM性能测试与内存溢出
Java内存管理机制Java采用了自动管理内存的方式Java程序是运行在Jvm之中的Java的跨平台的基于Jvm的跨平台特性内存的分配和对象的创建是在Jvm中用户可以通过一系列参数来配置JvmJvm内存结构栈内存线程私有生命周期和线程相同主要存放内容– 基本数据类型(int,char,float,double…)– 对象的引用,指向了对象在堆内存中起始地址– 通过-Xss参数配置堆内存-heap堆...
JVM内存溢出的几种情形
java虚拟机规范定义了两种异常与栈空间有关:StackOverflowError和OutOfMemoryError 线程计算过程中 栈深度>最大可用栈深度 抛出StackOverflowError 如果栈可以动态扩展,如果扩展过程中没有足够内存空间支持会抛出OutOfMemoryError -Xss设置栈大小,栈大小决定了函数调用的可达深度 public class Test
jvm内存溢出解决办法
java.lang.OutOfMemoryError: PermGen space  分析原因:java.lang.OutOfMemoryError: PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放
Tomcat的JVM内存溢出解决方法
Tomcat的JVM内存溢出解决方法 在生产环境中,tomcat内存设置不好很容易出现JVM内存溢,解决方法就是修改Tomcat中的catalina.sh文件。 在catalina.sh文件中,找到cygwin=false,在这一行的前面加入参数,具体如下 # vi TOMCAT_HOME/bin/catalina.sh JAVA_OPTS="-server -Xms800m -X
记一次,jvm 内存溢出
1、什么是内存泄漏内存泄漏是指,有未被释放的java对象,一直停留在内存中。GCRoot 无法追踪到此对象,导致此对象无法被回收。 2、什么是内存溢出内存溢出是指,java程序创建对象需要内存,但是却没有内存可用了,内存就溢出了。溢出:从字面理解,桶不够装,水溢出了 3、当时的环境:打包成jar后,直接 运行 java -jar xx.j...
jvm 内存溢出 jmap
1.使用jvm来配置来自动保存 java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./OutOfMerrorError.log -jar xxx.jar 2.手动导出 jmap -dump:format=b,file=文件名 pid 3.查看堆内存使用情况 jmap -heap pid 3.mat分析 下载地址 http:/...
JVM内存溢出监控自动化
1:手动生成Java heap dump首先需要搞懂什么是java heap,java heap是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。Java heap dump相当于java应用在运行的时候在某个时间点上打了个快照(snapshot)。启动一个JAVA项目,环境变量配置了JDK环境 jps命令是jdk用来查看java进程的命令,252是当前正在运行的j
JVM内存溢出分析
我们在使用java开发程序的过程中,一定会碰到到内存溢出异常(java.lang.OutOfMemoryError)。下面我来看一下出现内存溢出的原因和解决办法。 1.启动参数内存值设定的过小。 调整JVM启动参数,-Xmx JVM使用的最大内存,运行过程中超过这个内存就会报内存溢出异常,-Xms JVM初始内存,启动的时候就占用的内存。如果机器内存够就加机器内存。 2.代码问题 我们重点...
JVM——内存溢出和内存泄漏的区别
今日本帅博主在研究JVM,今天我们就来游走于内存溢出与内存泄漏之间,且看看它们是个啥,且又有啥子区别。 1.内存溢出和内存泄漏是啥 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释...
JVM探秘3:内存溢出
在 Java 虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。 在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。 Java堆溢出 Java 堆用于存储对象实例,只要不断的扩...
JVM内存溢出基本思路
jvm内存问题 jvm
模拟JVM内存溢出
一、Java堆溢出 1、配置参数:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 上面的参数限定了堆的大小为20M不可扩展,XX:+HeapDumpOnOutOfMemoryError用来生成dump快照文件,当内存溢出时,可以用来分析。JDK版本为JDK1.7,开发工具为myEclipse,参数通过myeclipse的run configrat
jvm常见内存溢出异常
上面这幅图就是jvm虚拟机运行时的主要数据区,蓝色部分是线程共享区域,而白色部分就是线程私有区域。 以下例子均在jdk1.7中运行 1.堆内存溢出 /** * VM Args: -Xms2m -Xmx2m * Created by Stay on 2017/5/15 14:50. */ public class Base1 { public static void
JVM常见内存溢出问题归纳
OutOfMemoryError发生有三种比较常见的情况: 堆溢出,简单说就是创建了太多的实例对象,导致内存溢出 OutOfMemoryError 栈溢出, 栈的深度不够或者多线程导致栈内存不足,导致内存溢出 StackOverFlowError OutOFMemoryError 方法区溢出, 方法区用于存放Class的相关信息,可能出现情况,java 反射创建了太多的类,导致内存溢出
JVM虚拟机内存溢出
本节内容参考书籍:深入理解Java虚拟机 另外,我们讲解的虚拟机为java的 HotSpot JVM,其他虚拟机不讲解。 一、堆内存溢出      1、设置eclipse中的相关参数。            -Xms:堆的最小值            -Xmx:堆的最大值      (这两个值设置一样,可避免对自动扩展)           2、相关代码
JVM内存溢出处理方案
java.lang.OutOfMemoryError相信很多开发人员都用到过,这个主要就是JVM参数没有配好引起的,但是这种错误又分两种: java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space, 其中前者是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置,而后者是...
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview