zoukankan      html  css  js  c++  java
  • 内存管理

    内部类持有外部类的引用

    静态变量持有Context(Activity)引用时,当Activity结束后,该Activity不能释放内存,从而内存导致泄漏隐患
    可用getApplicationContext,返回的对象是Application的Context,而Application的生命周期和整个应用是一样的,
    应用启动Application被创建,整个应用退出Application销毁。所以Application的Context的生命周期就是整个应用的生命周期,
    恰好可以用来获取静态资源。利用Application的Context就不会导致内存泄漏了。

    单例模式使用的是静态类的方式,让该对象在整个应用的内存中保持一份该对象,从而减少对多次创建对象带来的资源浪费。
    同样的问题:在创建该单例的时候使用了生命周期端的Context对象的引用,最好用Application的Context

    给new出来的对象的内存分配以及内存回收(自动内存管理) 内存泄漏、内存溢出
    Java虚拟机实例负责运行一个Java程序。当启动一个Java程序时,一个虚拟机实例就诞生了。当程序结束,这个虚拟机实例也就消亡。
    Java程序的运行需要Java虚拟机、Java API和Java Class文件的配合
    Java虚拟机的主要任务是装载class文件并且执行其中的字节码。由下图可以看出,Java虚拟机包含一个类装载器(class loader),
    它可以从程序和API中装载class文件,Java API中只有程序执行时需要的类才会被装载,字节码由执行引擎来执行。


    内存分配:
    内存区分五大区域:
    1、方法区:(线程共享) 存储被JVM加载的类信息、常量、静态变量、及时编译器编译后的代码等数据;
    2、堆(heap):(所有线程共享)几乎所有对象的实例(new)都在这里分配内存,还可细分为新生代和老生代;
    3、虚拟机栈:(栈内存)(线程私有)Java方法执行的内存模型,每个方法每个方法在执行的同时都会创建一个栈帧(Stack Frame)
    用于存储局部变量表、操作数栈、动态链接、方法出口等信息,
    每个方法从刻调用直到执行完成,就对应于栈帧在虚拟机栈中的入栈和出栈的过程;
    4、本地方法栈:(线程私有)与Java虚拟机栈类似,只不过这是为虚拟机会用到的Native方法服务的,它也会抛出StackOverflowError和OutOfMemoryError异常。
    5、程序计数器:(线程私有)当前线程所执行的字节码的行号指示器,解释器工作时就是通过改变这个计数器的值来取得下一条需要执行的指令。


    GC (垃圾回收):需要回收的内存的判断,各种算法
    内存回收算法

    finish() system.exit(0) process.killProcess
    1. System.exit(0)是将你的整个虚拟机里的内容都停掉了,
    而finish()只是退出了activity,并没有退出应用,Application还是存在于内存中的,除非被系统回收。
    2. System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序
    System.exit(status)不管status为何值都会退出程序。和return 相比有以下不同点:return是回到上一层,而System.exit(status)是回到最上层
    3. system.exit(0)可以退出一个进程的内容。假如在一个activity中存在一个线程这样他是可以退出的。
    但是在这个activity如果启动一个服务,然后在服务中启动一个线程,那么他无法关闭服务和这个线程 。System.exit(0);关闭的是主线程,服务中另外启动的线程不在主线程之上,线程执行完之后自动关闭。
    4. system.exit(0)关闭的是虚拟机中内存,也就是kill掉当前进程。而之所以start的服务不会被杀死是因为启动一个服务是默认是启动一个进程来运行。
    所以有了 这么个结论 是不是把所有的activity或者服务都将他们设置成在同一个进程中是否能用 system.exit(0)完全退出系统?
    5. 如果是在第一个 Activity 调用 Process.killProcess 或 System.exit(0) 都会 kill 掉当前进程。但是如果不是在第一个 Activity 中调用,如 ActivityA 启动 ActivityB ,你在 ActivityB
    中调用Process.killProcess 或 System.exit(0) 当前进程确实也被 kill 掉了,但 app 会重新启动,又创建了一个新的进程。

  • 相关阅读:
    浙大《数据结构》第二章:线性结构
    浙大《数据结构》第一章:基本概念
    《软技能:代码之外的生存指南》读书笔记
    《高质量程序设计指南》读书笔记
    《大话无线通信》读书笔记
    使用Tensorflow训练神经网络模型
    掌握功率谱估计的方法
    网络安全宣传周活动
    ICMP数据包
    DNS数据包
  • 原文地址:https://www.cnblogs.com/tozhjj/p/7205935.html
Copyright © 2011-2022 走看看