Ⅰ static和非static修饰的变量哪个生命周期长
被static修饰的变量生命周期更长,因为静态变量的生命周期取决于类的生命周期。它在类加载的时候被分配空间。
Ⅱ android static 什么时候被回收
android中,定义的static变量属于全局变量,不会被GC回收,它们会一直占用内存。直到程序结束时才会被回收。
Android是用Java开发,其静态变量的生命周期遵守Java的设计。静态变量是在类被load的时候分配内存的,并且存在于方法区。当类被卸载的时候,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。
一、静态变量在类被加载的时候分配内存。
当启动一个app的时候,系统会创建一个进程,此进程会加载一个Dalvik VM的实例,然后代码就运行在DVM之上,类的加载和卸载,垃圾回收等事情都由DVM负责。也就是说在进程启动的时候,类被加载,静态变量被分配内存。
二、静态变量在类被卸载的时候销毁。
一般情况下,所有的类都是默认的ClassLoader加载的,只要ClassLoader存在,类就不会被卸载,而默认的ClassLoader生命周期是与进程一致的。
Ⅲ Android 性能优化的方法是什么请从开发者的角度回答!
常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码
之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解Android开发过程中
的代码优化。
1)静态变量引起内存泄露
在代码优化的过程中,我们需要对代码中的静态变量特别留意。静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收
才会被销毁。所以,一般情况下,静态变量从所在的类被使用开始就要一直占用着内存空间,直到程序退出。如果不注意,静态变量引用了占用大量内存的资源,造
成垃圾回收器无法对内存进行回收,就可能造成内存的浪费。
先来看一段代码,这段代码定义了一个Activity。
复制代码 代码如下:
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
mResources = this.getResources();
}
}
这段代码中有一个静态的Resources对象。代码片段mResources =
this.getResources()对Resources对象进行了初始化。这时Resources对象拥有了当前Activity对象的引
用,Activity又引用了整个页面中所有的对象。
如果当前的Activity被重新创建(比如横竖屏切换,默认情况下整个Activity会被重新创建),由于Resources引用了第一次创建
的Activity,就会导致第一次创建的Activity不能被垃圾回收器回收,从而导致第一次创建的Activity中的所有对象都不能被回收。这个
时候,一部分内存就浪费掉了。
经验分享:
在实际项目中,我们经常会把一些对象的引用加入到集合中,如果这个集合是静态的话,就需要特别注意了。当不需要某对象时,务必及时把它的引用从集合中清理掉。或者可以为集合提供一种更新策略,及时更新整个集合,这样可以保证集合的大小不超过某值,避免内存空间的浪费。
2)使用Application的Context
在Android中,Application
Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期。如果想保持一个长期生命的对象,并且这个对象需要一个
Context,就可以使用Application对象。可以通过调用Context.getApplicationContext()方法或者
Activity.getApplication()方法来获得Application对象。
依然拿上面的代码作为例子。可以将代码修改成下面的样子。
复制代码 代码如下:
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
// mResources = this.getResources();
mResources = this.getApplication().getResources();
}
}
在这里将this.getResources()修改为
this.getApplication().getResources()。修改以后,Resources对象拥有的是Application对象的引
用。如果Activity被重新创建,第一次创建的Activity就可以被回收了。
Ⅳ 全局变量和静态变量为什么在进程的整个生命周期都可以访问
刚学习C语言的时候,就知道全局变量和静态变量在程序运行的整个生命周期都可以访问,而局部变量只能在声明变量的函数中才可以访问,出了声明局部变量的函数,局部变量就被销毁了。也知道是因为局部变量是在进程的栈(stack)上分配的,而全局变量和静态变量是在某个段(segment)中的。可一直还是有点迷迷糊糊的样子,感觉不是很清楚。 最近在看Windows的内存管理和PE文件的格式,突然感觉这个问题变得清楚了很多。在Windows中,exe文件是直接映射到进程的地址空间的,而全局变量和静态变量是在生成的exe文件的某个段中,也就是说,当exe文件映射到进程的地址空间后,全局变量和静态变量就被映射到进程的地址空间,所以在程序运行的整个周期内,全局变量和静态变量都是可以访问的。而局部变量是在进程的栈上分配的,当函数执行完毕后,栈要恢复,所以局部变量只能在函数中使用。
Ⅳ 静态局部变量的生命周期
所有静态变量的生命周期都为程序的周期。
Ⅵ Android 编程中,使用静态变量有哪些缺点应该如何规范使用
静态变量有如下缺点:
1、 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放,即占用较多空间。
2、不能保存动态的数据。
3、静态变量容易导致多个窗体共同访问时出现混乱,并且在多个窗体类的多个实例之间传递的时候不具有相互独立性,访问频繁的时候比较节约资源 。
4、静态变量存放在内存的堆区,可以保存到整个程序结束,生命周期较长。
对于静态变量少用可以,不能到处都用。
Ⅶ 用static定义的变量的生命周期
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 当类首次被加载时static定义的变量被分配空间,程序结束后由系统释放.
如果在一个程序里过多的使用static定义的成员,确实很占内存,因为他的生命周期是整个程序,程序运行时无法被gc所回收,直到程序结束,释放内存.
Ⅷ 静态变量
eeprom是存储器,静态变量是的生命周期是程序执行期间,RAM数据断电后不能保存。
除非有断电保护,并执行代码把变量的值存储到非易失性存储器(EEPROM或FLASH中)
或者用电池供电的RAM中。
除非常量,和程序代码,变量一般存储在RAM中,
所以任何存储类型的变量,都跟实际的存储器不相干,数据存储除了程序执行期间的存储的数据外,程序代码和常量数据,都是烧写EEPROM或FLASH中的,跟程序的运行无关!!
存储器的分配是系统制作者安排的事情!和程序关系不大!!!