黑马程序员技术交流社区

标题: java内存分析 [打印本页]

作者: huangjiawei    时间: 2015-7-19 12:34
标题: java内存分析
内存的粗存放过程

栈中主要存放一些基本类型的变量( int, short, long, byte,float, double, boolean, char )和对象引用。 对象是不会放置在里面的。


数据共享

这个数据共享主要也是由于引用的是地址来决定的,举个例子:char str1="str1";char str2="str1";这时候再次声明Str2,同时指定两个不同的引用而相同的变量;这时候并不需要重新开辟另外一份内存,只需要两者都指向相同的地址就可以了。这样数据共享带来的就是内存上的节省。



存放的主要是动态生成的对象和数组。从这个存放的数据可以知道,这个堆里面存放的是,在程序运行的时候生成的一些数据。如:对象的定义和变量的定义。


定义和声明

这里需要对这两个动词进行一些说明。因为在平时过程中,我是对这两个概念比较模糊。一说就是定义声明了一个变量。但是事实上确实不一样的。声明就只是定义这个变量的名字,告诉编译器会有这么一个变量。而定义就不同了,定义就是在声明之后对变量进行初始化、设置一个初始值的过程。如:int i;int i=1;就是这个区别。


而在java变量的声明过程中,是不允许没有初始化变量的。


Data segment

这个包括静态域和常量池。


静态域

这个就是咱们存放在对象中的静态变量


常量池

这个主要是在编译完成后,存放在.class文件中(code segment)。包括一些基本的数据类型和相应的类的接口和声明。换言之就是在编译后,程序中经常使用的不会改变的。例如:基本数据类型(这个是

规定,肯定没法改)。接口的命名:这个你肯定不会闲到,改改这个来解闷的。


下面通过分析一个例子来说明java变量是怎么存放在内存中的


Code segment:arraylist list[]=new arraylist[2];

Arraylist[0]=2;arraylist[1]=3;arraylist[2]=4;

因为list[]是一个变量,这是一个声明我们放到栈中。

而后面每个数组实例化出来的变量,所以放到堆中。

而实实在在存在的变量的值都是常量,所以放在常量池中,也就是上图中的datasegment。


java内存分析.png (175.2 KB, 下载次数: 54)

java内存分析.png

作者: 新手ing    时间: 2015-7-19 17:10
赞一个、、、
作者: 梦想的种子    时间: 2015-7-19 17:16
我只是初学者
作者: javazhang    时间: 2015-7-19 17:43
我也只是初学者
作者: 白马程序猿    时间: 2015-7-19 20:12
还不懂,初学者,不知道ArrayList,留着以后再看吧
作者: 以梦为马123    时间: 2015-7-19 22:50
不错#在这里快速回复#
作者: icichacici    时间: 2015-7-19 22:58
赞一个。
作者: Mr冷夏    时间: 2015-7-19 23:09
不错总结的很好
作者: longbao    时间: 2015-7-19 23:16
好详细的说,,,
作者: 李金伦    时间: 2015-7-19 23:31
赞一个,看了有些收获




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2