jvm深入研究文档--jvm分区以及职责

Java虚拟机(JVM)主要包括以下几个区域:

  1. 方法区(Method Area):这个区域存储已被加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。方法区是所有线程共享的。在Java 8之前,方法区是永久代(PermGen),从Java 8开始,永久代被元空间(Metaspace)替代。
  2. 堆区(Heap):这是Java内存中最大的一块区域,被所有线程共享,用于存放对象实例。JVM在JDK 1.7之前,使用的是分代收集(Generational Collection),包括新生代(Young Generation)和老年代(Old Generation)。在JDK 1.8之后,引入了Eden Space, Survivor Space和Old Generation的概念。
  3. 栈区(Stack):每个线程在创建时都会创建一个虚拟机栈,每一个方法执行的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
  4. 程序计数器(Program Counter Register):这个区域可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
  5. 本地方法栈(Native Method Stack):与虚拟机栈所发挥的作用非常相似,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

每个JVM分区在不同版本的Java中都可能有所变更,特别是在每次大版本更新时,例如Java 8、Java 11和Java 17中都进行了一些重要的变更。

方法区(Method Area)

方法区(Method Area)是Java虚拟机(JVM)中的一部分,它与Java堆一样,是各个线程共享的内存区域。在JVM启动时方法区被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。

虽然方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。因此,方法区可以看作是一块独立于Java堆的内存空间。

此外,方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误。

堆区(Heap)

堆区是Java虚拟机(JVM)中的主要部分,也是垃圾收集的主要区域。它主要用于存放对象实例以及大多数Java对象(如数组,用户定义的类等)。

在Java堆中,对象的内存分配和回收是主要发生的地方。当你创建一个新的对象实例时,JVM会在堆上为其分配内存。当对象不再被引用时,垃圾收集器会回收其占用的内存。

Java堆是所有线程共享的,因此它是一个并发区域,也就是说在任何时刻,多个线程可能同时对同一个对象进行操作。

Java堆是垃圾收集的主要区域,这意味着垃圾收集器可以自动回收不再被引用的对象占用的内存。这极大地减少了内存泄漏的可能性,因为JVM会自动管理内存,避免内存泄漏。

栈区(Stack)

栈区是Java虚拟机(JVM)中的另一个重要部分,与堆区不同的是,栈区只属于某一个特定的线程,是线程私有的。每个线程都会有一个对应的栈,它的生命周期与线程的生命周期一致。

栈区主要用于执行Java方法,每一个方法的执行都会创建一个栈帧,用于存储局部变量、操作数栈以及动态链接和方法出口等信息。当一个方法执行完成后,对应的栈帧就会被弹出,所占用的内存会被释放。

栈区的容量也是有限制的,如果程序中创建了大量的栈帧并且没有被及时回收,那么就会出现栈溢出的情况,这时候程序会抛出一个StackOverflowError错误。在Java中,可以通过-Xss参数来设置每个线程的栈大小。

程序计数器(Program Counter Register)

程序计数器(Program Counter Register)是计算机处理器中的一种特殊寄存器。它的主要功能是跟踪并存储当前正在执行的指令在内存中的地址。

在计算机的执行过程中,程序计数器会根据指令的执行顺序进行更新。每执行一条指令,程序计数器就会增加,指向下一条要执行的指令。当遇到跳转指令(如JMP,CALL等)时,程序计数器会直接跳转到指定的地址,改变当前执行顺序。

程序计数器通常被视为CPU的“眼睛”,它知道下一步应该执行哪条指令,是CPU执行流程的关键部分。

PC寄存器是线程私有的,每一个线程都有一个独立的PC寄存器。它的生命周期和线程保持一致,随着线程的创建和销毁而存在。

在JVM中,PC寄存器也是线程私有的,它用来存储JVM字节码指令的地址。JVM的字节码解释器通过改变PC寄存器的值来明确下一条要执行的字节码指令。

PC寄存器的设定是为了能够准确的记录各个线程正在执行的当前字节码指令地址,以便CPU在需要在线程之间切换时,可以快速准确地找到下一条要执行的指令。

本地方法栈(Native Method Stack)

本地方法栈(Native Method Stack)是Java虚拟机(JVM)中的一部分,与Java堆和栈区一起构成了Java运行时环境。

本地方法栈和Java栈一样,都是线程私有的,它用于支持native方法的执行。在Java中,如果一个方法使用了native修饰符,那么这个方法就会在本地方法栈中执行。

本地方法栈和Java栈的主要区别在于,本地方法栈中的方法可以执行操作系统级别的调用,例如访问文件系统、网络资源等。因此,本地方法栈具有更高的灵活性和更大的风险,因为它可以直接访问物理资源。

本地方法栈的管理和垃圾收集方式与Java堆和栈区不同,它的回收和内存管理需要更复杂的技术来实现。如果本地方法栈中的内存泄漏或者溢出,会对整个JVM的性能产生影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143331.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp:不同权限设置不同的tabBar

1、在pages.json里,将所有tabBar涉及的页面都加进来。 我这里使用username来动态显示tabBar。 jeecg用户显示:首页,订单,消息,发现,我的,一共5个tabBar。 admin用户显示:首页&…

如何修复wmvcore.dll缺失问题,wmvcore.dll下载修复方法分享

近年来,电脑使用的普及率越来越高,人们在日常生活中离不开电脑。然而,有时候我们可能会遇到一些问题,其中之一就是wmvcore.dll缺失的问题。wmvcore.dll是Windows平台上用于支持Windows Media Player的动态链接库文件,如…

Java内存泄漏知识(软引用、弱引用等)

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、相关知识3.1 内存…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

MongoDB基础详解

一、MongoDB概述 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一…

C. Card Game

题目:样例: 输入 4 4 -4 1 -3 5 4 1 -2 3 -4 3 -1 3 -5 1 -1输出 5 4 2 0 思路: 这里的题意就是, 当我们 i 取奇数的时候,可以获得该奇数 i 的值,并去掉当前卡牌。 当我们 i 取偶数的时候,去掉当…

Java基础简单整理

文章目录 Java语言具有以下特点:Java SE vs Java EEJVM vs JDK vs JRE为什么说 Java 语言编译与解释并存?Java 和 C 的区别?Java注释用法:Java标识符Java基本数据类型链接Java字符串类型链接基本类型和包装类型的区别?静态方法为…

云计算与大数据——Storm配置及运行WordCountTopology(保姆级教程!)

云计算与大数据——Storm配置及运行WordCountTopology(保姆级教程!) 前言 当今世界正处于云计算和大数据的快速发展阶段,而Storm作为一种高效、可靠的实时计算框架,受到了广泛的关注和应用。在这篇文章中&#xff0c…

【二】xxl-job 源码分析

xxl-job 源码分析 简介:阅读优秀的开源项目源码总是一件让人激动的事情,分布式调度平台xxl-job我们在生产环境也是有了很多的实践应用,一款产品使用久了对其实现原理多少有些了解了,今天也是抽出整块的时间来认真分析一下xxl-job的…

安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作

在玩机搞机过程中。有时候需要手动查看有些分区信息,或者备份分区的操作。那么今天以小米8为例解析下其中的操作步骤 机型:小米8 adb版本:https://developer.android.com/studio/releases/platform-tools 机型芯片:高通骁龙845…

三门问题-Swift测试

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Lets Make a Deal。问题名字来自该节目的主持人蒙提霍尔(Monty Hall)。 参赛者会看见三扇关闭了的门&#xf…

TikTok的媒体革命:新闻业如何适应短视频时代?

在数字时代,媒体行业一直在不断演变和创新,以适应观众的变化需求和技术的发展。而在这个进化的过程中,短视频应用TikTok已经崭露头角,成为了一个重要的信息传播平台。 这篇文章将深入探讨TikTok如何引领了媒体的一场革命&#xf…

某高校的毕设

最近通过某个平台接的单子,最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面:推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…

数据分析回头看2——重复值检查/元素替换/异常值筛选

0、前言: 这部分内容是对Pandas的回顾,同时也是对Pandas处理异常数据的一些技巧的总结,不一定全面,只是自己在数据处理当中遇到的问题进行的总结。 1、当数据中有重复行的时候需要检测重复行: 方法:使用p…

RabbitMQ工作模式——Routing路由模式

1.Routing路由模式 Routing生产者代码 public class Producer_Routing {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.…

Android T 禁止应用添加窗口的操作

序 什么情况下会出现我们需要禁止应用添加窗口的情况呢? 假如有一个应用的窗口,我们点开后是透明的或者会影响到系统的使用,那么我们就有必要对这个窗口操作一下 回顾我们在Android T WMS窗口相关流程中所讲的内容 禁止应用添加窗口的操作…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation (Paper reading) Konpat Preechakul, VISTEC, Thailand, CVPR22 Oral, Cited:117, Code, Paper 1. 前言 扩散概率模型 (DPM) 在图像生成方面取得了显着的质量,可与 GAN 相媲美。但是与…

引入嵌入和向量搜索时的三个错误

将非结构化数据表示为嵌入向量以及使用向量搜索进行基于嵌入的检索 (embedding-based retrieval - EBR) 比以往任何时候都更加流行。 嵌入到底是什么? Roy Keyes 在《嵌入的最短定义?》中对此进行了很好的解释。 嵌入是学习的转换,使数据更有…

React redux更新数据的诡异特征==》彻底掌握redux更新state机制的精髓

此文章是跟随我上一篇文章《Redux Toolkit中action派发但state值不更新的原因》写的。 本来一切都搞定了,此时我突发奇想: 如果让api服务端不发送包含x-pagination的header信息,web端会不会报错。因为按照web端 redux原有的逻辑:…