Heap
程序在运行时创建的所有类实或数组都放在同一个堆中。而一个 虚
拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个 * 程序
独占一个 实例,因而每个 * 程序都有它自己的堆空间,它们不会彼此
干扰。但是同一 * 程序的多个线程都共享着同一个堆空间,就得考虑多线程
访问对象(堆数据)的同步问题。 (这里可能出现的异常
*+&+)!$!!!4-)
Method area
在 虚拟机中,被装载的 的信息存储在 - ! 的内存中。当
虚拟机装载某个类型时,它使用类装载器定位相应的 文件,然后读入这
个 文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,
并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区
中。与 5一样,- ! 是多线程共享的,因此要考虑多线程访问
的同步问题。比如,假设同时两个线程都企图访问一个名为 . 的类,而这
个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一
个线程则只能等待。 (这里可能出现的异常 *+&+)!$!!!4
6!7)&)
Java stack
以帧为单位保存线程的运行状态。虚拟机只会直接对
执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时
候,就对当前状态作为一个帧保存到 * 中"压栈#;当一个方法调用返
回时,从 * 弹出一个帧"出栈#。栈的大小是有一定的限制,这个可能
出现 1+!89 问题。 下面的程序可以说明这个问题。
&,:1+!89;
&, "1!<=!#;
'&!!>9'&!"#?
! "#?
@@$%-! AA
*1+!B9$!!!
C
C
'&!;
&, "#;
)"D>#;
!&!?