我在Ubuntu上编写了一个无限循环的Java程序。文件名是array.java。请忽略编码标准。
import java.util.*;
class array
{
public static void main(String[] args)
{
while(true);
}
}
我编译并运行它:
hduser@pc4:~/codes/java$ javac array.java
hduser@pc4:~/codes/java$ java array
程序在循环中被吸入。然后我列出在系统上运行的进程有一个进程,其名称是带有PID 5439的java。我看到PID 5439的映射文件看起来像:
00400000-00401000 r-xp 00000000 08:01 9581391 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
00600000-00601000 r--p 00000000 08:01 9581391 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
00601000-00602000 rw-p 00001000 08:01 9581391 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
00bbc000-00bdd000 rw-p 00000000 00:00 0 [heap]
bfe00000-c1300000 rw-p 00000000 00:00 0
......
......
7f2d70ac2000-7f2d70ac3000 rw-p 00000000 00:00 0
7ffd7f474000-7ffd7f495000 rw-p 00000000 00:00 0 [stack]
7ffd7f540000-7ffd7f542000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
对于c或c ++,我们有一个由编译器为我们编写的代码本身创建的可执行文件名的进程,该进程有自己的文本,数据,堆,堆栈等部分。相应的变量适用于同一过程的不同部分。
但是在Java的情况下,这些部分正在运行不同的进程。这些部分完全不属于我们的书面代码,即使我们的书面代码也没有创建任何单独的过程。
我的问题是: 我的代码中的变量是否适应JVM本身的各个部分(文本,堆,堆栈等)?
答案 0 :(得分:0)
这取决于你对“JVM”的意思。
它可以表示运行Java类文件的程序。在这种情况下,答案是“否”。该程序有自己的堆栈。从它的角度来看,执行程序的部分是其数据空间中的数据结构。
另一方面,它可能意味着程序实现的虚拟机。虚拟机具有Java程序的每个线程的堆栈。