- 浏览: 326767 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- oracle (2)
- j2se (18)
- 应用服务器 (2)
- 操作系统 (21)
- j2ee (3)
- web (9)
- Junit (0)
- 项目 (0)
- IDE (0)
- 五花八门 (1)
- excel导入导出 (0)
- DWR (0)
- display标签总结 (0)
- JS (7)
- FCKeditor (0)
- Spring (3)
- webservice (1)
- JVM (14)
- 传输协议 (6)
- maven (3)
- 服务器 (2)
- 数据结构 (11)
- HTTPClient (2)
- JQUERY (9)
- 设计模式 (4)
- 数据库 (6)
- 看书笔记 (0)
- 工具 (4)
- MINA (3)
- mysql (5)
- jetty (1)
- JAVA网络编程 (7)
- Hessian (1)
- ibatis (1)
- socket (4)
- Native (1)
- http (2)
- nosql (2)
- linux (1)
- hadoop (1)
最新评论
-
applezjv:
可以...
maven常见问题 -
andyboy_bin:
p
Jetty -
ye_wx:
...
TableSpace -
ye_wx:
TableSpace -
极限_裁决:
引用第二:不要把“好像”;“有人会……”;“大概”;“晚些时候 ...
可以让你少奋斗10年的工作经验
原文:http://www.iteye.com/topic/634530
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
如以下代码:
- String s1 = "china" ;
- String s2 = "china" ;
- String s3 = "china" ;
- String ss1 = new String( "china" );
- String ss2 = new String( "china" );
- String ss3 = new String( "china" );
String s1 = "china"; String s2 = "china"; String s3 = "china"; String ss1 = new String("china"); String ss2 = new String("china"); String ss3 = new String("china");
这里解释一下黄色这 3 个箭头,对于通过 new 产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。这也就是有道面试题: String s = new String(“xyz”); 产生几个对象?一个或两个,如果常量池中原来没有 ”xyz”, 就是两个。
对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
如以下代码:
- int i1 = 9 ;
- int i2 = 9 ;
- int i3 = 9 ;
- public static final int INT1 = 9 ;
- public static final int INT2 = 9 ;
- public static final int INT3 = 9 ;
int i1 = 9; int i2 = 9; int i3 = 9; public static final int INT1 = 9; public static final int INT2 = 9; public static final int INT3 = 9;
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
如以下代码:
- class BirthDate {
- private int day;
- private int month;
- private int year;
- public BirthDate( int d, int m, int y) {
- day = d;
- month = m;
- year = y;
- }
- 省略get,set方法………
- }
- public class Test{
- public static void main(String args[]){
- int date = 9 ;
- Test test = new Test();
- test.change(date);
- BirthDate d1= new BirthDate( 7 , 7 , 1970 );
- }
- public void change1( int i){
- i = 1234 ;
- }
class BirthDate { private int day; private int month; private int year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } 省略get,set方法……… } public class Test{ public static void main(String args[]){ int date = 9; Test test = new Test(); test.change(date); BirthDate d1= new BirthDate(7,7,1970); } public void change1(int i){ i = 1234; }
}
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:
1. main方法开始执行:int date = 9;
date局部变量,基础类型,引用和值都存在栈中。
2. Test test = new Test();
test为对象引用,存在栈中,对象(new Test())存在堆中。
3. test.change(date);
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4. BirthDate d1= new BirthDate(7,7,1970);
d1
为对象引用,存在栈中,对象(new
BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。
day,month,year为成员变量,它们存储在堆中(new
BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。
发表评论
-
java诊断工具
2013-04-01 19:12 1355jstack -- 如果java程序崩溃生成core文件,j ... -
java枚举Enum
2013-01-14 14:43 1177public class TestEnum { /* ... -
Java 动态代理机制分析及扩展,第 1 部分
2012-03-26 12:47 747引言 Java 动态代理机制的出现,使得 Java 开 ... -
详解reflect Java的反射机制
2012-03-23 13:09 991一、类型识别的两种方式: 首先了解一下“运 ... -
B树、B-树、B+树、B*树详解
2012-01-18 00:47 1935B树、B-树、B+树、B*树都是什么 B树 ... -
数据结构 二叉树(B树)
2012-01-18 00:41 1378BTree 特征: 1.一个节点最多只有两个子节点,其 ... -
B树温习
2012-01-18 00:36 728B树 即二叉搜索树: 1 ... -
JVM内存分析及导致内存溢出的不健壮代码及解决办法<转载>
2011-11-30 19:07 0一、JVM内存区域组成 java把内存分四种: 1、栈区( ... -
从JVM内存管理的角度谈谈静态方法和静态属性《转》
2011-11-30 19:06 0作者 robbin (http://hibernate.fan ... -
Annotation 之 jdk1.5内建的Annotation实例
2011-11-15 20:25 851一、限定Override父类方法@Override ja ... -
自定义Annotation
2011-11-15 20:24 691自定义Annotation 自定义Annotation早 ... -
Java Annotation
2011-11-14 22:04 0Java Annotation手册 ... -
集合类源码
2011-11-06 04:04 979主要包括Java类库中提供的几个具体的类: LinkedLis ... -
classloader 三
2011-10-24 23:22 866jvm classLoader architecture ... -
ArrayList和Vector以及HashTable和HashMap区别
2011-10-12 10:40 975ArrayList和Vector以及HashTable和Has ... -
jvm内存存储分析
2011-10-11 17:21 1410Java内存分配与管理是Jav ... -
JVM
2011-10-06 21:15 1439安装Java开发软件时,默认安装包含两个文件夹,一个JDK(J ... -
java序列化
2011-10-04 23:48 745有关Java对象的序列化和反序列化也算是Java基础的一部 ... -
JVM优化配置
2011-08-20 22:32 807JVM 优化配置 ... -
JVM慢慢琢磨
2011-08-20 22:05 898原文:http://www.iteye.com/ ...
相关推荐
c++中堆、栈的详细说明,以及它们之间的区别。
堆栈内存区别。
栈和堆栈的区别 内存管理 必读 栈和堆栈的区别.doc
Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。
队列,堆,栈吗,堆栈的区别,对java的学习很有帮助
栈和堆栈的区别,这一点很重要,希望对大家有用
很多时候我们在变成的时候会涉及到堆栈的问题,本资源主要对堆和栈进行区分,加以了解
教你识别背照式和堆栈式摄像头元件的区别,两者区别可大
线性表、堆栈、队列实现源码,C++实现,如果有问题请大家给我留言http://blog.csdn.net/tiandixuanwuliang
堆和栈是两个不同的概念 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个...虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。
文档中详细描述C++中内存分配方式及堆和栈的区别
对堆栈的概念进行详细的分析,详细解释堆与栈的区别,适合于对堆栈概念分不清楚的同学
堆和栈的区别 堆和栈的区别 堆和栈的区别
介绍了堆栈的区别 很详细啊
比较局部变量、全局变量、堆、堆栈、静态和全局的区别和联系。
堆和栈的区别,详细介绍了堆和栈的区别并介绍了他们的用法和弊端
详细阐述了堆和栈的分配和使用原理。详见文档。
背照式和堆栈式摄像头的区别.docx