Java内存分配多种情况的用法解析

 更新时间:2019年11月06日 09:35:40   作者:何去何从gw  
这篇文章主要介绍了Java内存分配多种情况的用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Java内存分配多种情况的用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java内存五大区

栈:用于保存函数内部的局部变量,函数形参,一旦超出作用域,就删除

堆:凡是new出来的东西都是存放在堆里,也可以说可变对象(非基本数据类型)都是保存在这里面。

堆里面的东西,都有一个内存(16进制),栈中存放的就是这个16进制的内存值。

堆里面存放的东西都用默认值:

整数:默认值0

浮点数:默认0.0

布尔:默认false

字符:默认'\u0000‘

引用:默认null  

本地方法栈:与操作系统有关

方法区:存储.class相关信息,包含方法的信息

寄存器:与CPU相关

堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。

为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间,后面说明)。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。

引用数据类型因为大小不固定,所以会存在堆内存中,栈内存中存的是堆内存的地址,每次读取值时,先找到栈内存中的内存地址,在通过内存地址,找到在堆内存中的对应的对象。

栈内存和堆内存的关系图示

堆:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。分配的速度较慢,地址不连续,容易碎片化。此外,由程序员申请,同时也必须由程序员负责销毁,否则则导致内存泄露。

栈:由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。若分配失败,则提示栈溢出错误。注意,const局部变量也储存在栈区内,栈区向地址减小的方向增长。

内存泄漏:我们申请了一块内存空间,在使用完后,没有即使释放。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。

内存泄漏解决办法:良好的编码习惯,使用了内存分配的函数,一旦使用完毕,要记得要使用其相应的函数释放掉。malloc和delete搭配使用,new和free搭配使用

调用对象,内存分配情况

调用两个对象,内存分配情况

对象作为返回值

static变量

继承

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java 对象参数去空格方式代码实例

    java 对象参数去空格方式代码实例

    这篇文章主要介绍了java 对象参数去空格方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java实战案例之用户注册并发送邮件激活/发送邮件验证码

    java实战案例之用户注册并发送邮件激活/发送邮件验证码

    现在很多的网站都提供有用户注册功能,当我们注册成功之后就会收到封注册网站的邮件,邮件里包含了我们的注册的用户名和密码及激活账户的超链接等信息,这篇文章主要给大家介绍了关于java实战案例之用户注册并发送邮件激活/发送邮件验证码的相关资料,需要的朋友可以参考下
    2021-09-09
  • Java中的static关键字全面解析

    Java中的static关键字全面解析

    这篇文章主要介绍了Java中的static关键字全面解析的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 一文搞懂Spring AOP的五大通知类型

    一文搞懂Spring AOP的五大通知类型

    本文将详细为大家介绍Spring AOP的五种通知类型(前置通知、后置通知、返回通知、异常通知、环绕通知),感兴趣的朋友可以了解一下
    2022-06-06
  • Java中的OkHttpClient 工具类

    Java中的OkHttpClient 工具类

    这篇文章主要介绍了Java中的OkHttpClient工具类,具有很好的参考价值,希望杜大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • java方法重载示例

    java方法重载示例

    方法重载是以统一的方式处理不同数据类型的一种手段,这篇文章主要介绍了java方法重载示例,需要的朋友可以参考下
    2014-03-03
  • Mybatis中使用万能的Map传参实现

    Mybatis中使用万能的Map传参实现

    在编程中,有可能遇到我们的实体类或者数据库中表的字段或参数过多的情况,那这时候用Map传参是比较理想的选择,本文就详细的介绍一下如何使用,感兴趣的可以了解下
    2021-07-07
  • 在eclipse中使用SVN的方法(图文)

    在eclipse中使用SVN的方法(图文)

    这篇文章主要介绍了在eclipse中使用SVN的方法(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • idea perttier的使用和缩进改为4不成功问题及解决

    idea perttier的使用和缩进改为4不成功问题及解决

    这篇文章主要介绍了idea perttier的使用和缩进改为4不成功问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java简单工厂模式定义与用法实例分析

    Java简单工厂模式定义与用法实例分析

    这篇文章主要介绍了Java简单工厂模式定义与用法,结合实例形式分析了java简单工厂模式的相关定义与使用技巧,并给出了原理类图进行总结,需要的朋友可以参考下
    2019-07-07

最新评论