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

10

好的,我现在已经使用Java开发了一年多,正在努力深入学习语言及其最佳实践。

以下是我所知道的:

  • Java采用“按类型传递”方式 - 基本数据类型按值传递,而对象引用按引用传递(引用指向堆上的对象)。

  • 基本数据类型实例变量和引用存储在堆中的它们的类对象中,而局部基本数据类型和引用存储在栈中(在各自的堆栈框架中)。

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

  • 堆有一个伊甸园空间,用于放置新对象,年轻空间用于保留经过GC生存的对象,而Tenured空间用于放置长期存在的对象。

以下是我想要理解的内容:

  • 静态和静态终态的基本数据类型和引用存储在JVM能够使用单个实例的哪里?

  • 静态和静态终态的对象是否存储在堆中(我假设它们被移动到Tenured空间)?

  • 在应用程序中使用多少个静态终态引用被认为是最佳实践?

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

我已经阅读了许多不同的解释(都不一样),希望Java语言的经验丰富的老手能够提供一个好的解释。谢谢!


1
这个 Stack Overflow 的问题包含了一些关于静态类的信息:https://dev59.com/UW865IYBdhLWcg3wYNZS - fasseg
1个回答

5

Young space包括eden space和survivor spaces。

静态和静态final原始类型和引用存储在JVM中的什么位置,以便能够使用单个实例?

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

静态和静态final对象是否存储在Heap(我假设它们被转移到tenured)中?

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

在应用程序中,静态final引用的数量被认为是最佳实践?

将它们保持到最小。

创建更多的静态final引用会减少JVM中的Heap空间吗?

如果您可以将final字段更改为static final字段,则可以节省一些空间(如果存在多个实例)。然而,清晰度通常比性能更重要。(我会因为清晰度而这样做)

顺带提一下:我已经在Java中开发了13年。

那么静态字段可以有多个实例 - JVM是否会更改每个实例?

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

如果更改了静态字段(例如,执行了static int instanceCount其中每个对象构造上都会执行instanceCount ++)?

不会。

还有,对象是否可以移动到Perm Gen中?

不。某些未在一个位置定义的数据可以根据实现和版本放置在任何地方。

Perm Gen是否被认为是Heap的一部分?

它是老年代的一部分= tenured + perm gen。

Young gen = eden + survivor space * 2

最大堆大小限制young gen & tenured总数。Perm gen和直接内存有它们自己的限制。内存映射文件不遵循这些限制。

这对于默认的并行收集器和并发标记扫描是正确的。

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


感谢您对Young Heap空间的快速回复和澄清。那么,静态字段可以有多个实例 - 如果更改了静态字段(例如,在每个对象构造上执行static int instanceCount where instanceCount ++),JVM是否会更改每个实例?此外,对象可以移动到Perm Gen吗? Perm Gen是否被认为是堆的一部分?很抱歉问了这么多问题,这对我非常有帮助,非常感谢您。如果您不介意,请更新您的答案以包含这些解决方案,以便其他人可以轻松找到它。再次感谢。 - jjNford
我对这方面更深入的阅读很感兴趣 - 你能提供一些资料吗?(或者这些东西是否已经被JVM规范所涵盖?) - quaylar
@quaylar 这些通常是规范未涵盖的实现细节。 - Peter Lawrey
@quaylar,还可以查看http://redstack.wordpress.com/2011/01/06/visualising-garbage-collection-in-the-jvm/。 - Zaki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接