`

研究垃圾回收机制,计算对象创建占用的内存

阅读更多


package tigers;

public class Tiger14 {

public static void main(String[] args) {
int[] timesArray = {10, 100, 1000, 10000};
execute("java.lang.StringBuffer", timesArray);
execute("java.lang.String", timesArray);
execute("java.lang.Object", timesArray);
}
private static void execute(String className, int[] timesArray) {
try {
System.out.println("<+>>>>>> Test: [" + className + "]");
for (int i : timesArray) {
long used = usedMemory(className, i);
System.out.println(used + "(" + i + " times)");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static long usedMemory(String className, int times) throws Exception{
Class c = Class.forName(className);
int size = times;
Object[] obs = new Object[times];
//runGC();
rt.gc();
long start = rt.freeMemory();
for (int i = 0; i < size; i++) {
obs[i] = c.newInstance();
}
//runGC();
rt.gc();
long end = rt.freeMemory();
return (start - end) / size;
}
private static Runtime rt = Runtime.getRuntime();


private static void runGC() throws Exception{ //试图强制运行垃圾回收。
long past = Long.MAX_VALUE, now = rt.freeMemory();
for (int i = 0; (past > now) && (i < 500); i++) { //只有当垃圾回收确实执行以后,现在剩余的内存才会大于过去剩余的内存,for循环才会终止。
rt.runFinalization(); //强制调用对象的finalize()方法,为垃圾回收作准备。
rt.gc(); //试图激活垃圾回收线程。

Thread.yield(); //延迟当前线程,使垃圾回收线程得到执行机会。
past = now;
now = rt.freeMemory(); //更新当前内存使用状态
}
}
}

使用Runtime.gc()方法实现垃圾回收:

<+>>>>>> Test: [java.lang.StringBuffer]
112(10 times)
64(100 times)
64(1000 times)
63(10000 times)
<+>>>>>> Test: [java.lang.String]
184(10 times)
43(100 times)
40(1000 times)
35(10000 times)
<+>>>>>> Test: [java.lang.Object]
31(10 times)
14(100 times)
8(1000 times)
6(10000 times)
使用自定义的runGC()方法实现垃圾回收:

<+>>>>>> Test: [java.lang.StringBuffer]
-924(10 times)
61(100 times)
64(1000 times)
63(10000 times)
<+>>>>>> Test: [java.lang.String]
200(10 times)
38(100 times)
40(1000 times)
35(10000 times)
<+>>>>>> Test: [java.lang.Object]
47(10 times)
11(100 times)
6(1000 times)
8(10000 times)

分享到:
评论

相关推荐

    测试java对象占用内存大小的例子

    在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等语言那样简单。通常,我们可以使用一些工具或API来帮助我们。例如,`sun.misc.Unsafe`类(虽然非标准,但广泛使用)提供了访问内存的能力,...

    浅析JAVA之垃圾回收机制.doc

    【垃圾回收机制简介】 在Java编程中,与C++或C等语言相比,开发者无需手动管理内存,因为Java引入了一种自动的内存管理机制——垃圾回收(Garbage Collection,简称GC)。垃圾回收器负责监测并回收不再使用的对象所...

    dotnet 运行时获取某类型的对象占用内存大小.rar

    标题提到的"dotnet 运行时获取某类型的对象占用内存大小"涉及到的主要知识点是.NET运行时内存管理和对象大小计算。.NET Framework以及.NET Core(现在统称为.NET)提供了一些工具和API,帮助开发者分析和理解内存...

    对于js垃圾回收机制的理解

    在JavaScript中,垃圾回收机制(Garbage Collection,简称GC)是自动内存管理的一个重要方面,它帮助开发者管理内存使用,自动释放不再使用的内存,以防止内存泄漏和程序崩溃。以下是对JavaScript垃圾回收机制的深入...

    Java学习笔记_垃圾回收

    Java垃圾回收(Garbage Collection, 简称GC)是Java编程语言中一项重要的自动内存管理机制,...通过阅读"Java学习笔记_垃圾回收.pdf",你将进一步深入理解这个主题,掌握如何在实际项目中有效利用和优化垃圾回收机制。

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    - **合理设计对象的生命周期**:对于临时需要的大型对象,应当尽快使其成为垃圾回收的候选,例如,可以使用局部变量存储这些对象,在使用完毕后立即将它们的引用置为null,从而帮助垃圾回收器回收它们占用的内存。...

    C# Winform windows运行内存释放

    1. **垃圾收集(Garbage Collection, GC)**:C#中的垃圾收集是自动进行的,它负责回收不再使用的对象所占用的内存。然而,有时候垃圾收集可能不会立即运行,导致内存占用持续增长。开发者可能需要手动触发GC,如使用`...

    垃圾回收算法

    垃圾回收机制是现代编程语言中一项重要的功能,旨在自动管理程序的内存使用,避免程序开发者手动管理内存带来的复杂性和潜在错误。这一机制最早出现在Lisp语言中,随着技术的发展,垃圾回收的概念被广泛应用于多种...

    使用PYTHON动态控制LINUX系统的内存占用百分比.pdf

    Python具有垃圾回收机制,当对象的引用计数为0时,会自动释放内存。通过将变量赋值为`None`,可以使得对象的引用计数归零,从而触发垃圾回收,释放内存。 第四部分讲解了如何检测系统的总内存和当前内存占用。这...

    java实现内存动态分配

    Java的垃圾回收机制(Garbage Collection, GC)负责自动回收不再使用的对象所占用的堆内存。当一个对象不再有引用指向它时,该对象成为垃圾,GC会在适当的时候将其回收,释放内存。在实验中,虽然没有直接涉及垃圾...

    JVM垃圾回收与调优详解1

    总的来说,JVM的垃圾回收机制旨在高效、准确地释放内存,通过不同的策略和算法来优化内存管理,避免内存泄漏,提高应用的性能和稳定性。理解这些原理有助于开发者进行JVM调优,提升应用程序的运行效率。

    Python技术内存管理技巧.docx

    1. **垃圾回收机制**:Python 的垃圾回收机制是其内存管理的核心部分。它依赖于引用计数,即跟踪每个对象被引用的次数。当对象的引用计数变为零,表明该对象不再被使用,垃圾回收器会回收其占用的内存。然而,引用...

    易语言减少内存占用源码.7z

    6. **垃圾回收**:虽然易语言不像某些高级语言有内置的垃圾回收机制,但开发者仍需要关注对象生命周期,确保不再使用的对象能被及时释放。 7. **复用对象**:对于可以复用的对象,如窗口、控件等,可以设计成单例...

    面向对象和JVM内存模型.pdf

    JVM通过垃圾回收机制自动管理内存,释放不再使用的对象所占用的内存空间。 综上所述,面向对象是一种编程范式,而JVM内存模型则是运行Java程序的虚拟环境的一部分,它们共同保证了Java程序的运行效率和稳定性。...

    C#内存优化源码.rar_内存优化

    .NET的垃圾回收机制是自动的,它会定期检测不再被引用的对象并释放其占用的内存。然而,过度依赖GC可能导致性能问题,因为GC运行时会暂停应用程序。为了减少GC压力,开发者可以考虑以下策略: - 使用值类型而非...

    Java Garbage Collection Basics

    Java 虚拟机 (JVM) 的垃圾回收机制是 Java 语言的一项重要特性,它自动管理内存,帮助开发者减轻了手动管理内存的压力。本篇将深入探讨 Java 垃圾回收的基本原理、工作方式以及如何在 Java SE 7 的 Hotspot JVM 中...

    【Spark内核篇05】Spark内存管理1

    释放内存时,Spark会记录对象释放的内存并删除引用,等待JVM的垃圾回收机制来释放实际的内存。堆内内存的大小可以通过`--executor-memory`或`spark.executor.memory`参数配置。Spark将堆内内存划分为三个部分:存储...

    Java程序内存行为研究.pdf

    Java平台的内存管理主要依赖于Java虚拟机(JVM)的垃圾收集机制,它自动处理对象的创建、使用和销毁,以确保内存的有效使用。本文将深入探讨Java程序内存行为的几个关键方面,并阐述它们如何影响性能优化和能耗。 ...

Global site tag (gtag.js) - Google Analytics