- 浏览: 572231 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
sucheng2016:
最近也遇到同樣的問題, 我用的是com.fasterxml.j ...
Java的Timezone问题 -
netwelfare:
这里有篇《时间纪元与时区介绍》,讲解的不错,可以看看。
Java的Timezone问题 -
yjplxq:
...
Java -jar 选项与 -cp/-classpath -
phil09s:
问题是,为什么要设定成这样?
Java局部变量必须初始化 -
anttu:
...
db2 SQL: value(), values(), with, recursive SQL
我一直在想一个问题,做循环的时候变量在循环体内定义省内存还是变量在循环体外定义省内存,于是做了下实验:
和下面的code进行比较:
结果两个打印的结果是一样的,当然我是分两次运行的,不是在一一起运行的。所以感觉没有区别,可能从作用域来说作用域越小,越容易被回收吧,所以并不是变量定义在外面科学,感觉应该是定义在里面更好一些,因为生命周期短,容易被回收。
但是从CPU角度讲,可能写在外面的话,创建新变量的过程省了,是不是更加节省CPU执行单元?
另外有以下代码可以跑着看看内存什么时候被回收,你可以试试写在外面好还是写在里面好,我跑着试了试,感觉都一样:
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. 性能上的差异,微乎其微,可以完全不用考虑
for (int i = 0; i < 50000; i++) {
HoldMemory holdMemory=new HoldMemory();
}
理由:
1. 这种用法更合理,更规范点
2. 性能上的差异,微乎其微,可以完全不用考虑
发表评论
-
InfoQ 上的一篇非常棒的文章 -- IT 和 架构从里到外的透视
2011-01-08 00:22 1130http://www.infoq.com/articles/i ... -
什么是SOA?
2010-06-30 00:03 1170SOA(Service Oriented Architectu ... -
Eclipse workspace包含哪些工程的配置文件在什么地方?
2010-06-09 22:39 6222今天下午遇到一个问题,Eclipse在某一个Workspa ... -
Java -jar 选项与 -cp/-classpath
2010-06-04 22:29 13650今天遇到一个问题,我虽然把所有的引用到的jar文件都放到 ... -
设计模式--琢磨推敲
2010-05-31 10:50 1622分类: 创建模式 结构模式 行为模式 尤点: ... -
Java面试题目(English),先占个位置,有空了慢慢翻译
2010-05-12 00:07 1752答案参考链接: http://www.allapplabs.c ... -
Java split 的时候遇到的问题
2010-05-10 13:40 1085我有一个字符串,分隔符是“|”,我使用方法下面代码总是取不到分 ... -
WebShpere 端口列表及配置文件
2010-04-21 23:54 1049我承认我是标题党,点过去你就感激我了,哈哈! http://p ... -
Java 内存监控工具大全
2010-04-14 13:29 2237http://java-source.net/open-sou ... -
基于JDK1.5,1.6开发的程序如何在JDK1.4上面跑
2010-03-11 11:08 1055问题就是标题了,具体的可以看看这两个网站,两个开源的项目,瞅瞅 ... -
UML 的免费课程,跟大家分享一下(Englsih)。
2010-02-11 10:32 900http://www.cragsystems.co.uk/IT ... -
静态块,实例块
2010-02-11 09:06 1181package com.ibm.blunit.luzl; ... -
Java Label continue goto
2010-02-11 07:11 1649今天学了个新知识,goto 和 continue后面能跟标签, ... -
Java下载集合,sun提供的.
2010-02-10 07:25 1000从这个link下载:http://java.sun.com/p ... -
Java的Timezone问题
2010-02-02 00:32 4631今天遇到了一个比较有意思的问题,从服务器上封装好的java.s ... -
如何设置pdf阅读器打开文章时回到上次浏览的页
2010-02-01 11:12 2961在下图中的checkbox上打个对勾就行了。 -
Tomcat+Spring应用系统中log4j配置文件的使用方法
2009-07-26 14:01 6482转载自:http://blog.sina.com.cn/s/b ... -
springMVC入门
2009-07-22 16:09 1970转载自http://blog.csdn.net/lenotan ... -
Java程序性能调优的基本知识和JDK调优
2009-07-21 17:04 1346一 基本知识 1.1 性 ... -
Eclipse中包按层次关系显示
2009-07-13 19:58 4775Eclipse默认的包视图是并列,层次关系不是很清楚: ...
相关推荐
### 黑马程序员Java基础教学知识点详解 #### 一、变量的作用域与生命...以上内容涵盖了Java基础教学中的关键概念,包括变量作用域、循环结构、流程控制以及内存管理的基本原理,是学习Java编程不可或缺的基础知识。
Java变量和对象的作用域是编程时非常重要的概念,它们决定了变量和对象的可见性和生命周期。在Java中,作用域由代码中的大括号 `{}` 定义,这被称为语句块。一旦变量或对象在某个作用域内声明,它们就只能在该作用域...
\n\n总之,理解并熟练掌握JAVA中的变量作用域是成为一名合格的JAVA程序员的基础,也是OCJA认证考试的关键内容之一。通过深入学习和实践,可以有效地提升编程技能,为未来的JAVA开发工作打下坚实的基础。
基于java变量和作用域以及成员变量的默认初始化 Java 变量和作用域是 Java 编程语言的基础概念,了解变量和作用域的概念对编写高效、可靠的 Java 程序非常重要。本文将详细介绍 Java 变量和作用域,以及成员变量的...
1. **作用域(Scope)**:变量的作用域是变量可见的区域。一旦离开变量的作用域,变量就无法访问。例如,局部变量只在其定义的代码块内有效。 2. **封装(Encapsulation)**:Java鼓励通过设置访问修饰符来控制类的...
1. **生命周期与作用域**: 局部变量在其声明的代码块内部有效,一旦离开该块,变量就不再存在。它们不会在方法调用之间保持值。 2. **必须初始化**: 与成员变量不同,局部变量在声明时必须立即初始化,否则编译器将...
如果两个变量之间存在重写关系,那么在同一作用域内定义相同的`final`变量将会导致编译错误。下面是修改后的代码: ```java public class Test1 { final String color = "黄色"; public void getMes() { System....
在Java中,有四种主要的作用域:方法作用域、块作用域、类作用域和实例(或对象)作用域。局部变量(如方法内的变量)只在其声明的代码块内有效,而类变量(静态变量)在整个类中都可访问。实例变量(非静态变量)...
本资料包"8.java变量.zip"聚焦于Java中的变量,特别是通过8.java变量.docx文档详细阐述了这一主题。以下是关于Java变量的详尽解析。 1. **变量类型** - **基本类型**:Java有八种基本数据类型,包括整型(byte, ...
当函数执行完毕或者变量的作用域结束,Java虚拟机(JVM)会自动释放栈内存中分配的空间,使得这部分内存可以被其他变量重新使用。栈内存的管理高效,因为它采用先进后出(LIFO)的数据结构,分配和回收都非常快速。 ...
变量作用域允许开发者定义变量的作用域名称,这样在同一个作用域内创建变量时,该变量会自动获得相应的作用域前缀,从而实现变量重用,而无需创建全局变量。这样不仅提高了代码的可维护性,也使得模型的结构更加清晰...
这些变量在函数的栈内存中分配,当超过变量的作用域后,Java 会自动释放掉为变量分配的内存空间,该内存空间可以立刻被另作他用。栈内存的特点是:自动释放、快速分配、空间小。 堆内存用于存放由 new 创建的对象...
堆内存中的对象生命周期不受作用域限制,仅在不再被任何引用变量指向时才会被垃圾回收机制回收。 #### 六、JVM中的堆和栈 Java虚拟机(JVM)是基于堆栈架构的。对于每一个新创建的线程,JVM都会为其分配一个独立的...
Java把内存划分成两种:一种是栈内存,一种...当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
在这个文档“java变量的五种方式t共2页.pdf.zip”中,我们预计会涵盖Java中的五种主要的变量类型及其用法。尽管实际内容无法在当前环境中直接查看,但根据常规的Java教程,我可以提供一个详细的概述。 1. **基本...
以下是对Java变量类型的详细讲解: 1. 基本数据类型(Primitive Data Types) Java中的基本数据类型分为两大类:数值类型和非数值类型。 - 数值类型: - 整型:byte(1字节,-128到127)、short(2字节,-32,...
在深入学习和应用JavaScript编程时,理解变量类型以及变量作用域是至关重要的。JavaScript是一种动态类型的语言,意味着变量可以存储不同类型的值,并且不需要在声明时指定类型。在JavaScript中,所有的变量都存储为...
- 分配内存:成员变量和类变量在对象创建或类加载时分配内存,局部变量在进入其作用域时分配内存。 理解这三种变量类型有助于编写清晰、高效的Java代码。正确地使用它们可以帮助优化内存使用,提高程序性能,并...