草庐IT

java - 枚举与静态常量,内存占用

coder 2023-06-09 原文

首先请参阅 Android 开发人员指南中的以下引用:

尽管第一个要点中有不祥的警告,即“严格避免在 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
  • Object 的开销正好是 8 个字节。
  • dlmalloc 的开销可以是 4 - 8 个字节(大多数时候是 8 字节)
  • 数据的大小取决于数据(当然)
  • 最后,所有内容都必须是 8 字节对齐的(例如,如果您有 12 字节 对于一个对象,这将占用 16 个字节)

请记住,枚举的每个值实际上都是枚举类的一个实例。

另一个需要牢记的重点是 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/

有关java - 枚举与静态常量,内存占用的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 未初始化的常量 Psych::Syck (NameError) - 2

    在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到ruby​​gems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决

  3. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  7. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值: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

  9. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用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

随机推荐