jvm运行时数据区

jvm运行时数据区,第1张

jvm运行时数据区 JVM运行时数据区

前言:java编程与C++编程在内存管理和垃圾回收上的区别就是进行C++编程时程序员需要去关心我们所创建的每一个对象的创建使用和销毁,比如c++中有构造函数和析构函数用于对象的管理;而java提供了java虚拟机帮助我们对内存分配和垃圾回收的管理,这样编程起来更加方便,无需在实现代码逻辑的同时还要去关心底层对象的状态。但是也带来了一些十分要命的缺点,就是我们大部分代码不会出现内存溢出和内存泄漏的毛病;但是一旦它出现了我们很难调试,这就是我们学习jvm内存布局的原因。

运行时数据区的划分

java程序编译成.class文件之后就给jvm运行了,jvm在运行文件的时候将内存区域进行划分每个区域各司其职。我们在学习这些区域的时候重点关注的应该是这些区域都用来做什么,具有什么特性(比如是否线程私有等等),会不会出现内存溢出。
jvm在的内存布局大致上可以分为程序计数器,栈,本地方法栈,堆,方法区等几个部分我们逐一探索。

程序计数器 什么是程序计数器

程序计数器是jvm运行时数据区中一块很小的区域,它的主要职责就是标注程序执行的下一条指令是什么,它是虚拟机字节码的导航。举个例子我们在java学习的时候通常后循环,分支,顺序三大结构,还有一些异常控制,或者说线程得到当前cpu资源了该怎么接着执行之前的程序呢,这些流程通通由程序计数器来控制程序执行的顺序。那么程序计数器中究竟记录的是什么样的数据呢,如果我们程序正在执行的java方法程序计数器记录的就是当前执行的虚拟机字节码的地址,如果程序正在执行的是一个本地方法那我们程序计数器记录的就是一个空值。

程序计数器的几个特性 程序计数器是线程私有的

java多线程的实现其实就是基于时间片轮转调度算法实现的,也就是说每个线程分配一定的时间片(这个时间是很少的)来使用cpu资源,可以理解为一秒之内一共有四个线程A,B,C,D我CPU很皮我在这个线程上执行几毫秒又跳到下一个,它执行的顺序可能是A ->B->C->D->A…。这样在一秒内我们就会感觉到这四个线程都在执行给我们一种四个线程是并发的假象。这就导致我们每个线程在调用结束时需要记住当前执行到哪里,好在下一次获取cpu资源的时候从这里开始接着执行。所以我们的每一个线程都需要配备一个程序计数器用于记住线程执行的状态。

栈 什么是虚拟机栈

栈可以将它理解为线程中方法执行的内存模型,当java程序调用一个方法时会同时生成一个栈帧(可以理解为是一种数据结构里面存储着关于方法执行的参数),栈帧中记录了局部变量表, *** 作数栈,动态连接和方法出口等信息,并且将这个栈帧数据存入到虚拟机栈中,当方法调用结束后,这个栈帧从栈中出栈。也就是说可以把方法的调用理解为是一个栈帧入栈和出栈。

接着我们需要深入探索一下什么是局部变量表,局部变量表中存储的是在编译器已经确定的基本数据类型,引用类型,ReturnAdress类型。这些类型的参数在内存中使用局部变量槽方式来表示对于Long和Double类型需要使用两个槽来存储,其他类型使用一个槽来表示,在编译结束后这些槽的数量就已经确定了。

栈的几个特点 栈是线程私有的

既然说栈是线程中方法调用的内存模型,那么每一个线程都配备有自己的栈,它随线程而生随线程而死。

本地方法栈

本地方法栈其实和栈的作用是一样的,区别就是本地方法栈用于为本地方法服务虚拟机栈用于服务java方法。

堆是学习java运行时数据区的重头戏。堆是虚拟机中最大的一块内存空间它是所有线程共有的,几乎所有的对象都存储在堆上。从垃圾回收的角度上来看堆可以分为新生代,永久代,eden区,幸存者等等,但是这只是一种设计风格并不是java虚拟机规范里面规定的。从对象分配的角度上来说,每个线程拥有堆上的一快区域作为缓冲区用于快速高效创建对象

堆得特点

在内存分配上堆有这样两个特点,堆上的空间在物理上可以是不连续的,但是在逻辑上是连续的,对于像数组一样的大数据例外。

堆是一个可以实现成一个可以扩展的数据结构,比如说我们可以使用-Xmm,-Xmx等虚拟机参数来调节

方法区

方法区是虚拟机中一块用于存储类型参数,静态变量,常量的一块地方,它是所有线程共有的一块内存区域。它所具有的特点和堆一样可以实现成扩展的并且物理上不连续逻辑上连续的数据结构,甚至可以不需要实现垃圾回收器。有人经常将它和永久代等价,其实永久代可以被认为是方法区的一个实现,HotSpot为了实现的方便将方法区划分为堆中的永久代。后续的jvm实现中废弃的永久代的概念并且将字符串常量池和静态变量划分到堆中,其他的部分重新划分出来到元空间中。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5704033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存