美文网首页
Android 面试之内存相关

Android 面试之内存相关

作者: 平头说人生 | 来源:发表于2018-05-19 13:03 被阅读1次

    内存分成两种,一种叫做栈内存,一种叫做堆内存

    栈是用于存放本地变量,内部临时变量以及有关上下文的内存区域。程序在调用函数时,操作系统会自动通过压栈和弹栈完成保存函数现场等操作,不需要程序员手动干预。

    栈是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的。能从栈获得的空间较小。如果申请的空间超过栈的剩余空间时,例如递归深度过深,将提示stackoverflow。

    栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。

    堆是用于存放除了栈里的东西之外所有其他东西的内存区域,当使用malloc和free时就是在操作堆中的内存。对于堆来说,释放工作由程序员控制,容易产生memory leak。

    对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,永远都不可能有一个内存块从栈中间弹出。

    Java中的new就是在申请堆内存,由java虚拟机自动垃圾回收器来管理

    从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的

    Stack:

    Stack-1 Stack-2

    Heap:

    Heap-1

    Example:

    java内存是分为堆,栈和方法区。

    堆中分配的是对象,也就是new出来的东西。

    栈中分配的是基本类型和自定义对象的引用。

    方法区存放的是类信息和static变量。

    比如说你在方法里有一个String a=new String("123"),就会先在堆里创建一个“123”的对象,然后再把这个对象的引用放到栈里面。

    再举个栗子(别的地方找的):

    对于一个方法

    Method-1 Explain-Method-1

    垃圾回收:

    自动垃圾回收机制就是寻找Java堆中的对象,并对对象进行分类判别,寻找出正在使用的对象和已经不会使用的对象,然后把那些不会使用的对象从堆上清除。

    自动垃圾回收机制就是要解决三个问题:

    引用计数法

    对于第一个问题,也就是判断是否还需要使用,最简单的方法就是通过目前是否有引用指向这个对象,如果没有就说明这个对象不会再被使用了,如果有就说明这个对象可能还会继续被使用,这种通过引用是否存在的方法就叫做引用计数法,但这个方法存在一个问题就是无法解决对象循环引用的问题,因此又出现了可达性分析的方法来判断对象是否可以被会回收。

    详情参考这篇文章:

    https://blog.csdn.net/qq496013218/article/details/76968464

    MAT使用参考这篇文章:

    www.lightskystreet.com/2015/09/01/mat_usage/

    相关文章

      网友评论

          本文标题:Android 面试之内存相关

          本文链接:https://www.haomeiwen.com/subject/tgnwdftx.html