所以这就是我所知道的:
> Java“通过类型” – 这是通过复制和对象引用传递的副本(引用指向它们在堆上的对象)的原语.
>原始实例变量和引用生活在堆中的类对象中,并且本地基元和引用生活在堆栈(在它们各自的堆栈框架中).
> Perm创建内存空间是存储类元数据的地方(用于反射).
>堆有一个伊甸园的空间,新的物体是一个地方,一个年轻的空间,那些存在GC中的物体被保留下来,还有一个永恒的空间,放置着长寿命的物体.
所以这里是我想要理解的:
>静态和静态的最终原语和引用活动在哪里JVM能够使用单个实例?
>静态和静态的最终对象存储在堆中(我认为他们被移动到终身)?
>应用程序中静态最终引用数量的最佳做法是什么?
>创建更多静态最终引用将减少JVM中的堆空间量?
我已经阅读了很多不同的解释(全部不同),如果一个经验丰富的Java语言的老将可以提供一个很好的解释,那么会很喜欢.提前致谢!
解决方法
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中.他们可能在彼尔姆根或任何其他地方.
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?
如果您可以将最终的字段更改为静态的最终字段,那么可以节省一些空间(如果有多个实例).但是,清晰度通常比性能更重要. (为了清楚,我会做这个)
BTW:我在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?
它是旧的一代=终身烫发的一部分.
年轻人= 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