测试用例
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垃圾回收机制是Java平台中一个非常重要的特性,它的主要任务是自动管理程序运行过程中的内存,自动识别并释放不再使用的对象,以避免内存泄漏。本篇将详细讲解老年代垃圾收集器,主要包括SerialOld、ParallelOld...
通过简单的java程序测试Linux服务器内存使用、回收情况,排查Linux服务器内存使用异常的情况
Java应用的垃圾回收(Garbage Collection, GC)是优化高性能应用的关键环节,特别是对于追求高吞吐量和低延迟的服务,如LinkedIn的动态信息数据平台。优化GC涉及到多个层面,包括选择合适的垃圾回收器,调整参数,...
Java 应用垃圾回收优化 垃圾回收优化是 Java 应用的关键性能指标之一。对高吞吐低延迟 Java 应用的垃圾回收优化是确保用户体验的重要一步。LinkedIn 的高吞吐量服务需要低延迟地响应用户请求,动态信息数据平台作为...
### Java中内存泄露及垃圾回收机制 #### 一、内存泄露概述 在计算机科学领域,内存泄露是指在程序运行过程中,不再使用的内存未被及时释放,导致这部分内存无法被重复利用,进而影响程序性能甚至导致程序崩溃的...
java项目之垃圾分类微信小程序的设计与实现(源码+说明文档) 具体功能实现:可以分为前台功能和后台功能两大部分: 1. 前台功能模块: a.文字搜索功能模块:用户可以根据文本搜索物品,对垃圾进行分类; b.拍照识别...
Java垃圾回收调优是优化Java应用程序性能的关键环节,特别是对于那些需要处理大量数据或执行高并发操作的应用。垃圾回收(Garbage Collection, GC)的主要任务是自动管理内存,释放不再使用的对象,避免内存泄漏,...
Java垃圾回收机制的finalize方法实例分析 Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的...
它的语法与C++和C#有诸多相似之处,但Java引入了垃圾回收机制,自动处理内存管理,从而减轻了程序员的负担。Java的核心概念包括类、对象、接口、包、异常处理、多线程等。类是对象的蓝图,对象则是类的实例,它们...
Java开发工具包(JDK)中的垃圾回收(Garbage Collection, 简称GC)是Java虚拟机(JVM)管理内存的一种自动化机制。在JDK 7中,G1(Garbage-First)垃圾回收器引入了一种新的内存管理策略,旨在提供可预测的暂停时间...
Java的垃圾回收(GC)机制是Java编程中一个至关重要的概念,它负责自动管理内存,回收不再使用的对象,以防止内存泄漏。理解GC的工作原理和优化策略对于开发高性能的Java应用至关重要。 首先,GC的基本目标是识别并...
Java垃圾回收机制是Java编程中的核心部分,它自动管理程序的内存,回收不再使用的对象所占用的内存,以防止内存泄漏。然而,垃圾回收过程并非总是无缝进行的,尤其是在大型应用或高并发环境中,垃圾回收可能导致显著...
Java Groovy 内存回收测试步骤解析 Java Groovy 内存回收测试步骤解析是指通过 Groovy 语言编写的 Java 应用程序中内存回收的测试步骤。该测试步骤旨在解决在使用 Groovy 语言编写的 Java 应用程序中出现的内存回收...
3. 垃圾投放点查询:显示附近的垃圾回收站位置,方便用户找到最近的投放点。 4. 回收预约:用户可以预约上门回收服务,减少不必要的出行。 5. 积分系统:根据用户投放垃圾的数量和质量,给予积分奖励,激励用户积极...
在IT行业中,垃圾回收系统通常指的是编程语言中的内存管理机制,而非字面意义上的垃圾收集服务。这个系统主要用于自动管理程序中的内存,确保无用的对象能够被有效地释放,从而避免内存泄漏。在本项目中,"垃圾回收...
- **JVM(Java Virtual Machine)**:Java程序的运行平台,理解垃圾回收机制、类加载器和JVM内存模型对优化Java程序很重要。 - **多线程**:Java提供了丰富的并发工具,如Thread类、Runnable接口、synchronized...
然而,在实际应用中,人们往往会关心这样一个问题:当单例对象长时间未被使用时,它是否会被Java虚拟机(JVM)的垃圾回收机制回收?本文将深入探讨这一问题,并基于HotSpot虚拟机的特性来分析答案。 #### 二、单例...
1. **编程题目**:Java编程能力测试系统的核心是它的题库,这些题目覆盖了Java语言的不同方面,包括基础语法、面向对象编程、集合框架、异常处理、多线程、IO流、网络编程、反射、注解、垃圾回收等。通过这些题目,...