广告商网站建设,广州网站制作怎么做,网上做问卷调查赚钱哪些网站好,广东的设计公司目录
一、概述
二、程序计数器
三、虚拟机栈
四、本地方法栈
五、本地方法接口
六、堆
#xff08;一#xff09;概述
#xff08;二#xff09;堆空间细分
七、方法区 一、概述
不同的JVM对于内存的划分方式和管理机制存在部分差异#xff0c;后续针对HotSpot虚…目录
一、概述
二、程序计数器
三、虚拟机栈
四、本地方法栈
五、本地方法接口
六、堆
一概述
二堆空间细分
七、方法区 一、概述
不同的JVM对于内存的划分方式和管理机制存在部分差异后续针对HotSpot虚拟机进行介绍
JVM结构图如下此次我们学习的是Java虚拟机运行时数据区 在运行时数据区中总的来说分为五个部分。程序计数器本地方法栈和虚拟机栈是线程私有的方法区和堆内存是线程共享的。
二、程序计数器
程序计数器是运行时数据区中唯一不会出现OOM的区域没有垃圾回收。它是当前线程所执行的字节码的行号指示器
其作用是当一个线程发生上下文切换后回到原本的工作能恢复到正确的位置。每个线程有一个独立的程序计数器线程之间互不影响。
如果线程执行的Java方法则计数器记录正在执行的虚拟机字节码的指令的地址
如果正在执行的本地方法这个计数器值则应为空。undefined
三、虚拟机栈
Java虚拟机栈早期也叫Java栈每个线程创建时都会创建一个虚拟机栈内部保存一个个栈帧对应着一次次的Java方法调用
每个线程都有自己的栈栈中的数据以栈帧格式存储线程上正在执行的每个方法都各自对应一个栈帧栈帧是一个内存区块是一个数据集维系着方法执行过程中的各个数据信息先进后出后进先出一条活动的线程中一个时间点上只会有一个活动的栈帧。只有当前正在执行的方法的栈顶栈帧是有效的这个称为当前栈帧对应方法是当前方法对应类是当前类执行引擎运行的所有字节码指令只针对当前栈帧进行操作如果方法中调用了其他方法对应的新的栈帧会被创建出来放在顶端成为新的当前帧
由于篇幅太多单独写了一篇博文链接如下
JVM运行时数据区-虚拟机栈-CSDN博客文章浏览阅读2k次点赞62次收藏58次。学习JVM运行时数据区中的虚拟机栈栈只要是用来存放栈帧而栈帧又包括局部变量表操作数栈动态链接方法返回地址等信息。https://blog.csdn.net/m0_62946761/article/details/133854569?spm1001.2014.3001.5502
四、本地方法栈
Java虚拟机栈管理Java方法的调用而本地方法栈用于管理本地方法native方法的调用
本地方法栈也是线程私有的。它允许被实现成固定或者是可动态扩展的内存大小。其内存溢出情况和Java虚拟机栈相同
具体做法是 在本地方法栈 中登记native方法在执行引擎执行时加载到本地方法库
当某个线程调用一个本地方法时就会进入一个全新不受虚拟机限制的世界它和虚拟机拥有同样的权限。
并不是所有的JVM都支持本地方法因为Java虚拟机规范并没有明确要求本地方法栈的使用语言具体实现方式数据结构等。在Hotspot JVM中直接将本地方法栈和虚拟机栈合二为一。
五、本地方法接口
什么是本地方法
简单讲就是一个Java调用非Java代码的接口
为什么使用native method
早期Java刚出现的时候弱小孤独又无助而当时盛行的是c/c因此一个原因是java也想搞一些方法来和他们有接触另一个是当时c/c确实快可以提高Java效率。综上与Java环境外交互
例如与操作系统底层或硬件交换信息时的情况例如启动一个线程
六、堆
一概述
1、一个JVM实例只存在一个堆内存堆也是Java内存管理的核心区域
2、Java堆区在JVM启动的时候即被创建其空间大小也就确认了。堆内存的大小是可调节的可以通过参数调节堆的最大内存和初始内存等
3、Java虚拟机规范规定堆可以处于物理上不连续的内存空间中但在逻辑上它应该被视为连续的这里涉及虚拟内存的概念。
4、所有的线程共享Java堆在这里还可以划分线程私有的缓冲区TLAB
5、“几乎”所有的对象实例都在堆上分配内存为什么是“几乎”后面会讲到逃逸分析
6、数组和对象可能永远不会存储在栈上因为栈帧中保存引用引用指向对象或者数组在堆中的位置为什么是“可能”逃逸分析可能直接在栈上为对象分配空间而不用在堆上开辟空间了
7、方法结束后堆中的对象不会马上被移除仅仅在垃圾收集的时候才会被移除。堆是GC执行垃圾回收的重点区域
二堆空间细分
Java7及之前内存逻辑上分为
新生区 Eden区Survivor区 fromto 谁空谁是to养老区永久区
Java8及之后内存逻辑上分为
新生区 Eden区Survivor区 fromto 谁空谁是to养老区元空间 不同书籍叫法不一样看到这些名词知道是同个意思就可以了 新生区新生代年轻代养老区老年区老年代永久区永久代 由于篇幅太多单独写了一篇博文链接如下
JVM运行时数据区-堆-CSDN博客文章浏览阅读1.1k次点赞71次收藏66次。学习Java运行时数据区中的堆内存包括堆空间分代思想内存分配策略以及逃逸分析等。https://blog.csdn.net/m0_62946761/article/details/133881117?spm1001.2014.3001.5502
七、方法区
方法区是线程共享的其只是一种规范在jdk1.7之前为永久代。jdk1.8之后去除永久代改为元空间。 1、Java虚拟机规范中明确说明尽管所有的方法区在逻辑上是属于堆的一部分但是一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。对于HotSpot而言方法区还有一个别名叫Non-Heap非堆目的就是要和堆分开。所以方法区看作是一块独立于Java堆的内存空间
2、方法区和Java堆一样是各个线程共享的内存区域
3、方法区在JVM启动的时候被创建并且它的实际的物理内存空间和Java堆区一样都是可以不连续的。方法区的大小和堆空间一样可以选择固定大小或者可扩展
4、方法区的大小决定了系统可以保存多少个类如果定义太多类加载大量的第三方的Jar包Tomcat部署过多工程导致方法区溢出虚拟机同样会抛出内存溢出OOMPermGen space或者Metaspace
5、关闭JVM就会释放这个区域的内存
由于篇幅太多单独写了一篇博文链接如下
探究Java虚拟机运行时数据区了解方法区的奥秘-CSDN博客文章浏览阅读574次点赞66次收藏58次。介绍JVM运行时数据区中方法区的在hotspot中的演进和内部结构https://blog.csdn.net/m0_62946761/article/details/133901736?spm1001.2014.3001.5502