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) 该类的对象实例有对该变量所包含的对象的共享需求。
如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。
分享到:
相关推荐
这意味着无论创建多少个类的对象,静态变量只有一份存储空间,所有对象共享这个变量的值。 - **访问性**:可以不通过类的实例直接访问静态变量,使用`类名::静态变量名`的方式。 - **生命周期**:静态变量的生命...
另外,Java还提供了静态变量和实例变量,静态变量属于类,所有类的对象共享同一份静态变量,而实例变量则为每个对象独立存储。 理解变量的赋值操作也很重要。在Java中,可以通过等号(=)进行赋值,如`int num = 10;`...
在Java编程语言中,内存管理是一项至关重要的任务,它直接影响到程序的性能、稳定性和资源利用率。本毕业设计项目——“基于JAVA的内存管理模拟”深入探讨了Java内存模型及其管理机制,通过模拟实现来帮助理解这些...
【描述】:本篇文章旨在探讨Java内存模型中不同类型的变量——包括静态变量t1、实例变量t2和局部变量t3——在HotSpot VM中的存储位置。我们将借助HSDB(HotSpot Serviceability Agent的调试器)来探索实际运行时的...
内存模型描述了在程序执行过程中,如何管理和控制不同线程对共享变量的访问。 JMM允许编译器、运行时环境、处理器等根据需要调整内存的读写顺序,但同时提供了一些关键字如`synchronized`和`volatile`来确保必要的...
### Java语言编程——面向对象 面向对象编程是现代软件开发的核心技术之一,它极大地提高了代码的复用性和可维护性。本篇文章将详细介绍Java语言中面向对象的基本概念、原理及其实现方式,包括类与对象的关系、对象...
Java作为一种高度抽象化的编程语言,致力于提供统一的内存管理模型,以便开发者能够跨平台地编写多线程程序。为此,Java引入了一个核心概念——Java内存模型(Java Memory Model, JMM),其目的是规范线程和内存之间...
实例化对象意味着给对象分配必要的存储空间,用 来保存对象的数据和代码。实例化后的每个对象均占有自己的一块内存区域,实例 化时,每个对象分配有一个"引用"(reference)保存到一个实例变量中。"引用" 实际上是一...
3. **方法区**:存储已被虚拟机加载的类信息、常量、静态变量等数据。 4. **程序计数器**:线程私有的,记录当前线程执行的字节码的位置。 5. **本地方法栈**:用于支持本地方法的调用,与Java栈类似。 本文重点...
- **Method Area**:又称为非堆(Non-Heap),存储已加载的类信息、常量、静态变量等。如果Method Area空间耗尽,会出现`java.lang.OutOfMemoryError: PermGen space`异常。 - **Java Stack**:每个线程有自己的...
- **方法区(Method Area)**:也称为永久代,用于存储类的信息、静态变量、常量池等内容。 #### JVM指令集体系结构 JVM指令集体系结构主要包括: - **指令集与CPU架构**:JVM指令集是一组定义好的操作码,用于...
5. **方法区**(在Java 8后被元空间取代):存储已加载的类信息、常量、静态变量以及即时编译器编译后的代码等数据。如果此区域的容量不足,也会抛出`OutOfMemoryError`。 接下来,我们重点讨论JVM的类加载机制。这...
总结,通过对"core-源码.rar"的深入学习,开发者不仅可以掌握JVM的工作原理,还能提升对Java内存管理、线程并发、异常处理等关键领域的理解,进一步提高编程效率和代码质量。同时,这也有助于在遇到实际问题时,能...
5. 静态关键字(static):用于修饰类级别的成员,如静态变量和静态方法。 6. final关键字:用于声明常量或禁止重写。 7. this关键字:用于引用当前对象的实例。 8. String类:不可变的对象,表示字符串序列。字符串...
在Java编程语言中,内存管理和分配是至关重要的概念,它直接影响到程序的性能和稳定性。本文将深入探讨Java中的内存管理,包括堆内存、栈内存、常量池以及垃圾回收机制。 1. **堆内存(Heap Memory)** - 堆内存是...
在Java学习过程中,堆(Heap)和栈(Stack)是两个非常重要的概念,它们对于理解Java内存管理机制至关重要。很多初学者在接触到这两个概念时往往感到困惑,本文将深入浅出地介绍Java中的堆和栈,帮助大家更好地理解...
4. **方法区(Method Area)**:存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 5. **堆(Heap)**:所有线程共享的内存区域,用于存放对象实例。 #### 六、垃圾收集机制 Java虚拟机...
最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...
需要注意的是,数组的长度一旦确定就不能更改,并且数组的实际内存空间会比声明的长度多一个位置,用于存储数组的长度信息。 #### 四、数组间的赋值 在Java中,数组间的赋值实际上是引用的传递。也就是说,当一个...
### 十分钟JAVA从入门到放弃 —— 超简洁的知识点总结 #### 面向对象的三大特征 **封装**:封装是面向对象...对于初学者而言,这些知识点是学习Java编程的基础,同时也是进一步深入探索高级特性和应用场景的前提。