草庐IT

Java Statics 原语、对象、方法和堆(内存管理和最佳实践)

coder 2024-03-04 原文

好的,我已经使用 Java 进行了一年多的开发,并且正在努力更深入地研究该语言及其最佳实践。

所以这是我所知道的:

  • Java“按类型传递”- 即基元按副本传递,对象引用按副本传递(引用指向它们在堆上的对象)。

  • 基元实例变量和引用存在于堆中的类对象中,本地基元和引用存在于栈中(在它们各自的栈帧中)。

  • Perm Gen. 内存空间是存储类元数据的地方(用于反射)。

  • Heap 有一个 Eden 空间,用于放置新对象,一个 Young 空间,用于保存在 GC 中幸存下来的对象,还有一个 Tenured 空间,用于放置长期存在的对象。

所以这是我想了解的:

  • JVM 能够使用单个实例的静态和静态最终原语和引用位于何处?

  • 静态和静态最终对象是否存储在堆中(我假设它们已移至永久对象)?

  • 就应用程序中静态最终引用的数量而言,什么是最佳实践?

  • 创建更多静态最终引用是否会减少 JVM 中的堆空间量?

我已经阅读了很多关于此的不同解释(各不相同),如果经验丰富的 Java 语言老手可以提供一个很好的解释,我会很高兴。提前致谢!

最佳答案

young空间包括eden空间和survivor空间。

Where do static and static final primitives and references live that the JVM is able to use a single instance?

它没有定义,但在 Sun/Oracle JVM 中,静态字段存在于类字段的特殊对象中。每个类加载器有一个实例,因此静态字段可以有多个实例。

Are static and static final objects stored in the Heap (I assume they are moved to tenured)?

在 Sun/Oracle Java 7 中它们是。它们可能在 Perm Gen 或其他任何地方。

What is considered the best practice in terms of the number of static final references in an application?

将它们保持在最低限度。

Will creating more static final references decrease the amount of Heap space in JVM?

如果您可以将 final 字段更改为静态 final 字段,这可以节省一些空间(如果您有多个实例)但是,清晰度通常比性能更重要。 (为了清楚起见,我会这样做)

顺便说一句:我已经使用 Java 进行了 13 年的开发。

So there can be multiple instances of static fields - does the JVM alter each instance

他们是独立的。每个类加载器都可以加载自己的类版本(代码不必相同)并且每个类加载器都有自己的静态字段(它们也不必相同)

if a static field is changed (ie. static int instanceCount where instanceCount++ is executed on each object construction)?

没有。

Also, Objects can be moved to Perm Gen?

没有。根据实现和版本的不同,必须有一些未在一个位置定义的数据可以在任何地方。

Is Perm Gen. considered to be part of the Heap?

它是old gen = tenured + perm gen的一部分。

Young gen = eden + survivor space * 2

最大堆大小限制了新生代和老年代的总数。 Perm gen 和 direct memory 有它们自己的限制。完成的内存映射文件遵循任何这些限制。

默认并行收集器和并发标记清除都是如此。

G1 收集器不会以相同的方式划分空间。


更多详细信息的链接

http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

Java heap terminology: young, old and permanent generations?

http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html

关于Java Statics 原语、对象、方法和堆(内存管理和最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9517215/

有关Java Statics 原语、对象、方法和堆(内存管理和最佳实践)的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

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

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

  6. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  7. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  8. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  9. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  10. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

随机推荐