静态的分配在java-堆堆和永久代
-
27-09-2019 - |
题
我最近一直读了很多关于存分配方案,并且已有许多疑虑,因为我已经阅读从各种来源。我已经收集了我的理念,并且我要请求,通过所有的点和提出意见。我才知道,存分配是JVM具体,所以我必须说,我的问题是太阳具体。
- 课程(载入通过的类装入器)在一个特殊区域的堆:常驻代
- 所有的相关信息的一个类似的名称之类的对象阵列相关联的类,内部使用的对象通过JVM(如java/lang/象),并优化信息进入常驻代地区。
- 所有静态部件的变量保持在常驻代区域。
- 象去一个不同的堆:年轻一代
- 只有一个副本的每一个方法每类,该方法对静态或非静态的。该副本被放在常驻代地区。对于非静态的方法,所有参数和地方变量去栈-和只要有具体援引这一方法,我们得到了一个新的层叠的框架与它相关联。我不知道是哪里的地方变量的一种静态的方法被储存。他们是在堆常驻代?或者只是他们的参照储存在常驻代区域和实际的复制是在别的地方(在哪里?)
- 我也不确定那里不会返回型的方法得到保存。
- 如果对象(在年轻的一代)需要使用静态部件(在常驻代),他们给出一个参考的静态部件&&他们给予足够的存储空间以储存的回报类型的方法,等等。
谢谢你通过这个!
解决方案
第一,应该清楚你现在很少有人能确认这些问题的答案从第一手知识。很少有人曾在最近的热点Jvm或研究了它们的深度需要真正知道。这里大多数人(包括我自己)回答的基础上的东西他们已经看到了写在其他地方,或他们有什么推断出来的。从什么是写在这里或在各种文章以及网页,是根据其他来源可能或不可能明确。往往是简化的、不准确或者只是简单的错误。
如果你想要明确确认的答案,你真的需要下载们可根据最新的技术提供一些源码...和 做你自己的研究 通过阅读和理解的源码。问题是,或拖网捕捞作业通过随机网络文章不是一个声音学术研究的技术。
具有说...
1)课程(载入通过的类装入器)在一个特殊区域的堆:常驻代。
据我所知,是的。(更新:见下文。)
2)相关的所有信息的一个类似的名称之类的对象阵列相关联的类,内部使用的对象通过JVM(如java/lang/象),并优化信息进入常驻代地区。
或多或少是的。我不确定你是什么意思通过的一些东西。我猜是"内部使用的对象通过JVM(如java/lang/Object)"的意思JVM内部流的描述符。
3)所有静态部件的变量保持在常驻代区域。
变量本身是的。这些变量(如所有Java变量)将举行无论是原始价值或目的引用。然而,静态部件的变量是在一个框架,分配的永久代堆,对象/阵列提到这些变量可能分配 任何 堆。
4)对象去一个不同的堆:年轻一代
不一定。大象 可 被直接分配到终身产生。
5)只有一个副本的每一个方法每类,该方法对静态或非静态的。该副本被放在常驻代地区。
假设你指的是代码的方法,那么据我所知是的。它可以是更复杂一点。例如,代码可能存在码和/或机代码形式在不同的时间JVM的生活。
...对于非静态的方法,所有参数和地方变量去栈-和只要有具体援引这一方法,我们得到了一个新的层叠的框架与它相关联。
是的。
...我不知道是哪里的地方变量的一种静态的方法被储存。他们是在堆常驻代?或者只是他们的参照储存在常驻代区域和实际的复制是在别的地方(在哪里?)
没有。他们是存在的叠,就像本地的变量在非静态的方法。
6)我也不确定那里不会返回型的方法得到保存。
如果你的意思是 值 返回(无效)的方法打电话,然后它返回上堆或在机器登记册。如果是返回叠,这需要1个或两个词语,取决于返回的类型。
7)如果对象(在年轻的一代)nees使用静态部件(在常驻代),他们给出一个参考的静态部件&&他们给予足够的存储空间以储存的回报类型的方法,等等。
这是不准确的(或至少,你是不是表达自己清楚).
如果一些方法访问静态部件可变的,它得到的是无论是原始价值或者对象 参考.这可能是分配给(现有的)局部变量或参数,分配给(现有的)的静态或非静态部件,分配给(现有的)件的一个先前分配阵列,或只是使用和丢弃。
在任何情况下都不会 新的 存储需要,分配给保持一个参考或原始价值。
通常,一个词的记忆是所有需要保存一个对象或阵列基准,以及原始价值通常占据一个或两个词,根据硬件结构。
在任何情况下不会空间需要分配的呼叫者举行的一些对象列返回的方法。在Java、目的和阵总是返回,使用通过价值的语义...但是,值,这是返回的一个目或一组参考。
更新
作为Java8、永久代空间已被替换元空间.欲了解更多信息,请参阅这些资源: