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方法重载和参数类型自动提升方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • JVM类加载,垃圾回收

    JVM类加载,垃圾回收

    这篇文章主要介绍了JVM的几种垃圾回收器,文中通过示例代码介绍的很详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Java中异常传播的实现

    Java中异常传播的实现

    在Java中,异常传播是一个重要的概念,本文主要介绍了Java中异常传播的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • java编程简单获取图片像素的方法

    java编程简单获取图片像素的方法

    这篇文章主要介绍了java编程简单获取图片像素的方法,涉及Java针对图片的读取与属性获取技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Java操作MongoDB数据库的示例代码

    Java操作MongoDB数据库的示例代码

    这篇文章主要介绍了Java操作MongoDB的示例代码,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • JavaSE中比较器、深拷贝浅拷贝举例详解

    JavaSE中比较器、深拷贝浅拷贝举例详解

    在Java中一切都可以视为对象,在Java中我们经常使用引用去操作对象,下面这篇文章主要给大家介绍了关于JavaSE中比较器、深拷贝浅拷贝的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • MyBatis处理大字段或BLOB、CLOB类型数据方式

    MyBatis处理大字段或BLOB、CLOB类型数据方式

    这篇文章主要介绍了MyBatis处理大字段或BLOB、CLOB类型数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • java中list.forEach()和list.stream().forEach()区别

    java中list.forEach()和list.stream().forEach()区别

    这篇文章主要介绍了java中list.forEach()和list.stream().forEach()区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java中 String和StringBuffer的区别实例详解

    java中 String和StringBuffer的区别实例详解

    这篇文章主要介绍了java中 String和StringBuffer的区别实例详解的相关资料,一个小的例子,来测试String和StringBuffer在时间和空间使用上的差别,需要的朋友可以参考下
    2017-04-04
  • Spring @Autowired注解超详细示例

    Spring @Autowired注解超详细示例

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入
    2022-08-08

最新评论