`
zhang.jianjun
  • 浏览: 20215 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • NGG: 个人建议: 正确的做法应该是把样式放到外部css文件中,使用 ...
    js日期选择器

【JAVA优化编程】内存管理之——(5)共享静态变量存储空间

 
阅读更多

5  共享静态变量存储空间

    我们知道类中的静态变量(Static Variable)在程序运行期间其内存空间对所有该类的对象实例而言是共享的,因此在某些时候为了节省系统内存开销,共享资源,将类中的一些变量声明为静态变量,可以通过下面的例子发现合理应用静态变量带来的好处:

public class WeekA {
    static class Data {
        private int week;
        private String name;
        Data(int i, String s) {
            month = i;
            name = s;
        }
    }
    Data weeks[] = {
        new Data(1, "Monday"),
        new Data(2, "Tuesday"),
        new Data(3, "Wednesday"),
        new Data(4, "Thursday"),
        new Data(5, "Friday"),
        new Data(6, "Saturday"),
        new Data(7, "Sunday")
    };

    public static void main(String args[]) {
        final int N = 200000;
        WeekA weekinstance;

        for (int i = 1; i <= N; i++) {
            weekinstance = new WeekA ();
        }
    }
}
 

 

    在上面这段代码中,没有将Data weeks 声明为静态变量,因此当创建WeekA对象时将会得到200 000个weeks对象的副本,这些对象被保存在内存中,但是weeks对象中的数据却从来没有被更改过,而且十分稳定,因此如果能使所有对象共享该数据对象是不错的解决办法,请看下面的代码:

public class WeekB {
    static class Data {
        private int week;
        private String name;
        Data(int i, String s) {
            month = i;
            name = s;
        }
    }
    static Data weeks[] = {
        new Data(1, "Monday"),
        new Data(2, "Tuesday"),
        new Data(3, "Wednesday"),
        new Data(4, "Thursday"),
        new Data(5, "Friday"),
        new Data(6, "Saturday"),
        new Data(7, "Sunday")
    };

    public static void main(String args[]) {
        final int N = 200000;
        WeekA weekinstance;

        for (int i = 1; i <= N; i++) {
            weekinstance = new WeekB ();
        }
    }
}
 

 

    请注意在类WeekB中,在Data weeks[]之前添加了static关键字,将该对象变量声明为静态的,因此当你创建200 000个WeekB对象时系统中只保存着该对象的一份拷贝,而且该类的所有对象实例共享这份拷贝,这无疑节约了大量的不必要的内存开销,同时实现了要完成的系统功能。

    如此说来,我们应该尽量地使用静态变量,其实不是这样的,因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态比变量,就会适得其反,造成大量的内存浪费。因此建议在全部具备下列条件的情况下尽量使用静态变量:

        (1) 变量所包含的对象体积较大,占用内存较多。

        (2) 变量所包含的对象生命周期较长。

        (3) 变量所包含的对象数据稳定。

        (4) 该类的对象实例有对该变量所包含的对象的共享需求。

    如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。

分享到:
评论

相关推荐

    类中静态成员变量和普通变量的区别——实例代码(VS2010)

    这意味着无论创建多少个类的对象,静态变量只有一份存储空间,所有对象共享这个变量的值。 - **访问性**:可以不通过类的实例直接访问静态变量,使用`类名::静态变量名`的方式。 - **生命周期**:静态变量的生命...

    第02章 Java编程基础 01 变量与标识符

    另外,Java还提供了静态变量和实例变量,静态变量属于类,所有类的对象共享同一份静态变量,而实例变量则为每个对象独立存储。 理解变量的赋值操作也很重要。在Java中,可以通过等号(=)进行赋值,如`int num = 10;`...

    精选_毕业设计_基于JAVA的内存管理模拟_完整源码

    在Java编程语言中,内存管理是一项至关重要的任务,它直接影响到程序的性能、稳定性和资源利用率。本毕业设计项目——“基于JAVA的内存管理模拟”深入探讨了Java内存模型及其管理机制,通过模拟实现来帮助理解这些...

    hllvm.借HSDB来探索HotSpot VM的运行时数据1

    【描述】:本篇文章旨在探讨Java内存模型中不同类型的变量——包括静态变量t1、实例变量t2和局部变量t3——在HotSpot VM中的存储位置。我们将借助HSDB(HotSpot Serviceability Agent的调试器)来探索实际运行时的...

    java内存模型(有助理解多线程)

    内存模型描述了在程序执行过程中,如何管理和控制不同线程对共享变量的访问。 JMM允许编译器、运行时环境、处理器等根据需要调整内存的读写顺序,但同时提供了一些关键字如`synchronized`和`volatile`来确保必要的...

    Java语言编程-面向对象

    ### Java语言编程——面向对象 面向对象编程是现代软件开发的核心技术之一,它极大地提高了代码的复用性和可维护性。本篇文章将详细介绍Java语言中面向对象的基本概念、原理及其实现方式,包括类与对象的关系、对象...

    Java线程内存模型的缺陷.docx

    Java作为一种高度抽象化的编程语言,致力于提供统一的内存管理模型,以便开发者能够跨平台地编写多线程程序。为此,Java引入了一个核心概念——Java内存模型(Java Memory Model, JMM),其目的是规范线程和内存之间...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    实例化对象意味着给对象分配必要的存储空间,用 来保存对象的数据和代码。实例化后的每个对象均占有自己的一块内存区域,实例 化时,每个对象分配有一个"引用"(reference)保存到一个实例变量中。"引用" 实际上是一...

    java里的堆和栈

    3. **方法区**:存储已被虚拟机加载的类信息、常量、静态变量等数据。 4. **程序计数器**:线程私有的,记录当前线程执行的字节码的位置。 5. **本地方法栈**:用于支持本地方法的调用,与Java栈类似。 本文重点...

    Core java欢迎下载

    - **Method Area**:又称为非堆(Non-Heap),存储已加载的类信息、常量、静态变量等。如果Method Area空间耗尽,会出现`java.lang.OutOfMemoryError: PermGen space`异常。 - **Java Stack**:每个线程有自己的...

    JAVA文件编译执行与虚拟机(JVM)介绍

    - **方法区(Method Area)**:也称为永久代,用于存储类的信息、静态变量、常量池等内容。 #### JVM指令集体系结构 JVM指令集体系结构主要包括: - **指令集与CPU架构**:JVM指令集是一组定义好的操作码,用于...

    JVM内存资料.zip_jdk

    5. **方法区**(在Java 8后被元空间取代):存储已加载的类信息、常量、静态变量以及即时编译器编译后的代码等数据。如果此区域的容量不足,也会抛出`OutOfMemoryError`。 接下来,我们重点讨论JVM的类加载机制。这...

    core-源码.rar

    总结,通过对"core-源码.rar"的深入学习,开发者不仅可以掌握JVM的工作原理,还能提升对Java内存管理、线程并发、异常处理等关键领域的理解,进一步提高编程效率和代码质量。同时,这也有助于在遇到实际问题时,能...

    java实习周记25篇.docx

    5. 静态关键字(static):用于修饰类级别的成员,如静态变量和静态方法。 6. final关键字:用于声明常量或禁止重写。 7. this关键字:用于引用当前对象的实例。 8. String类:不可变的对象,表示字符串序列。字符串...

    Java元编码(内存分配和管理)

    在Java编程语言中,内存管理和分配是至关重要的概念,它直接影响到程序的性能和稳定性。本文将深入探讨Java中的内存管理,包括堆内存、栈内存、常量池以及垃圾回收机制。 1. **堆内存(Heap Memory)** - 堆内存是...

    详解java学习中堆与栈的内容

    在Java学习过程中,堆(Heap)和栈(Stack)是两个非常重要的概念,它们对于理解Java内存管理机制至关重要。很多初学者在接触到这两个概念时往往感到困惑,本文将深入浅出地介绍Java中的堆和栈,帮助大家更好地理解...

    java虚拟机的原理!

    4. **方法区(Method Area)**:存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 5. **堆(Heap)**:所有线程共享的内存区域,用于存放对象实例。 #### 六、垃圾收集机制 Java虚拟机...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    java数组的概念和作用编程资料

    需要注意的是,数组的长度一旦确定就不能更改,并且数组的实际内存空间会比声明的长度多一个位置,用于存储数组的长度信息。 #### 四、数组间的赋值 在Java中,数组间的赋值实际上是引用的传递。也就是说,当一个...

    十分钟JAVA从入门到放弃

    ### 十分钟JAVA从入门到放弃 —— 超简洁的知识点总结 #### 面向对象的三大特征 **封装**:封装是面向对象...对于初学者而言,这些知识点是学习Java编程的基础,同时也是进一步深入探索高级特性和应用场景的前提。

Global site tag (gtag.js) - Google Analytics