jvm的内存模型

程序计数器:保存的是当前存成执行命令的地址,每次得到当前的地址后会执行下一条命令,每个线程都是独立的

  在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。

  由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

Java栈:里面存放的是一个个的栈帧,一个栈帧对应一个调用的方法,每当线程调用一个方法时会把对应的栈帧压入,用完就弹出

这个也是每个线程独立的

堆:是用来存放Java对象的,由垃圾回收器负责回收,是线程共享的,一个jvm只有一个堆

方法区:方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

  在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

  在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

     总结就是class文件一些信息,也包括运行时的一些常量和string,int的一些方法等等,这个现在也是通过垃圾回收器来回收

原文地址:https://www.cnblogs.com/lvcongblog/p/10260861.html