`
luzl
  • 浏览: 572231 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Java变量作用域内存

    博客分类:
  • Java
阅读更多
我一直在想一个问题,做循环的时候变量在循环体内定义省内存还是变量在循环体外定义省内存,于是做了下实验:
import junit.framework.TestCase;

class HoldMemory{
	String str01="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	
	public HoldMemory(){
	}
}

public class MemoryCase extends TestCase{

	public void testname() throws Exception {
		for (int i = 0; i < 50000; i++) {
			HoldMemory holdMemory=new HoldMemory();
		}
		System.out.println(Runtime.getRuntime().freeMemory());
		
	}
}


和下面的code进行比较:
import junit.framework.TestCase;

class HoldMemory{
	String str01="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	
	public HoldMemory(){
	}
}

public class MemoryCase extends TestCase{

	public void testname() throws Exception {
                HoldMemory holdMemory=null;
		for (int i = 0; i < 50000; i++) {
		     holdMemory=new HoldMemory();
		}
		System.out.println(Runtime.getRuntime().freeMemory());
		
	}
}

结果两个打印的结果是一样的,当然我是分两次运行的,不是在一一起运行的。所以感觉没有区别,可能从作用域来说作用域越小,越容易被回收吧,所以并不是变量定义在外面科学,感觉应该是定义在里面更好一些,因为生命周期短,容易被回收。
但是从CPU角度讲,可能写在外面的话,创建新变量的过程省了,是不是更加节省CPU执行单元?

另外有以下代码可以跑着看看内存什么时候被回收,你可以试试写在外面好还是写在里面好,我跑着试了试,感觉都一样:
package com.ibm.partnerworld.vic.testcase;

import junit.framework.TestCase;

class HoldMemory{
	String str01="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str02="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str03="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str04="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str05="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str06="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str07="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str08="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str09="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str10="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str11="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str12="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str13="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str14="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	String str15="12111111111111111111111111111111111111111111111111111111111111111111111111111111111";
	
	public HoldMemory(){
		try {
			System.out.println("Created");
			Thread.currentThread().sleep(3);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
		System.out.println("I was reused!");
	}
}

public class MemoryCase extends TestCase{

	public void testname() throws Exception {
		HoldMemory holdMemory=null;
		for (int i = 0; i < 50000; i++) {
			holdMemory=new HoldMemory();
			System.out.println("total=>"+Runtime.getRuntime().totalMemory());
			System.out.println("free=>"+Runtime.getRuntime().freeMemory());
		}
		System.out.println(Runtime.getRuntime().freeMemory());
		
	}
}

分享到:
评论
2 楼 wumingshi 2010-05-10  
基本上没有影响。循环变量是在栈上定义的,所以在循环体内外定义基本没有区别。但是从代码可读性来说,尽量缩小变量的作用域是非常重要的。另外,除非你是做嵌入系统,各个方面的资源非常紧张,否则总是这样思考不是很明智。更应该关心的代码的可读性和可维护性。
1 楼 lzhc2004 2010-05-10  
变量的作用域如果只是在循环内,建议使用如下这种方式:
for (int i = 0; i < 50000; i++) { 
            HoldMemory holdMemory=new HoldMemory(); 
}
理由:
1. 这种用法更合理,更规范点
2. 性能上的差异,微乎其微,可以完全不用考虑

相关推荐

    黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构

    ### 黑马程序员Java基础教学知识点详解 #### 一、变量的作用域与生命...以上内容涵盖了Java基础教学中的关键概念,包括变量作用域、循环结构、流程控制以及内存管理的基本原理,是学习Java编程不可或缺的基础知识。

    Java变量和对象的作用域

    Java变量和对象的作用域是编程时非常重要的概念,它们决定了变量和对象的可见性和生命周期。在Java中,作用域由代码中的大括号 `{}` 定义,这被称为语句块。一旦变量或对象在某个作用域内声明,它们就只能在该作用域...

    JAVA程序设计课件-变量的作用域.pptx

    \n\n总之,理解并熟练掌握JAVA中的变量作用域是成为一名合格的JAVA程序员的基础,也是OCJA认证考试的关键内容之一。通过深入学习和实践,可以有效地提升编程技能,为未来的JAVA开发工作打下坚实的基础。

    基于java变量和作用域以及成员变量的默认初始化(详解)

    基于java变量和作用域以及成员变量的默认初始化 Java 变量和作用域是 Java 编程语言的基础概念,了解变量和作用域的概念对编写高效、可靠的 Java 程序非常重要。本文将详细介绍 Java 变量和作用域,以及成员变量的...

    关于Java变量的可见性问题Java开发Java经验技巧共

    1. **作用域(Scope)**:变量的作用域是变量可见的区域。一旦离开变量的作用域,变量就无法访问。例如,局部变量只在其定义的代码块内有效。 2. **封装(Encapsulation)**:Java鼓励通过设置访问修饰符来控制类的...

    Java 成员变量和局部变量

    1. **生命周期与作用域**: 局部变量在其声明的代码块内部有效,一旦离开该块,变量就不再存在。它们不会在方法调用之间保持值。 2. **必须初始化**: 与成员变量不同,局部变量在声明时必须立即初始化,否则编译器将...

    java成员变量覆盖问题

    如果两个变量之间存在重写关系,那么在同一作用域内定义相同的`final`变量将会导致编译错误。下面是修改后的代码: ```java public class Test1 { final String color = "黄色"; public void getMes() { System....

    accp5.0java第二章变量(二)

    在Java中,有四种主要的作用域:方法作用域、块作用域、类作用域和实例(或对象)作用域。局部变量(如方法内的变量)只在其声明的代码块内有效,而类变量(静态变量)在整个类中都可访问。实例变量(非静态变量)...

    8.java变量.zip

    本资料包"8.java变量.zip"聚焦于Java中的变量,特别是通过8.java变量.docx文档详细阐述了这一主题。以下是关于Java变量的详尽解析。 1. **变量类型** - **基本类型**:Java有八种基本数据类型,包括整型(byte, ...

    Java中堆内存与栈内存分配浅析

    当函数执行完毕或者变量的作用域结束,Java虚拟机(JVM)会自动释放栈内存中分配的空间,使得这部分内存可以被其他变量重新使用。栈内存的管理高效,因为它采用先进后出(LIFO)的数据结构,分配和回收都非常快速。 ...

    TENSORFLOW变量作用域(VARIABLE SCOPE)

    变量作用域允许开发者定义变量的作用域名称,这样在同一个作用域内创建变量时,该变量会自动获得相应的作用域前缀,从而实现变量重用,而无需创建全局变量。这样不仅提高了代码的可维护性,也使得模型的结构更加清晰...

    java内存原理.doc

    这些变量在函数的栈内存中分配,当超过变量的作用域后,Java 会自动释放掉为变量分配的内存空间,该内存空间可以立刻被另作他用。栈内存的特点是:自动释放、快速分配、空间小。 堆内存用于存放由 new 创建的对象...

    Java中堆内存和栈内存详解

    堆内存中的对象生命周期不受作用域限制,仅在不再被任何引用变量指向时才会被垃圾回收机制回收。 #### 六、JVM中的堆和栈 Java虚拟机(JVM)是基于堆栈架构的。对于每一个新创建的线程,JVM都会为其分配一个独立的...

    Java栈内存与堆内存

    Java把内存划分成两种:一种是栈内存,一种...当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

    java变量的五种方式t共2页.pdf.zip

    在这个文档“java变量的五种方式t共2页.pdf.zip”中,我们预计会涵盖Java中的五种主要的变量类型及其用法。尽管实际内容无法在当前环境中直接查看,但根据常规的Java教程,我可以提供一个详细的概述。 1. **基本...

    Java 变量类型的知识分享

    以下是对Java变量类型的详细讲解: 1. 基本数据类型(Primitive Data Types) Java中的基本数据类型分为两大类:数值类型和非数值类型。 - 数值类型: - 整型:byte(1字节,-128到127)、short(2字节,-32,...

    JavaScript变量类型以及变量作用域详解

    在深入学习和应用JavaScript编程时,理解变量类型以及变量作用域是至关重要的。JavaScript是一种动态类型的语言,意味着变量可以存储不同类型的值,并且不需要在声明时指定类型。在JavaScript中,所有的变量都存储为...

    Java成员变量类变量局部变量的区别共5页.pdf.zip

    - 分配内存:成员变量和类变量在对象创建或类加载时分配内存,局部变量在进入其作用域时分配内存。 理解这三种变量类型有助于编写清晰、高效的Java代码。正确地使用它们可以帮助优化内存使用,提高程序性能,并...

Global site tag (gtag.js) - Google Analytics