读书笔记-内存初始化和清理

简介:                                     本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!        在Java开发中,对象创建、数据关系、垃圾回收始终是不变的话题,今天我们来简单说一下初始化和清理的问题。


                                    本文来自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字节码为本地机器代码。整个优化为:

 

/



目录
相关文章
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
314 0
|
存储 机器学习/深度学习 算法
内存学习(六):引导内存分配器(初始化)
内存学习(六):引导内存分配器(初始化)
331 0
Mac 内存清理,内存占用过大,瘦身操作
Mac 内存清理,内存占用过大,瘦身操作
438 0
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
317 0
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
285 4
|
弹性计算 运维 搜索推荐
幻兽帕鲁内存溢出怎么办,一键设置定时重启,修改虚拟内存,定时清理,轻松解决卡顿!再也不怕爆内存了!
幻兽帕鲁的内存溢出问题,玩久了确实会变卡。这里给出三个解决思路:第一种方法是定时进行内存清理(装个软件就可以),网上也有很多教程,我会把下载地址放在文章后面,大家可以去下载。第二种方法是调大虚拟内存,这个可以一键设置。第三种方法是定时重启游戏服务,这个也可以一键设置。这三种方法我下面都会教给大家,可以有效解决内存增长过快的问题,避免游戏卡顿甚至崩溃。
1311 3
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
存储 编译器 C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
176 2
|
编译器 Linux C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
171 1
SpringBoot 项目启动初始化一个Map对象到内存
SpringBoot 项目启动初始化一个Map对象到内存
385 1