首先请参阅 Android 开发人员指南中的以下引用:
Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.
Every class in Java (including anonymous inner classes) uses about 500 bytes of code. https://developer.android.com/training/articles/memory.html
尽管第一个要点中有不祥的警告,即“严格避免在 Android 上使用枚举”,但在该要点下所说的实际上并没有那么糟糕。常量是 32 位整数,而枚举可能是 64 位引用。那里给出的关于枚举昂贵两倍的数学是有道理的,而且看起来并不那么可怕。
我担心该警告可能部分基于第二个要点。
我想知道一个简单的枚举“类”声明是否带有 500 字节的开销? eacn 枚举类型呢?
类型可以是“扩展类”似乎很合理,因为它们可以采用自己的方法,而不仅仅是实例。将其表述为一个问题,如果我的枚举是 Color,并且我有 20 种 Color 枚举类型(例如红色、蓝色、绿色......),那么每种类型是 500 字节吗?
最佳答案
枚举在 Android 世界中是一场持续不断的无限辩论。
您可以在这里听到 Romain Guy 和 Chet Haase 的精彩演讲:http://www.parleys.com/play/5298f999e4b039ad2298c9e3/chapter57/about
根据该视频,Dalvik 中的对象有多大可以计算为:
overhead of Object + overhead of dlmalloc + data + align
请记住,枚举的每个值实际上都是枚举类的一个实例。
另一个需要牢记的重点是 dex 文件的大小。 例如,以下枚举将占用大约 1,112 个字节
public static enum Things {
THING_1,
THING_2;
};
或者您可以有两个静态 int,占用 128 个字节。
public static int THING_1 = 1;
public static int THING_2 = 2;
您的 dex 文件大小提高了 10 倍。
生成多少已编译的 dalvik 代码也有很大不同。 对于 Enum,编译器为您做了很多事情。第一次在运行时加载类时会进行静态类初始化。它在启动时增加了加类时间。
另一方面,枚举也带来了很多优点:可读性、可用性、类型安全的代码。 我只会在特定的极端情况下担心枚举。
特别是当我们认为使用 ProGuard 可以优化 Enum 将它们转换为普通的 int 常量时。
关于java - 枚举与静态常量,内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25305523/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www