Java静态基元,对象,方法和堆(内存管理和最佳实践)

时间:2012-03-01 13:37:29

标签: java memory-management static jvm heap

好的,所以我已经用Java开发了一年多一点时间,并且正在努力深入学习语言及其最佳实践。

所以这就是我所知道的:

  • Java“按类型传递” - 即基元通过复制传递,对象引用通过复制传递(引用指向堆上的对象)。

  • 原始实例变量和引用存在于堆中的类对象中,本地原语和引用存在于堆栈中(在各自的堆栈帧中)。

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

  • Heap有一个Eden空间,其中有新对象,一个Young空间,其中保存了GC中存活的对象,以及一个Tenured空间,其中放置了长寿命对象。

以下是我想要理解的内容

  • 静态和静态最终基元和引用在哪里,JVM能够使用单个实例?

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

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

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

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

1 个答案:

答案 0 :(得分:5)

年轻的空间包括伊甸园空间和幸存者空间。

  

静态和静态最终基元和引用在哪里,JVM能够使用单个实例?

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

  

静态和静态最终对象是否存储在堆中(我假设它们被移动到终身)?

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

  

根据应用程序中静态最终引用的数量,什么被认为是最佳实践?

将它们保持在最低限度。

  

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

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

BTW:我用Java开发了13年。

  

因此,可能存在多个静态字段实例 - JVM是否会更改每个实例

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

  

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

没有

  

此外,对象可以移动到Perm Gen?

没有。必须在一个位置定义的某些数据可以是任何位置,具体取决于实现和版本。

  

Perm Gen.被认为是堆的一部分吗?

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

年轻的gen = eden +幸存者空间* 2

最大堆大小限制了年轻人和年轻人。终身。彼尔姆和直接记忆有其自身的极限。完成的内存映射文件遵循以下任何限制。

默认的并行收集器和并发标记扫描都是如此。

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

相关问题