注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android开发之四十二Java中对静态对象的GC处理  

2015-09-07 20:36:34|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android开发之四十二Java中对静态对象的GC处理

遇到一个小问题,那就是静态变量的内存回收时机,经过查阅资料得出如下结论,供大家来争论:

1、静态变量如果是普通类型(或者说简单类型,如int,boolean等),这个的内存和生存周期你是无法控制。

2、如果是对象有两种情况:

A静态对象本身无法被回收

B 静态对象指向的对象可以被回收。

如下代码:

public class A{}

public class Test{

static int a = 1;

static A aa = new A();

void TestFun(){

    aa = null; 

}

}

a变量无法控制,aa本身无法回收,但是new A()生成的对象在aa=null 后,可以被回收。另外还有一个String对象,要注意用法:

对于直接用字符串字面量来赋值的String对象,JVM会将String字面量处理为String常量,并且保证同一个String常量不会被重复创建。String常量单独享有一块内存,而且一旦创建就不会回收。

要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象

JVM在加载类的时候,根据常量区中的字符串生成常量池,每个字符序列如"123"会生成一个实例放在常量池里,这个实例是不在堆里的,也不会被GC,这个实例的value属性从源码的构造函数看应该是用new创建数组置入123的,所以按我的理解此时value存放的字符数组地址是在堆里,如果有误的话欢迎大家指正。

http://www.cnblogs.com/ITtangtang/p/3976820.html

3、如果对象中有静态成员变量,不影响对象本身的GC回收,但是其静态成员变量参看上两条。

看啊看,好多不清楚或者说不会啊。

多说一些废话,在“Android开发之二十五Android StudioGradle DSL method found: 'android()'!”中提到的问题,又遇到了,一时没有反应过来:

Error:(3, 1) A problem occurred evaluating root project 'IrisFaceDemo'.

> Could not find method android() for arguments [build_8hhh36lduhz0ld3sium2zaxpc$_run_closure1@71720af0] on root project 'IrisFaceDemo'.

然后在把别人的build.gradle拷贝过来后,就发现好了,才想起来,没拷贝时多一个Android的选项节。去除就可以了。

无语。

  评论这张
 
阅读(217)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017