2012-03-01 24 views
10

好吧,所以我现在用Java开发了一年多了,并且正在努力深入研究这个语言和它的最佳实践实践。Java静态库原语,对象,方法和堆(存储器管理和最佳实践)

因此,这里是我知道的:

  • 的Java“按类型传递” - 这是原语路过复制和对象引用路过副本(引用指向自己的对象的堆)。

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

  • 发件人存储空间是存储类元数据的地方(用于反射)。

  • 堆有一个伊甸园空间,其中有新物体的地方,一个年轻的空间,其中存活了一个GC的物体被保留下来,还有一个放置了长寿命物体的Tenured空间。

因此,这里是我想什么,了解

  • 哪里静态和静态最后的基元和引用过的JVM能够使用单一实例?

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

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

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

我看了很多不同的解释关于这个(都不同),并会很喜欢,如果在Java语言中的经验丰富的老将可以提供一个很好的解释。提前致谢!

+1

这太问题,对静态类的一些信息http://stackoverflow.com/questions/3849634/ Java中的静态分配 - 堆栈和永久生成 – fasseg 2012-03-01 13:42:31

回答

5

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

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

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

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

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

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

将它们保持在最低限度。

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

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

顺便说一句:我一直在Java开发13年。

所以可以有静态字段的多个实例 - 在不改变JVM的每个实例

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

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

此外,对象可移动到彼尔姆根?

否。根据实施和版本的不同,必须在一个位置未定义的某些数据可以位于任何位置。

彼尔姆将被认为是堆的一部分?

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

杨根=伊甸+生存空间* 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

+0

感谢您的快速响应并对Young Heap空间进行澄清。因此,可以有多个静态字段实例 - 如果静态字段发生更改,JVM是否会更改每个实例(例如,static int instanceCount,其中instanceCount ++是在每个对象构造上执行的)?另外,对象可以移动到Perm Gen?彼尔姆将被认为是堆的一部分?对不起,有很多问题,这对我非常有帮助,我非常感谢你。如果您不介意只是使用这些解决方案更新您的答案,那么其他人会发现很容易实现。再次感谢。 – jjNford 2012-03-01 14:05:11

+0

我想让你知道更多关于这方面的信息 - 你能提供一些资料吗? (或者是JVM-Spec所涵盖的东西?) – quaylar 2012-03-01 14:26:24

+0

@quaylar它们通常不包含在规范中的实现细节。 – 2012-03-01 15:04:46