Java Memory Model

来源:互联网 发布:java从网页抓取数据 编辑:程序博客网 时间:2024/06/10 05:06

在程序运行时,每运行一个Java程序会启动一个JVM(Java Virtual Machine)实例。JVM中存在很多线程,这些线程分为两种:daemon和non-daemon。例如,garbage collection线程就是daemon类型的。JVM会一直运行,直至所有non-daemon类型的线程结束。

注意:用户编写的程序,可以将其创建的线程标记为daemon类型的

       Java的内存模型

       JVM在运行程序时,会将内存划分成以下几个部分:method are(方法区)、heap(堆)、Java stacks(栈)、PC Register(程序计数器)和native method stacks(本地方法栈),如下图所示:

       Method Area:JVM从class文件中加载类,并将这些类的信息进行解析,将解析的信息保存到Method Area中。Method Area中还包含一个运行时常量池(runtime constant pool)。在字节码文件中(class文件对应的byte code)有常量池(Constant Pool Table),用于存储编译器产生的字面量和符号引用。每个字节码文件中的常量池在类被加载后,都会存储到方法区中。值得注意的是,运行时产生的新常量也可以被放入常量池中,比如 String 类中的 intern() 方法产生的常量。

       Heap: java类所有的实例(instance)都保存到heap中,即所有通过new产生的object都保存到heap上。

       Java stacks: java stacks保存stack frames,没调用一个方法会在stack上产生一个新的frame,frame保存了局部变量、返回地址等不同信息。注意java程序运行过程中产生的中间结果也保存在stack当中。

       Pc registers:程序计数器,存储着下一条指令的地址。

注意在这些内存区域当中有些是被所有线程所共享的,有些是线程私有的,其中Method area和heap为所有线程共享,其他三种每个线程都有自己独立的内存区域。

原创粉丝点击