匿名内部类相关的gc

公司某位同时分享android内存泄漏的时候,谈到了垃圾回收,我突然想到某天在微信公共账号看到的某篇文章说到匿名内部类的垃圾回收(死活找不到了。。。),所以写了个demo测试了下;

package checks;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

public class MyTest {
	public  static List<HashMap<String,Object>> l2 = new ArrayList<>();
	private java.util.List<Object> l = new ArrayList<>();
	{
		//增加MyTest对象的内存
		for (int i = 0; i < 1000; i++) {
			l.add(""+UUID.randomUUID());

		}
	}
	/**
	 * 匿名对象模式
	 */
	public void test(){
		l2.add(new HashMap<String,Object>(){
			{put("11111111111", "11111111111111");
			put("11111111111", "11111111111111");
			put("11111111111", "11111111111111");
			put("11111111111", "11111111111111");
			put("11111111111", "11111111111111");}
		});
	}
	/**
	 * 普通模式
	 */
	public void test2(){
		HashMap<String, Object> d = new HashMap<String,Object>();
		d.put("11111111111", "11111111111111");
		d.put("11111111111", "11111111111111");
		d.put("11111111111", "11111111111111");
		d.put("11111111111", "11111111111111");
		d.put("11111111111", "11111111111111");
		l2.add(d);
	}
	public static void main(String[] args) throws InterruptedException {
		Thread.sleep(10000);
		System.out.println("start");
		for (int i = 0; i < 10000; i++) {
			new MyTest().test2();
			//new MyTest().test();
		}
		System.out.println("end");
		Thread.sleep(200000);
	}

}

test执行的结果:

test2执行结果:

从结果推测,匿名内部类会关联对象,内部类对象不回收,导致主对象无法回收;

时间: 2024-12-20 05:19:29

匿名内部类相关的gc的相关文章

Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需要一个或者多个块时,Oracle会首先检查自己的Cache是否存在该块,如果发现没有,就会先通过global cache赋予这些块共享访问的权限,然后再访问.假如,通过global cache发现这些块已经在另一个实例的Cache里面,那么这些块就会通过Cache Fusion,在节点之间直接传递,

golang 垃圾回收 gc

http://ruizeng.net/golang-gc-internals/ 摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对研究的结果进行一下总结. 什么是垃圾回收? 曾几何时,内存管理是程序员开发应用的一大难题.传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放.稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发者的噩梦.如何解决这个头疼的

6. GC 调优(工具篇) - GC參考手冊

进行GC性能调优时, 须要明白了解, 当前的GC行为对系统和用户有多大的影响. 有多种监控GC的工具和方法, 本章将逐一介绍经常使用的工具. 您应该已经阅读了前面的章节: 垃圾收集简单介绍 - GC參考手冊 Java中的垃圾收集 - GC參考手冊 GC 算法(基础篇) - GC參考手冊 GC 算法(实现篇) - GC參考手冊 GC 调优(基础篇) - GC參考手冊 JVM 在程序执行的过程中, 提供了GC行为的原生数据. 那么, 我们就能够利用这些原生数据来生成各种报告.原生数据(raw dat

java疯狂讲义笔记整理(第二版第一部分)

第一章    java语言概述 1.1    java语言的发展简史 1990末:    sun公司“Green计划”(James Gosling领导)        ----目的是智能家电编写一个通用嵌入式控制系统,为此创建oak 1992夏天:    "Green计划"完成新平台的部分功能 1992年11月:    "Green计划"被转为"FirstPerson有限公司"-一个sun的全资子公司,致力于创建一个高度互动的设备 1994夏天:

Understanding .net CLR garbage collection--(踏踏实实学好.Net系列)

引言 内存管理是计算机科学中一个相当复杂而有趣的领域.在计算机诞生的这几十年间,内存的管理的技术不断进步,使系统能够更加有效地利用内存这一计算机必不可少的资源. 一般而言,内存管理可以分为三类:硬件管理(如TLB),操作系统管理(如Buddy System,Paging,Segmentation),应用程序管理(如C++,Java,.net的内存管理机制).鉴于篇幅和笔者水平的限制,本文只涉及了内存管理的很小一部分,即.net中的内存管理方法..net是一个当代的应用程序框架,采用了内存自动管理

JDK命令行工具

jps命令 列出所有Java进程,输出如下: jps -q  只输出进程id jps -m 输出传递给Java进程(主函数)的参数 jps -m -l -l用于输出主函数的完整路劲 jps -m -l -v -v显示传递给JVM的参数 2.jstat命令 可以观察Java应用程序运行时信息的工具,可以查看堆信息的详细情况 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

初识Luajit

转自:http://www.cppblog.com/pwq1989/archive/2013/11/28/204487.html 大家可以从官网下载到源码(http://luajit.org/),也可以从Github(https://github.com/LuaDist/luajit)down下来,顺便还可以看下commit记录. 大家对着luajit的wiki结合源码看的话会更好些,因为..文档太特么少了!! 目录结构:-- src    -- host    -- jit    *.c   

vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll【转】

 vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll 2008-12-03 17:38:46 标签:WinForm C# libvlc.dll 休闲 vlc 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://jeremiah.blog.51cto.com/539865/116981 vlc-0.9.4提供的libvlc.dll是可以动态调用的,Jeremiah这一篇博客就介绍下如何用C#和WinForm框架调用l

性能监控(5)&ndash;JAVA下的jstat命令

jstat的基本语法为 Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 选项option可以由以下值构成 -class:显示classloader的相关信息 -compiler:显示JIT编译的相关信息 -gc:显示GC相关的堆信息 -gccapacity:显示各个代的容量以及使用情况 -gccause:显示垃圾收