本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!

在Java开发中,对象创建、数据关系、垃圾回收始终是不变的话题,今天我们来简单说一下初始化和清理的问题。

我们知道对象未被初始化即被使用,是要报错的,所以一般情况下在类构造方法里去赋初值,确保初始化工作的完成。关于构造方法,我们可以使用不同参数类型和数目的构造器。

this关键字代替了对象,以调用方法,在内部类里面十分有用,可以避免建造多余对象;另外一方面在一个构造器内调用另一个,可以避免重复代码。static方法内部不能调用非静态方法和变量,不能使用this关键字。

在Java中有一个finalize方法,在对象内部都可以重载,一旦垃圾回收器准备好释放对象所占用的内存空间,首先调用此方法,然后才进行清理工作;但对象并不一定会被回收,所以finalize即使被执行,也是没用的。但是程序执行结束,退出,那么资源才会全部交还它们操作系统。它不是进行清理的合适场所,最好手动进行清理工作。

一般情况下,Java工作时,一面回收空间,一面使堆中的对象紧凑排列,这样“堆指针”就可以很容易移动到更靠近传送带的开始处,被使用。Java采用一种自适应的垃圾回收技术。一种名为停止-复制(stop-and-copy),先暂停程序的运行(非后台运行),然后把所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当然在搬运过程中,所有指向它的引用都被修正。这种回收呢,效率会比较低,因为两个堆要来回倒腾。某些虚拟机对此问题的处理方式是:按需从堆中分配几块较大的内存,动作发生在这些大块内存之间。

另外,如果程序进入稳定状态后,垃圾产生会比较少,上述回收方法就比较浪费,Java虚拟机会进行检查,要是没有新垃圾产生,就转换到另一种工作模式(自适应),标记-清扫(mark-and-sweep),思路是:从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,对设标记,全部设完,清理工作开始。在清理过程中,没有标记的对象将被释放。如果所有对象都很稳定,垃圾回收器的效率降低的话,就村切换到“标记-清扫”方式;同时如果堆空间出现很多碎片 ,就会切换回“停止-复制”方式,这样自适应的回收机制堪称完美!

目前,Java虚拟机中有许多附加技术用以提升速度,尤其是与加载器操作有关,被称为“JIT”-Just In Time,把程序全部或部分翻译成本地机器码,程序运行速度因此得以提升。Android最新版也采用ADT,Ahead of Time,安装时即编译,借以来提升运行速度,我们很是期待。

在类中初始化顺序,先执行static{}且仅一次,再执行静态变量、全局变量,然后是默认构造器

​以下是摘抄:

Android4.4提出新概念,Android Runtime,默认仍是Dalivk,但将代替它。

​ART使用AOT进行处理(Ahead-Of-Time),并会在应用程序安装完毕时,进行预先的基础性编译作业,这就减去了JIT运行时的机器码转化时间,应用的启动和执行都会变得更加快速。

ART优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。

ART缺点:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。
总的来说ART的功效就是“空间换时间”。

ART相关源代码下载地址:(https://android.googlesource.com/platform/art/+archive/kitkat-release.tar.gz)

从源代码文件目录名称可以很清楚的了解各文件夹中相关文件的功能,我们最关心的主要有compiler、dex2oat、runtime三个文件夹:

compiler:主要负责Dalvik字节码到本地代码的转换,编译为libart-compiler.so

dex2oat :完成DEX文件到ELF文件转换。编译为dex2oat

runtime :Android ART运行时源代码,编译为libart.so

在应用安装时,installd通过dex2oat优化APK安装包classes.dex的Dalvik字节码为本地机器代码。整个优化为:

转载于:https://www.cnblogs.com/hehehaha/p/6147370.html

读书笔记-内存初始化和清理相关推荐

  1. 深入理解JVM虚拟机读书笔记——内存模型与线程

    注:本文参考自周志明老师的著作<深入理解Java虚拟机(第3版)>,相关电子书可以关注WX公众号,回复 001 获取. 1. Java内存模型 JMM概述: Java 内存模型指的是 JM ...

  2. 深入理解JVM读书笔记--内存管理

    2019独角兽企业重金招聘Python工程师标准>>> 一. Java的运行时数据区域 (1)程序计数器(线程私有):是一块较小的内存空间,它的作用是当前线程所执行字节码的行号指示器 ...

  3. 《现代操作系统》第3章读书笔记--内存管理(未完成)

    写在前面:本文仅供个人学习使用,如有侵权,请联系删除.文章中所用图片绝大多数来源于<现代操作系统(第4版)>,请读者支持原版. 内存(RAM) 是计算机中一种需要认真管理的重要资源.一个事 ...

  4. 《Java编程思想》读书笔记——构造器初始化顺序

    Java尽力保证:所有变量在使用前都能得到恰当的初始化.对于局部变量,Java以编译时错误的形式来贯彻这种保证. public static void main(String[] args) {int ...

  5. 读书笔记之类初始化和实例化本质

    java面试题网站:www.javaoffers.com # 类的加载,验证,准备,解析,这四个步骤中除了类加载器可以自定义外,其余都有jvm虚拟机控制. 类初始化时才开始执行我们程序中代码(或字节码 ...

  6. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)

    接上一篇.net框架读书笔记---CLR内存管理\垃圾收集(二),主要学习了终止化对象(实现了Finalize方法的对象),了解了终止化对象的弊端,学习了通过实现IDisposable接口,通过Dis ...

  7. Java 内存分配——Thinking in Java 4th 读书笔记

    做开发多年,一直忙于项目,从没好好的整理知识,从现在开始,尽量每周多抽时间整理知识,分享在博客,在接下来的博客中,我将为大家分享我读<Java编程思想4th>英文版读书笔记,一来便于知识的 ...

  8. 《Linux内核设计与实现》读书笔记(十二)- 内存管理

    内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决). 所有内核的内存管理必须要简洁而且高效. 主要内容: 内存的管理单元 获取内存的方法 ...

  9. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)

    弱引用 当一个根指向一个对象时,该对象不可能被垃圾收集器收集,在这种情况下,通常说存在一个该对象的强引用(strong reference).垃圾收集器还支持弱引用(weak reference)的概 ...

最新文章

  1. 深度学习和几何(演讲提要)
  2. matlab dsearchn,cKDTree与dsearchn
  3. 模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承
  4. tf.nn.conv2d() / tf.nn.depthwise_conv2d() 和 Batchsize效益
  5. PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较
  6. 键盘改键软件_一秒五键,一键三招,万种光污染,杜伽K310樱桃轴机械键盘感受...
  7. MySQL运维常用系统命令
  8. vue,html2canvas,网页div保存为图片
  9. 基于Node.js + WebSocket 的简易聊天室
  10. iPhone 12 Pro火爆程度超预期 苹果紧急向关键组件厂商加单
  11. arm中断保护和恢复_ARM中断处理过程
  12. c语言股票最大收益_应用ROC函数计算多支股票收益率
  13. 解读神经网络十大误解,再也不会弄错它的工作原理
  14. 7种常用函数图象及4种函数图象变换规则
  15. python彩蛋_Python的2个彩蛋
  16. 这几点技巧可提高 Kindle 使用体验
  17. 全球与中国便携式USB摄像机市场现状及未来发展趋势(2022)
  18. crh寄存器_寄存器简写
  19. lol人物模型提取(一)
  20. vue项目中使用bimface

热门文章

  1. bootstrap java_查看tomcat启动文件都干点啥---Bootstrap.java
  2. Java线程池中submit()和execute()方法有什么区别
  3. C++_泛型编程与标准库(八)
  4. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国
  5. Swift的Guard语句
  6. 从数据类型 nvarchar 转换为 bigint 时出错_JavaScript数据类型的一些细节点
  7. 冷热分离和直接使用大数据库_中台有“数”:大数据技术为苏宁818保驾护航
  8. java ftp client_JAVA FTP CLIENT
  9. MySQL数据库-操作基础
  10. c语言用链表的方式实现多项式加减,如何实现C语言单链表多项式相加的操作