作者:小小木的博客

www.cnblogs.com/wyc1994666/p/11795781.html

在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了

1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量(栈)等。

2.垃圾回收机制: java 语言的优势之一就是它的自动内存管理,主要回收运行时数据区域的堆内存里的数据

3.类加载机制: 虚拟机首先需要把编译完成的字节码文件通过类加载器来加载到运行时数据区域

一个段Java代码的生命周期都会少不了上图这几个步骤,也就是Java代码首先会被编译成字节码文件,之后被类加载器加载到运行时数据区域,以及运行,垃圾收集器回收对象等等。

但今天我想介绍第一个知识点《运行时数据区域》

1 运行时数据区

Java虚拟机定义了一系列逻辑数据区域,有些是随着虚拟机的启动而创建,虚拟机的关闭而销毁。还有一部分是随着线程生命周期创建销毁的。 我们有必要深入了解这块的内容,因为它将决定服务器性能,首先我们需要对整个运行时区域由整体的认识并且了解了每个区域的生命周期以及作用之后才能通过相应的调参来提升系统性能。除此之外还有助于快速定位虚拟机的相关Error. 逻辑上可以划出一下6个区域分别是​

1.1 PC寄存器

全名叫做 Program Counter Register 既然是叫做寄存器了那么肯定是需要存东西,那到底存的是什呢?

由于JVM同时可以处理多个线程所以就涉及到一些线程调度,当cpu暂停运行线程A把时间片让给线程B的时候我们需要保存线程A被暂停执行前的一些现场状态,需要记录当前执行到那一行字节码了,所以具备保存现场的功能。

每条线程都有自己的pc寄存器,在任意时刻虚拟机只会执行一个方法,如果执行的是方法不是native方法 pc寄存器则保存指向当前执行字节码的指令地址,如果执行的是native方法 pc寄存器会保存undefined。

1.2 java虚拟机栈

虚拟机栈也是每条线程私有的区域,里头存储栈帧(Frame),后面会重点介绍栈帧算是重点内容。方法的调用与返回基于栈帧来实现的。

1.3 虚拟机堆

在Java虚拟机中堆是所有线程都可以共享的内存区域,是存放所有类实例和数组对象的地方。在虚拟机启动就根据相关堆参数,创建堆,他也是垃圾收集器工作的主要区域。 堆内存里的对象不会被显式的回收,而是由垃圾回收器回收,为了配合垃圾收集器的特性我们可以把堆分为年轻代和老年代。

年轻代又分了Eden和survivor区,主要是为了配合垃圾回收算法而这么搞得。

1.4 方法区和运行时常量池

在Java虚拟机中 方法区是可提供各个线程共享的运行时内存区域,它存储了每一个类的结构信息,例如运行时常量池,字段和方法数据,构造函数和普通函数的字节码内容,一句话总结就是存储元数据地方

运行时常量池是class文件中每个类或接口常量池表的表示形式。它包括了若干不同的常量,比如 从编译期可知的数值字面量到运行时才能解析获得的方法或字段引用等等。

创建时机

每个运行时常量池都在Java虚拟机的方法区中分配,在加载类和接口到虚拟机之后创建对应的运行时常量池

1.5 本地方法栈

如果我们想再Java底层里调用别的语言代码的话就需要用到别的方法栈了,比如Java虚拟机的实现会用到传统的栈(C stack)来调用native方法,这个就是本地方法栈的应用,当然这个不是必须实现的,完全取决于虚拟机的实现。

2 栈帧:

首先看下栈帧在虚拟机内存中在什么位置,

栈帧是用来存储数据和部分过程结果的数据结构,同时也用来处理动态链接,方法返回,异常分派等工作。

栈帧的生命周期是跟方法一致的,随着方法的调用而创建,方法的结束或者异常而销毁。

每个栈帧都由局部变量表,操作数栈,动态链接组成的

2.1 局部变量表 (Local variable)

每个栈帧内部都包含一组称为局部变量表的列表,变量表的长度在编译期决定。另外关注公众号Java技术栈在后台回复JVM获取一份46页的JVM调优教程。

一个局部变量可以存储一个基本数据类型或一个对象引用(referance),returnAddress的数据。存储long或double需要两个局部变量才能存储。

当虚拟机要使用局部变量表里的数据时通过索引来定位,默认从0开始,由于long和double占用两个局部变量所以它的索引较特殊,取决于最小的那个值,比如某个long类型数据在索引n和n+1里存储了,那么它对应的索引值就是n.
虚拟机通过局部变量表来完成方法调用时的参数传递。如果是类方法,它的参数依次从0开始的位置传递到局部变量表,如果是实例方法则第0位置存储所在对象的引用(this),从1开始传递参数。

2.2 操作数栈 (Operating Stack)

操作数栈是属于栈帧中的栈,其实它的全名叫做当前栈帧的初操作数栈。栈,栈帧,操作数栈的关系需要梳理清楚:

  • 栈:是虚拟机运行时数据区的一个逻辑区域,里面存储了一个个栈帧。

  • 栈帧:栈帧代表一个方法的整个生命周期,里头存储了局部变量表,操作数栈,动态链接

  • 操作数栈: 刚刚创建时操作数栈是空的。虚拟机提供一些指令从局部变量表把一些常量或者变量值加载到操作数栈,也提供了从操作数栈取走数据的指令。
    调用方法时操作数栈用来准备调用方法参数以及接受方法的返回结果。

2.3 动态链接 (Dynamic Linking)。

动态链接是用来完成运行时绑定操作的。在栈帧中有一个指向常量池的当前类的一个引用。在class文件里一个方法要是调用其他方法或者方法其他成员变量,则需要通过符号引用来表示。

  • 动态链接的作用就是将符号引用转换为直接引用。

  • 类加载的过程中将要解析尚未被解析的符号引用,并且把对变量的访问转换为正确的偏移量。

JVM 运行时数据区详解,写得非常好!相关推荐

  1. java 线程栈大小配置,JVM运行时数据区详解-Stack栈(优化配置、代码样例)

    最近有段时间没有更新Netty的教程了,却发了一些其他的东西.可能有的朋友会问,难道这就完事了?不会的.两方面原因.第一.笔者也是需要工作的人,自然要完成好工作中的任务,这里面也有很多东西需要学习和研 ...

  2. [jvm]运行时数据区域详解

    了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...

  3. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  4. jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃 ...

  5. JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理 ...

  6. JVM运行时数据区分析

    #1.概述 整个JVM构成⾥⾯,由三部分组成:类加载器机制.运⾏时数据区.执⾏引擎. #2.JVM运行时数据区的规范 我们来聊聊这个规范怎么理解,目前运行数据区共分为了方法区.堆.虚拟机栈.本地方法栈 ...

  7. 20张图助你了解JVM运行时数据区,你还觉得枯燥吗?

    我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了.相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开"运行时数据区"的 ...

  8. JVM运行时数据区概览

    在学习JVM之前我们需要明确的是,我们所学习的是JVM的一个规范,在实际中有很多不同种类的虚拟机来实现这一种规范.其次JVM运行时数据区和JMM的区别我们要搞清楚,不能将JMM理解为JVM运行是数据区 ...

  9. JVM运行时数据区和各个区域的作用

    一.JVM主要分为5个核心区域(6个子区域),分别是: 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 *运行时常量池(属于"方法区"的一部分) 二.各个区域作用和描 ...

最新文章

  1. makefile的命令包定义及使用
  2. Centos 6.8安装配置KVM
  3. pat1038. Recover the Smallest Number (30)
  4. CCIE学习(34)—— EIGRP配置
  5. SPARK STREAMING之1:编程指南(翻译v1.4.1)
  6. 一个老程序员对自己当前编程技术处在哪个水平的反思
  7. phpcmsV9 如何开启“会员注册” - 教程篇
  8. 大学学python用记笔记吗_3年Python程序员平时学习笔记总结,对于学习Python非常有帮助!...
  9. unity anim 组件的使用
  10. exports module.exports export export default之间的关系
  11. 图书馆占座系统(SSM,JQUERY-EASYUI,MYSQL)
  12. go 实现一个简单的UUID生成器
  13. 在国企的日子(第三章上部 出差)
  14. 工厂中用计算机,计算机技术在工厂监控系统中的应用
  15. java单例模式调用_java单例模式使用及注意事项
  16. android 软解8k视频,一种基于CPU的8K超高清视频高速解码方法与流程
  17. 变频器的主电路 详解
  18. 编译filament
  19. 10款超级优雅的Go语言开发工具
  20. PS4怪物猎人世界服务器稳定吗,玩一把最近特火的《怪物猎人 世界》,差点把PS4主机给砸了!...

热门文章

  1. 在C++中侦测内嵌型别的存在(rev#2)
  2. 2015年浪潮面试题
  3. nginx(一)安装与命令总结
  4. XHTML 学前概述
  5. ZABBIX 企业级分布式监控系统 1 监控系统简介
  6. Column store index 列数据如何匹配成行数据?
  7. MySQL 5.6.11 GA 发布
  8. 语音信号的分帧加窗的matlab实现
  9. 深入理解Memcache原理
  10. Access ADO多连接时数据延迟无法同步无法及时更新的解决办法