测试用例
ObjA
public class ObjA { private int idx; public ObjA(int i){ idx = i; System.out.println("创建对象:ObjA("+i+")"); } protected void finalize() throws Throwable{ super.finalize(); System.out.println("回收对象:ObjA("+idx+")"); } public ObjB getObjB(int i){ ObjB b = new ObjB(i); return b; } }
ObjB
public class ObjB { private int idx; public ObjB(int i) { idx = i; System.out.println("创建对象:ObjB("+i+")"); } protected void finalize() throws Throwable{ super.finalize(); System.out.println("回收对象:ObjB("+idx+")"); } public String getStr(){ System.out.println("调用 ObjB"+idx+".getStr();"); return "getStr()"; } }
测试
测试1
代码
public class Main { public static void main(String[] args) { for (int i = 0; i < 10; i++) { ObjA obja = new ObjA(i); obja.getObjB(i).getStr(); obja = null; } System.gc(); } }
运行结果
创建对象:ObjA(0)
创建对象:ObjB(0)
调用 ObjB0.getStr();
创建对象:ObjA(1)
创建对象:ObjB(1)
调用 ObjB1.getStr();
创建对象:ObjA(2)
创建对象:ObjB(2)
调用 ObjB2.getStr();
创建对象:ObjA(3)
创建对象:ObjB(3)
调用 ObjB3.getStr();
创建对象:ObjA(4)
创建对象:ObjB(4)
调用 ObjB4.getStr();
创建对象:ObjA(5)
创建对象:ObjB(5)
调用 ObjB5.getStr();
创建对象:ObjA(6)
创建对象:ObjB(6)
调用 ObjB6.getStr();
创建对象:ObjA(7)
创建对象:ObjB(7)
调用 ObjB7.getStr();
创建对象:ObjA(8)
创建对象:ObjB(8)
调用 ObjB8.getStr();
创建对象:ObjA(9)
创建对象:ObjB(9)
调用 ObjB9.getStr();
回收对象:ObjB(9)
回收对象:ObjA(9)
回收对象:ObjB(8)
回收对象:ObjA(8)
测试2
代码
public class Main { public static void main(String[] args) { for (int i = 0; i < 10; i++) { ObjA obja = new ObjA(i); obja.getObjB(i).getStr(); obja = null; if (i % 2 ==0){ System.gc(); } } } }
运行结果
创建对象:ObjA(0)
创建对象:ObjB(0)
调用 ObjB0.getStr();
创建对象:ObjA(1)
创建对象:ObjB(1)
调用 ObjB1.getStr();
创建对象:ObjA(2)
创建对象:ObjB(2)
调用 ObjB2.getStr();
回收对象:ObjB(0)
回收对象:ObjB(2)
回收对象:ObjA(2)
回收对象:ObjB(1)
回收对象:ObjA(1)
回收对象:ObjA(0)
创建对象:ObjA(3)
创建对象:ObjB(3)
调用 ObjB3.getStr();
创建对象:ObjA(4)
创建对象:ObjB(4)
调用 ObjB4.getStr();
创建对象:ObjA(5)
创建对象:ObjB(5)
调用 ObjB5.getStr();
创建对象:ObjA(6)
创建对象:ObjB(6)
调用 ObjB6.getStr();
回收对象:ObjB(4)
回收对象:ObjB(6)
回收对象:ObjA(6)
回收对象:ObjB(5)
回收对象:ObjA(5)
回收对象:ObjA(4)
回收对象:ObjB(3)
回收对象:ObjA(3)
创建对象:ObjA(7)
创建对象:ObjB(7)
调用 ObjB7.getStr();
创建对象:ObjA(8)
创建对象:ObjB(8)
调用 ObjB8.getStr();
创建对象:ObjA(9)
创建对象:ObjB(9)
调用 ObjB9.getStr();
回收对象:ObjB(8)
回收对象:ObjA(8)
回收对象:ObjB(7)
回收对象:ObjA(7)
总结分析
从以上测试分析得知,在循环语句中,如果有大量对象创建,需要显示地执行System.gc();方法。 否则等JVM自己去处理垃圾的时候,可能已经造成OutOfMemory错误了。
GC也不能执行得太频繁,所以建议,根据对象的内存占用情况决定循环多少次,显示地调用一次GC方法。
相关推荐
Java垃圾回收(二)老年代垃圾收集器(csdn)————程序
java项目之垃圾分类微信小程序的设计与实现(源码+说明文档) 具体功能实现:可以分为前台功能和后台功能两大部分: 1. 前台功能模块: a.文字搜索功能模块:用户可以根据文本搜索物品,对垃圾进行分类; b.拍照识别...
Java 垃圾回收调优不同于任何其它性能优化活动。 首先你要确保自己足够了解整个应用的情况以及调优预期的结果,而不是单单满足于应用的某一部分调优。一般情况下,遵循以下过程比较容易: 明确自己的性能目标...
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
在C和C++等语言中,是由程序员自己回收垃圾释放内存的;java语言解除了程序员自己亲自回收内存空间的责任。它提供一种系统级线程跟踪内存的分配情况。并在JVM的空闲时,检查并释放无用的内存空间。垃圾收集在程序...
已获导师指导认可通过,答辩评审分达到97分,在window10/11测试环境严格调试,下载即用,确保可以运行,部署教程齐全,也可以作为课程设计Java毕业设计-基于SSM+微信小程序的社区垃圾回收管理系统源码+数据库+PPT+...
指南管理包括:拍照识别,语音识别,分享朋友,图片下载 ...后台管理包括:垃圾分类管理(可回收垃圾、厨余垃圾、有害垃圾、其他垃圾管理) 垃圾管理:对垃圾进行分类 试题管理:增加试题内容,添加题库
主要介绍了Java中垃圾回收器GC对吞吐量的影响测试,本文算是一个对垃圾回收器GC的优化文章,需要的朋友可以参考下
本文是关于Java IO文件流和垃圾回收问题,一个小的测试程序搞清楚Java IO的问题,希望能帮助有需要的小伙伴
采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计...
周末碰到一段代码,是关于Java IO流的,代码中出现在一个多线程的系统中,其中一段代码在打开一个文件操作流用完以后没有及时关闭,开始以为很快会出现打开文件太多或者导致内存溢出,但是在运行了很长时间以后仍然...
java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大...高吞吐低延迟Java应用的垃圾回收优化.docx 黑马程序员入学Java精华总结.pdf
java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB“ 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大...高吞吐低延迟Java应用的垃圾回收优化.docx 黑马程序员入学Java精华总结.pdf
java面试笔试题库java学习比较开发教程互联网公司面试资料大全合集: 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf...高吞吐低延迟Java应用的垃圾回收优化.docx 黑马程序员入学Java精华总结.pdf
试题测试功能模块:用户可以通过测试模块,提高垃圾分类的环保意识。 2.后台功能模块: a.用户管理模块:管理员可以查看用户信息,也可以增加或删除用户信息; b.垃圾分类管理模块:管理员登录后可以查看垃圾分类...
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
由于采用垃圾回收机制,Java语言的内存泄漏的模式与C++等语言相比有很大的不同。全文通过与C++中的内存泄漏问题进行对比,讲述了Java内存泄漏的基本原理,以及如何借助Optimizeitprofiler工具来测试内存泄漏和分析...
java 作为现在用户最多,使用最为广泛的技术,主要是由于一个大大降低开发成 本的优点:它是运行在 java 虚拟机上的,而 java 虚拟机隐藏了底层硬件的复杂...根据不同的标准测试得垃圾回收小效率有 2%-5% 的提升。