扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇文章给大家分享的是有关Java中内存分配的情况有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
成都创新互联公司技术团队10余年来致力于为客户提供成都做网站、网站建设、高端网站设计、全网整合营销推广、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了上千余家网站,包括各类中小企业、企事单位、高校等机构单位。
Java内存五大区
栈:用于保存函数内部的局部变量,函数形参,一旦超出作用域,就删除
堆:凡是new出来的东西都是存放在堆里,也可以说可变对象(非基本数据类型)都是保存在这里面。
堆里面的东西,都有一个内存(16进制),栈中存放的就是这个16进制的内存值。
堆里面存放的东西都用默认值:
整数:默认值0
浮点数:默认0.0
布尔:默认false
字符:默认'\u0000‘
引用:默认null
本地方法栈:与操作系统有关
方法区:存储.class相关信息,包含方法的信息
寄存器:与CPU相关
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。
为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间,后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。
引用数据类型因为大小不固定,所以会存在堆内存中,栈内存中存的是堆内存的地址,每次读取值时,先找到栈内存中的内存地址,在通过内存地址,找到在堆内存中的对应的对象。
栈内存和堆内存的关系图示
堆:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。分配的速度较慢,地址不连续,容易碎片化。此外,由程序员申请,同时也必须由程序员负责销毁,否则则导致内存泄露。
栈:由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。若分配失败,则提示栈溢出错误。注意,const局部变量也储存在栈区内,栈区向地址减小的方向增长。
内存泄漏:我们申请了一块内存空间,在使用完后,没有即使释放。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
内存泄漏解决办法:良好的编码习惯,使用了内存分配的函数,一旦使用完毕,要记得要使用其相应的函数释放掉。malloc和delete搭配使用,new和free搭配使用
调用对象,内存分配情况
调用两个对象,内存分配情况
对象作为返回值
static变量
继承
以上就是Java中内存分配的情况有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流