浅谈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修饰的地方.
- 浅谈java内存模型
- 浅谈java内存机制
- 浅谈Java--内存泄漏
- 浅谈Java内存泄露
- 浅谈java内存分配
- 浅谈java内存模型
- 浅谈java内存模型
- Java内存布局浅谈
- 浅谈java内存
- 浅谈java内存分析
- Java内存布局浅谈
- 浅谈java内存泄漏
- 浅谈java内存
- 浅谈java内存模型
- java内存管理浅谈
- 浅谈java内存堆栈
- 浅谈java内存泄漏
- 浅谈java内存泄露
- Photoshop入门教程(五):滤镜
- unity游戏开发之相关的注意事项及技巧
- bootstrap入门【组件之按钮组,下拉菜单,嵌套】
- PHP记录
- 二月末,三月初
- 浅谈java内存
- YCSB性能测试工具使用
- 在AndroidStudio中使用PagerSlidingTabStrip
- 在Code::Blocks中配置OpenGL
- C Language Study - 指针的形式 & 下标的形式
- 2014—2015年度总结
- use email as Username with MVC5 Microsoft.AspNet.Identity
- 关于工作量估算,你知道的和你不知道的一切
- System/Runtime/Calendor系统常用类