JVM中的内存类型(数据区域)

版权声明:访问者可将本人原创或翻译内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本人的合法权利。除此以外,将本人原创或翻译内容用于其他用途时,须征得本人的同意。 https://blog.csdn.net/m0_38063172/article/details/83586617

Java一词狭义上指的是Java编程语言,广义上来说还包括Java平台。Java虚拟机作为一个平台来运行由Java源码编译成的.class文件,Java的跨平台性也是通过JVM来实现的。

JVM之所以称之为虚拟机,就是因为JVM就像是运行在底层物理机上面的一台虚拟机,它的各个部分互相配合,完成了一个Java应用程序的运行。本文就简单地对JVM运行过程中的各个数据区域做一个介绍。

JVM这个词语狭义上指的是一种规范,不特指某一种具体的实现,最常见的实现是Oracle的HotSpot,这里是一份所有JVM实现的列表。但是我们说JVM时也可以指HotSpot,本文是在参考Java SE 8的JVM说明和HotSpot的文档的基础上写的,哪些属于JVM说明,哪些属于HotSpot实现,我会在文中做出说明。

下图来自Oracle官网上一篇名为Java Garbage Collection Basics的文章。但是也有点问题,先贴上来,我会进行一些说明。
在这里插入图片描述Runtime Data Areas从左往右看,
第一个是Method Area,这是JVM中的叫法,在HotSpot的Java SE 7版本中应该叫Permanent Generation,在HotSpot的Java SE 8版本中,取消了Permanent Generation,取而代之的是Metaspace,每个JVM进程中只有一个Method Area。Java应用程序运行时类加载器会寻找需要的类,找到后把.class文件加载到Method Area里面,.class文件包含jvm指令(也就是字节码)和一个常量池表(constant_pool table)以及其他辅助信息。我们写代码时定义了类,里面定义了这个类可以做的事情,.java文件被编译为.class文件后被加载到Method Area里面,Method Area里面的东西可以告诉JVM,它应该做什么以及怎么做。
每个JVM进程只有一块HeapHeap里面放着对象,在类被加载到Method Area里面后,会在Heap中创建相应的Class类型的对象,对于某一个类,不管在Heap中它有多少个对象,Heap中它对应的Class类型的对象始终都只有一个。Heap中的对象中只包含它的类中的域,类中的方法还是在Method Area中,有一个int域和一个方法的类的对象在Heap中占的内存大小和有一个int域十个方法的类的对象在Heap中占的内存大小一样。
Java Thread指的是Java应用程序运行时Java中的方法运行的栈,在JVM说明中叫Java Virtual Machine Stacks,每个线程有一个私有栈,栈中保存着Java方法的本地变量和中间结果,也承担着方法调用和方法返回的任务,通过栈帧(Frame)的压入和弹出实现。
每个Java线程有自己的Program Counter Register,在任意时刻,一个Java线程总是在执行某个方法的code,如果这个方法是Java中的(还有计算机平台中的本地方法),那么pc register中就是执行的方法对应的Java执行的地址,如果那个方法是本地方法,pc register中的值就是未定义的。
Native Internal Threads指的是本地方法栈,有些Java应用程序要用到本地的一些方法,例如在控制台的打印和输入,本地方法的运行单独在本地方法栈里面。

猜你喜欢

转载自blog.csdn.net/m0_38063172/article/details/83586617