Android性能优化—不建议使用枚举Enum

原创 2016年05月30日 16:22:55

最近优化App,由于项目中使用了Lib,而Lib代码中包含了大量的枚举类型,导致App占用内存过多发火。好吧,知道问题点,那就干掉,抛弃之~偷笑

问题是解决了,为啥会这样呢?疑问 先来看看Android官网的说明吧:

看见了吧,Android官网不建议咱们使用enums,说的也很清楚了,占用内存多(Enums often require more than twice as much memory as static constants.)。

Android中当你的App启动后系统会给App单独分配一块内存。App的DEX code、Heap以及运行时的内存分配都会在这块内存中。

生气举个栗子:

1.使用Int表示状态

public static final int VALUE1 =1;
public static final int VALUE1 =2;
public static final int VALUE1 =3;

2.使用Enums表示状态

public static enum Value{
  VALUE1,
  VALUE2,
  VALUE3
}

情形2中的DEX size增加是情形1中的13倍之多。这还只是DEX code的增加,同样,运行时的内存分配,一个enum值的声明会消耗至少20 bytes,这还不算其中的对象数组需要保持对enum值的引用。Why?使用javap反编译情形二中生成的class文件,去掉汇编代码后如下:

public final class VALUE extends java.lang.Enum{  
  public static final VALUE VALUE1;  
  public static final VALUE VALUE2;  
  public static final VALUE VALUE3;
  private static final VALUE[] values[];
  static{}
}

可以看到实际上enum类型继承java.lang.Enum,每个枚举项都会被声明成一个静态变量,并被赋值。VALUE value1 = VALUE.VALUE1则会引起对静态变量的引用。

因 此,当你的代码或包含的Lib中大量使用enums时,对于本身内存小的手机将是灾难性的。不可否认enums会使得代码更易读更安全,但是我们使用 Int也可以通过@IntDef 注解防止编译时Lint errors。当然如果你使用enums,proguard在一些情况下会优化你的代码使用Int代替。


相关文章推荐

【Android性能优化】避免使用Enum

The price of ENUMs 在StackOverFlow等问答社区常常出现关于在Android系统里面使用枚举类型的性能讨论,关于这一点,Android官方的Training课程里面有...

Android enum(枚举类型)使用详解

原始的接口定义常量: public interface IConstants { String MON = "Mon"; String TUE = "Tue"; Stri...

Android之使用枚举利弊及替代方案

Android之使用枚举利弊及替代方案文章链接知识点: 不使用枚举enum引起的类型不安全问题; 使用枚举enum的利弊; 利用@interface+@IntDef/@StringDef替代enum;...

枚举与常量类的区别

常量和枚举之间对比,有对比才有差距!

android开发Enum (枚举)的完美替代 —— @IntDef的使用

官方文档说明,安卓开发应避免使用Enum(枚举类),因为相比于静态常量Enum会花费两倍以上的内存。参  http://developer.android.com/training/articles/...

android开发之避免使用枚举

Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟和复杂。在Java中...

java 枚举——java(android)中枚举的运用和使用场景

如果作为一个java开发工程师还不了解或者还不能很好的运用枚举这个新特性的话,那你就得好好看一看枚举了。因为枚举在java5以后是个很好用的新特性。...

Android 性能:避免在Android上使用ENUM

Android 性能:避免在Android上使用ENUM# ENUM是什么,为什么使用它 `Enum`是Java中包含固定常量的数据类型。当需要使用预先定制的几个值,这几个值表示一些数据类,这时我们可...

android开发之避免使用枚举

Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟和复杂。在Java中...

Android代码替代枚举的正确之道

众所周知,在Android官方的性能优化相关课程中曾经提到使用枚举存在的性能问题,不建议在Android代码中使用枚举: Enums often require more than twic...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android性能优化—不建议使用枚举Enum
举报原因:
原因补充:

(最多只允许输入30个字)