jjN*_*ord 10 java heap static jvm memory-management
好的,所以我已经用Java开发了一年多一点时间,并且正在努力深入学习语言及其最佳实践.
所以这就是我所知道的:
Java"按类型传递" - 即基元通过副本传递,对象引用通过副本传递(引用指向堆上的对象).
原始实例变量和引用存在于堆中的类对象中,而本地原语和引用存在于堆栈中(在它们各自的堆栈帧中).
Perm Gen.存储空间是存储类元数据的位置(用于反射).
Heap有一个Eden空间,其中有新对象,一个Young空间,其中存放了GC的幸存者和Tenured空间,其中放置了长寿命对象.
所以这就是我想要了解的内容:
静态和静态最终基元和引用在哪里,JVM能够使用单个实例?
静态和静态最终对象是否存储在堆中(我假设它们被移动到终身)?
根据应用程序中静态最终引用的数量,什么被认为是最佳实践?
创建更多静态最终引用会减少JVM中的堆空间量吗?
我已经阅读了很多不同的解释(都有所不同),并且如果Java语言中经验丰富的老手可以提供一个很好的解释,我会很高兴.提前致谢!
年轻的空间包括伊甸园空间和幸存者空间.
静态和静态最终基元和引用在哪里,JVM能够使用单个实例?
它没有定义,但在Sun/Oracle JVM中,静态字段存在于类字段的特殊对象中.每个类加载器有一个实例,因此静态字段可以有多个实例.
静态和静态最终对象是否存储在堆中(我假设它们被移动到终身)?
在Sun/Oracle Java 7中,它们是.他们可能在Perm Gen或任何其他地方.
根据应用程序中静态最终引用的数量,什么被认为是最佳实践?
将它们保持在最低限度.
创建更多静态最终引用会减少JVM中的堆空间量吗?
如果您可以将最终字段更改为静态最终字段,则可以节省一些空间(如果您有多个实例)但是,清晰度通常比性能更重要.(我会这样做是为了清晰)
顺便说一句:我用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
http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html
归档时间: |
|
查看次数: |
1750 次 |
最近记录: |