java内存回收gc的问题

问题描述

看代码while(...){ List list =new arraylist list.add();}请问进入下一次循环的时候 上一次循环产生的list能够被gc回收吗 问题补充:kidding87 写道

解决方案

上面的说的不对,回收不回收,jvm说了算,并不是立刻就回收jvm启动参数上加上gc的日志-XX:+PrintGCDetailspublic class TestGcpublic static void main(String[] args) {int i=1000;while(i-->0){List l = new ArrayList<Integer>();for(int j=0;j++<1000;l.add(Integer.valueOf(i)));System.out.println("loop "+i+" finish");}}结果可以看出来,并不是立即释放,而是由jvm自己去决定什么时候去释放除非手动调用System.gc();最好不要手动去释放
解决方案二:
其实kidding87说的很对,就是kidding87给你的那段程序,其实你可以把那行“System.out.pringln”去掉,再用java -XX:+PrintGCDetails TestGc 去运行就会发现会有几次GC被执行。这是由一个专门负责GC的后台线程实现的,即使你显式调用了System.gc();也不能够完完全全保证GC会立即执行(要看JVM的运行情况),GC是由JVM来控制的。每次循环,上次创建的List对象就失去了引用,等垃圾回收的时候会把这些没有引用的对象回收掉。更细一点来说,当Eden区被占满的时候,就会触发一次minorGC。楼主看了下面的程序就应该更了解了:public class Test1 {static int i=1000;public static void main(String[] args) {while(i-->0){List<Integer> l = new ArrayList<Integer>() {@Override /*该方法会在发生GC第一次扫描根集合对象的时候被调用,所以就是象征性地表示一下大概i的值是多少的时候会发生GC*/protected void finalize() throws Throwable {if(i > 0)System.out.println("i: " + i);}};for(int j=0;j++<1000;l.add(Integer.valueOf(i)));}}}编译之后使用java -XX:+PrintGCDetails -XX:+PrintHeapAtGC Test1来运行我截一段小图给你,看看就明白了。
解决方案三:
恩,他没有引用了,jvm就会可能会回收它java -XX:+PrintGCDetails YourClass你执行下就看出来了
解决方案四:
每次执行到这个循环的时候在堆中开辟内存,其引用被置于栈中提供高速访问。当局部变量一但脱离作用域,内存立即释放。希望对你有帮助。

时间: 2024-10-28 21:56:04

java内存回收gc的问题的相关文章

图文详解java内存回收机制_java

在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存.因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用有限的内存的程序.  1.Java在内存中的状态  首先我们先写一个代码为例子: Person.java package tes

java内存回收机制

引言  Java的堆是一个运行时数据区,类的实例(对象)从中分配空间.Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new.newarray.anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放.一般来说,堆的是由垃圾回收 来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆.垃圾回收是一种动态存储管理技术,它自动地释放不再

java 内存回收-java手动回收内存问题

问题描述 java手动回收内存问题 一个javaweb项目上线需要导入2W条数据,我先将数据转为list集合,再循环集合插入到数据库中,每次循环后我将对象设置为null,且在方法体结尾手动清空了集合,可使用jconsole.exe监控项目,内存涨了300M,且观察N久都没下降, 清空对象代码方式如下: listProducts.clear(); listProducts = null; mapList.clear(); mapList=null; attributes.clear(); attr

细述 Java垃圾回收机制→How Java Garbage Collection Works?

这是垃圾回收机制系列文章的第二篇.希望您已经读过了第一部分Java垃圾回收简介. Java垃圾回收是一个自动运行的管理程序运行时使用的内存的进程.通过GC的自动执行JVM将程序员从申请和释放内存的繁重操作中解放出来. Java垃圾回收GC初始化 作为一个自动执行的进程,程序员不需要在代码中主动初始化GC.Java提供了System.gc()和Runtime.gc()这两个hook来请求JVM调用GC进程. 尽管要求系统机制给程序员提供调用GC的机会,但是实际上这是由JVM负责决定的.JVM可以选

详细介绍Java内存泄露原因_java

一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在J

java垃圾回收有多少种啊

问题描述 java垃圾回收有多少种啊 java垃圾回收gc 还有什么啊亲们 finally什么的是吗? 解决方案 http://www.importnew.com/13827.html 解决方案二: http://blog.jobbole.com/80499/ 解决方案三: java垃圾回收JAVA垃圾回收Java垃圾回收 解决方案四: Java就是自动垃圾回收哇~具体可以谷歌.

java内存管理和回收机制

java类文件是以 .java为后缀的文件,经过javac命令编译后,编译成class文件,class文件中都是二进制格式的数据,所以想要看编译后的内容是什么,可以采用jdk自带的javap命令查看. JVM中有个组成部分为类加载器(ClassLoader),负责java文件编译后class文件的加载,加载到哪呢,加载到内存.那下面来说一下JVM的内存管理. java通过类加载器来加载class文件,加载到内存后,会把类.方法.常变量放到堆内存中.因为java是自动进行垃圾回收的,所以放入堆内存

局部变量-关于java内存垃圾回收的一点疑问

问题描述 关于java内存垃圾回收的一点疑问 class test{ void m(){ Object obj[]=new Object[1]; Object o = new Object(); obj[0]=o; o = null;//用不着 } } 很常见的一个例子,说最后Object对象都没有被释放,因为obj[0]还引用这个对象. 我的疑问是,既然局部变量在方法运行完,引用会被销毁,也就是说o不用被置为null,也会堆内存的Object对象也会被回收(符合回收的条件,不一定立即GC),那

Java的内存回收机制

原文地址:http://www.cnblogs.com/xiaoxuetu/archive/2013/03/29/2987805.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存.因此就有了Java程序员到最后应该去了解JVM,才能写出更高