浅谈java内存

来源:互联网 发布:html5引导动画源码 编辑:程序博客网 时间:2024/04/30 20:58

奋斗这个星期主要看了一些关于java内存的书籍,现在自己来发表一下见解,理清一下思路。

java内存主要分为两大类一个是栈内存,栈内存的特点是先进先出,所以在栈内存里面写代码的时候最好少使用递归,不然的话就有可能出现栈内存错误。栈内存里面主要存放的是基本八大数据类型。和数组对象的引用,也称为句柄。(我们在c里面也称为指针)。栈内存中的数据是可以共享的,下面我们举一段代码来说明一下。

int s=123;

int s1=123;

现在来分析一下,这段代码的执行原理。首先jvm会在栈内存里面创建一个int数据类型,然后到栈内存里面去寻找有没有值为123的地址。这里的地址也称作hashcode码。如果没有找到值为123的code码,就会给它在栈内存里面生成一块区域来存储这个值。接着JVM给它创建了一个引用s,这个S会指向值为123的code码。

我们再来分析第二段代码。当jvm去栈内存里面查找有没有值为123的地址时,发现已经有了这个地址。然后去给它创建一个引用s1,这个s1会指向值为123的code码。

s==s1;//true

也就是说他们共享一块内存区域,只不过是引用不同而已,系统不会再去创建另一块区域,这样做的最大好处就是可以尽量优化内存。不会占用不必要的资源。

接着我们再来说一下堆内存。堆内存里面主要存储的是用new出来的语句,堆内存的特点是,每当需要使用这个语句的时候,JVM才会主动去创建一块内存区域,下面我举例来说明一下。

String s="abc";

String s1=new String("abc");

第一个s创建的时候会到栈内存里面去分配一块区域,而第二个s1创建的时候因为是new出来的语句,会到堆内存里面创建一块内存区域。所以他们两个的code值是不相等的。

下面比较一下栈和堆的区别:

栈内存的存活期不是固定的,而且它的长度,和内存大小也是可变的不固定的。

而堆内存的存活期是固定的。它的长度,和内存大小都 需要在之前给规定好

比如 string[] st=new string{"张三","李四"};

他在程序需要使用st这个引用的时候,会自动的创建这个对象。并且去检测它的长度,为他划分内存块,等到代码执行完之后。系统就会在堆内存里面清除这个内存区域,而栈内存则不会马上消失,他会等到没有引用调用这个对象时,在系统空闲或者内存块满的时候,用java的内存处理机制去清理内存。

另外JVM里面的存储区域还有常量池和静态区。常量池就是所有常量存储的地方。也就方法名,函数,参数存储的地方。而静态区则是用static修饰的地方.

0 0
原创粉丝点击