JVM内存区域划分的原理是什么

jvm工作原理是什么?

JVM中的内存分为五个部分:

(1)方法区:存储加载的class字节码,通过该区域我们能寻址到类中的方法的入口。除此之外,方法区还包括运行时常量区和静态常量区。这个区域是所有线程共享的。

(2)堆:存储new出来的对象,垃圾回收器主要监控和回收的就是这块区域。在堆里面不断创建对象但是垃圾回收器不回收,就有可能造成OutOfMemoryError错误。这个区域也是线程共享的。

(3)虚拟机栈:存储所有被调用的java方法的上下文。在main方法里面调用test方法,则在虚拟机栈里面push进test方法上下文,调用完毕,则pop出test方法的上下文。倘若在main方法里面递归调用main方法,则虚拟机栈则会被消耗光资源,造成StackOverflowError错误。这个区域是线程隔离的,也就是说每个线程都有一个虚拟机栈。

(4)本地方法栈:本地方法栈与虚拟机栈类似,只不过本地方法栈中存储所有被调用的本地native方法的上下文。这个区域也是线程隔离的。

(5)程序计数器:存储着CPU下一条指令的地址,也就是说记录着现在程序执行到了哪里,执行到了那条语句,哪个指令。这个区域也是线程隔离的。

jvm同时启动两个进程会有两个堆嘛?

JVM同时启动两个进程会有两个堆。每个进程都会有自己的JVM实例,每个JVM实例都会有自己的堆。堆是JVM中的一个内存区域,用于存储运行时创建的对象。每个JVM实例都会有自己的堆,这是因为每个进程都会独立运行,互相之间不会共享内存。因此,两个JVM实例启动时,就会有两个独立的堆。这样可以保证进程之间的数据独立性,避免相互干扰。

是的,一般来说,每个进程是拥有自己独立的存储空间,那怕它们是同一个程序的多次执行。 但其实每个进程所占用的空间其实包含了代码段,数据段,堆栈段等。这些用途不同的存储空间是可以分别进行管理的,这也是段式内存管理的一个重要目标。

这直接导致了不同的进程间可以拥有不同的数据内容(比如写字板里不同的文本),但它们可以共用一个代码段,因为这一部分不会因为运算的数据不同而有任何变化。 其实在Windows里,dll动态链接库也是这个思想,一些函数功能和它的代码部分,甚至在程序执行时并不装入内存,只有当程序运行到需要调用他们时才会被动态的真正装入内存,同时只装入内存一次,如果再有其它程序也需要调用这个dll,那么它们会共享这部分代码段,从而能有效的提高内存的使用,减少浪费。

尤其是很多操作系统的底层调用,比如用于处理图形界面的显示等功能就可能被所有的图形界面程序用到,这时就可以大大提高内存的利用率。

方法区与永久区的区别?

方法区(Method Area)是jvm规范里面的运行时数据区的一个组成部分,jvm规范中的运行时数据区还包含了:pc寄存器、虚拟机栈、堆、方法区、运行时常量池、本地方法栈

永久区也就是永久带,又叫Perm区,只存在于hotspot jvm中,并且只存在于jdk7和之前的版本中,jdk8中已经彻底移除了永久带,jdk8中引入了一个新的内存区域叫metaspace

到此,以上就是小编对于谈谈jvm内存区域的划分的问题就介绍到这了,希望这3点解答对大家有用。

标题名称:JVM内存区域划分的原理是什么
网址分享:http://www.shufengxianlan.com/qtweb/news2/353252.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联