Heap(堆)
1、Java 程序在运行时创建的所有类实例或数组都放在同一个堆中。
2、一个 Java 程序独占一个 JVM 实例,互补干扰,一个 JVM 实例只存在一个堆空间,同一 Java 程序中的所有线程都共享这个堆,所以得考虑多线程访问对象(堆数据)的同步问题。
3、可能出现的异常为:java.lang.OutOfMemoryError:Java heap space
Method area(方法区)
1、Java 虚拟机中,被装载的 class 的信息存储在 Method area 的内存中。
2、当虚拟机装载某个类型时,它使用类装载器定位相应的 class 文件,然后读入这个 class 文件的内容,并把它传输到虚拟机中。然后虚拟机提取其中的类型信息,同时将它存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。
3、与 heap 一样,method area 也是多线程共享的,需要考虑多线程访问的同步问题。比如:两个线程都企图访问一个名为 HelloWorld 的类,而这个类还没有装载入虚拟机,那么这时应该只有一个线程去装载它,另一个线程只能等待。
4、可能出现的异常:java.lang.OutOfMemoryError:PermGen full(permanent generation full)
Java Stack(虚拟机栈)
1、Java stack 以帧为单位保存线程的运行状态。
2、虚拟机只会直接对 Java stack 执java项目基础步骤行两种操作;以帧为单位的压栈或出栈。每当线程调用一个方法时,就对当前状态作为一个帧保存到 Java stack 中(压栈);当一个方法返回时,从 Java stack 弹出一个帧(出栈)。
3、栈的大小是有一定的限制的,可能出现的问题为:StackOverFlow
Program counter(程序计数器)
1、每个运行中的 Java 程序,每一个线程都有它自己的 PC寄存器,在线程启动时创建的。(延伸:寄存器是 CPU 的组成部分,是一个容量有限的高速存储部件,它们可用来暂存指令、数据和地址)
2、PC寄存器的内容总是指向下一条将被执行指令的"地址",这里的"地址"可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
Native method stack(本地方法栈)
1、对于一个运行中的 Java 程序而言,它可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。
2、本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2193.html