int x = 10;
这里 10 直接分配给变量 x 还是 10 存储在其他地方然后分配给变量 x?
我在 stackoverlow 的一个答案中读到,Java 在 permgen 空间中存储文字。那么 10 是否先存储在 permgen 空间中,然后分配给变量 x?
int z = 2*x+y
Permgen 空间中也存储整数 litareal 2?
任何人都可以帮助我理解任何数据类型的文字存储在 Java 中的位置以及什么是 permgen 空间?
我试图理解但感到困惑。
你的代码必须存在于某个地方。它开始是一个源文件,
javac
变成一个 .class
文件,然后去..某处。 Java 足够灵活,您可以根据需要编写自己的加载程序。默认情况下,它们直接进入磁盘或 jar 文件,Java 虚拟机可以从那里加载它们。当 JVM 启动时,它 not 加载它们。它只加载您告诉 JVM 包含 main
方法的一个类。但是,JVM 在需要执行代码的任何时候总是扫描“嘿,运行此代码需要哪些类型”,如果发现任何当前未加载的类型,JVM 将首先加载该类型(仅保证一次) ,“解决”它(这主要涉及运行所有静态初始化器),然后继续。因此,通常如果你有几个类,它们将被加载几乎立即(只有你的主类被加载但执行它通常会导致你的大部分其他类很快被加载)。
当你写
int z = 10;
那个 10 在你的类文件中。你可以运行javap -v -c com.foo.YourCompileClass
来查看它。
生成的字节码表示“从常量池中加载这个值”。在运行时,java 是一个基于堆栈的处理器,因此没有“变量 z”这样的东西。堆栈上有一个位置或可能是本地帧槽,这取决于
javac
如何将您的 java 代码转换为字节码。
Permgen 在 15 年前就不再是一回事了。类文件现在基本上只存在于任何其他对象存在的同一个地方。这就是“10”直接居住的地方。
int z = 2 * x * y;
也一样 - 2 与 IMULT
指令所在的位置相同,它告诉 JVM 将堆栈中的最后两个东西相乘。毕竟,代码和数据一样都是“数据”。
从您的问题中可以清楚地看出,您可能对 JVM / 机器代码的工作方式没有很好的理解。也许问一个更具体的问题。你为什么要“关心”——你是否在尝试优化性能?这些是非常point的内部结构,您不需要关心它来编写好的代码。它不会对您可能衡量的性能产生影响。知道 exactly 所有这些是如何工作的对你作为 java 程序员的技能的影响或多或少为零。
现在,如果您要破解 JVM 本身,当然,知道这一点是件好事。那是只有 20 年经验的前辈才会做的程序员任务。如果您是初学者,这与以下对话相同:
xyz:嗨!我今年 16 岁,准备好上我的第一堂驾驶课了!
教练:太好了,这是方向盘,这是油门……
xyz:nonono 没关系!这是化油器的图片和来自维基百科的差速器轴照片,它建于 1962 年。我认为我们应该花 50 个小时来讨论这个差速器如何工作所涉及的所有物理和数学,因为只有这样我才会有任何好处在开车!
你知道那将是多么荒谬。同样的事情适用于这里。这些是您不需要了解的内部细节:它们不会“影响”任何东西——它们不是有漏洞的抽象。大量的幕后内容可能会以奇怪的方式出现,了解它们可能会很有用(尽管如此,作为编码新手,我怀疑这是一个很好的起点!)——但是这个?不,它不会让你成为更好的编码员。只是一个更好奇的。