zoukankan      html  css  js  c++  java
  • Java内存分配

    Java内存五大区

    1. 栈:用于保存函数内部的局部变量,函数形参,一旦超出作用域,就删除
    2. 堆:凡是new出来的东西都是存放在堆里,也可以说可变对象(非基本数据类型)都是保存在这里面。
      1. 堆里面的东西,都有一个内存(16进制),栈中存放的就是这个16进制的内存值。
      2. 堆里面存放的东西都用默认值:
        1. 整数:默认值0
        2. 浮点数:默认0.0
        3. 布尔:默认false
        4. 字符:默认’u0000‘
        5. 引用:默认null  
    3. 本地方法栈:与操作系统有关
    4. 方法区:存储.class相关信息,包含方法的信息
    5. 寄存器:与CPU相关

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

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

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

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

    980264-20190322184853956-24584650.png

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

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

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

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

    调用对象,内存分配情况

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

    对象作为返回值

    static变量

    继承

  • 相关阅读:
    IBM X3650 M4服务器安装centos找不到硬盘的解决方法
    页面头部title、description、keywords标签的优化
    SEO优化之Title 和 Meta 标签
    WPA字典锦集
    PIN码计算锦集
    神经网络入门 第6章 识别手写字体
    神经网络入门 第5章 实现多层神经网络BP算法
    神经网络入门 第4章 神经网络可以模拟任意函数
    神经网络入门 第3章 S函数
    神经网络入门 第2章 编写第一个神经元
  • 原文地址:https://www.cnblogs.com/biggw/p/11756334.html
Copyright © 2011-2022 走看看