jvm相关,jvm内存模型,java程序运行流程及jvm各个分区的作用、对象的组成(针对hotspot虚拟机)--学习笔记

news2024/9/21 2:35:31

java程序运行时的运行模型

在这里插入图片描述
在jdk1.8之前的元空间,称为永久代并将元空间挪到了堆直接使用本地内存,不再占用堆空间

jvm内存结构划分

在这里插入图片描述
堆(方法区)和元空间是线程共有的,其他部分是线程私有的
每创建一个线程都会创建一个虚拟机栈

程序计数器 的特点及作用

1、程序计数器是一块较小的内存空间,几乎可以忽略;
2、是当前线程所执行的字节码的行号指示器
3、Java 多线程执行时,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响
4、该区域是“线程私有”的内存,每个线程独立存储
5、该区域不存在 OutOfMemoryError;
6、无GC 回收;
线程执行结束随之销毁

虚拟机栈(也称作线程栈,方法栈)的特点及作用

虚拟机栈包含

1.局部变量表(基本类型、引用类型)
2.操作数栈(压栈和出栈)
3.动态链接(调用其他方法时其他方法的底村地址)
4.返回地址(方法执行的return的结果)

虚拟机栈特点

1、线程私有;
2、方法执行会创建栈帧,存储局部变量表等信息(先进后出)
3、方法执行入虚拟机栈,方法执行完出虚拟机栈;
4、栈深度大于虚拟机所允许 StackOverflowError(比如死递归时);
5、栈需扩展而无法申请空间 OutOfMemoryError (比较少见) ; hotspot 虚拟机没有
6、栈里面运行方法,存放方法的局部变量名,变量名所指向的值 (常量值、对象值等) 都存放到堆上的
7、栈一般都不设置大小,栈所占的空间其实很小,可以通过-Xss1M 进行设置,如果不设置默认为 1M;(如果没有递归或者递归层次很小时也可以考虑设置小一点,这样每个线程占用的栈就会少一些,可以启动更多的线程
8、随线程而生,随线程而销毁
9、不被GC回收

本地方法栈的特点及作用

1、与虚拟机栈基本类似
2、区别在于本地方法栈为 Native 方法服务
3、HotSpot 虚拟机将虚拟机栈和本地方法栈合并:
4、有 StackOverflowError和 OutOfMemoryError (比较少见)
5、随线程而生,随线程而灭
6、GC 不会回收该区域:
程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭、都是不会垃圾回收

JVM 运行时数据区 Java 堆的特点及作用

1、线程共享的一块区域
2、虚拟机启动时创建
3、虚拟机所管理的内存中最大的一块区域:
4、存放所有实例对象或数组
5、GC 垃圾收集器的主要管理区域:
6、可分为新生代和老年代(默认情况下新生代占整个堆的1/3,老年代占2/3)
7、新生代更细化可分为 Eden、From Survivor(S0区)、To Survivor(S1区),Eden:Survivor = 8:1:1
8、可通过-Xmx、-Xms 调节堆大小;
9、无法再扩展java.lang.OutofMemoryError: Java heap space
10、如果从分配内存的角度看,所有线程共享的 Java 堆中可以划分出多个线程私有的分配缓冲区 (Thread Local Allocation Buffer,TLAB,为了解决多线程并发创建对象时内存抢占问题,所以每个线程都有一块私有的TLAB区,TLAB区放满再放入共享区域) ,以提升对象分配时的效率

JVM 中对象如何在堆内存分配

在这里插入图片描述

1、指针碰撞 (Bump The Pointer) : 内存规整的情况下通过指针顺序往后移动的方式实现内存划分;
2、空闲列表 (Free List) : 内存不规整的情况下;
选择哪种分配方式由Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有空间压缩整理 (Compact) 的能力决定因此,当使用 Serial、ParNew 等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,既简单又高效;
因此,当使用 Serial、ParNew 等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,既简单又高效,而当使用 CMS 这种基于清除(Sweep)算法的收集器时,理论上就只能采用较为复杂的空闲
列表来分配内存;
3、本地线程分配缓冲 (Thread Local Allocation Buffer,TLAB) (虚拟机默认情况下是可用的Enable): 对象创建在虚拟机中频繁发生,即使仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象 A分配内存,指针还没来得及修改,对象 B 又同时使用了原来的指针来分配内存的情况;
那么解决方案有两种:
(1) 同步锁定,JVM 是采用 CAS 配上失败重试的方式保证更新操作的原子性
(2)线程隔离,把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定,虚拟机是否使用TLAB,可以通过-XX: +/-UseTLABI(+表示使用,-表示不使用)参数来设定,-XX:TIABSize=512k 设置缓冲大小,设置为0时自动设置大

JVM 堆内存中的对象布局(对象的组成)

在 HotSpot 虚拟机中,一个对象的存储结构分为 3 块区域:
对象头(Header)、:实例数据(Instance Data) 和 对齐填充(Padding):
在这里插入图片描述

对象头(Header): 包含两部分,

第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等,32 位虚拟机占 32 bit64 位虚拟机占 64 bit,官方称为 “Mark Word’
第二部分是类型指针,即对象指向它的类的元数据指针,虚拟机通过这个指针确定这个对象是哪个类的实例,另外,如果是 Java 数组,对象头中还必须有一块用于记录数组长度的数据因为普通对象可以通过 Java 对象元数据确定大小,而数组对象不可以
实例数据(lnstance Data): 程序代码中所定义的各种成员变量类型的字段内容(包含父类继承下来的和子类中定义的)
对齐填充(Padding): 不是必然需要,主要是占位,保证对象大小是某个字节的整数倍HotSpot 虚拟机,任何对象的大小都是 8 字节的整数倍

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

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

相关文章

MYSQL中常见的知识问题(二)

1、B树和B树的区别,MYSQL为啥使用B树。 1.1、B树 目的:为了存储设备或者磁盘设计的一种平衡查找树。 定义(M阶B树):a、树中的每个节点最多有m个孩子。 b、除了根节点和叶子节点外,其他节点最少含有m/2(取上…

08-网络管理-iptables基础(四表五链、禁止ping、防火墙规则添加/删除、自建链使用、SNAT\DNAT模式、FTP服务器防火墙规则)待发布

文章目录1. 概述1.1 四表1.2 五链1.3 四表五链的关系1.4 使用流程2. 语法和操作1.1 语法1.2 常用操作命令1.3 基本匹配条件1.4 基本动作1.5 常用命令示例- 设置默认值- 禁止80端口访问- 查看防火墙规则- 保存规则- 允许ssh- 禁止ping- 删除规则- 清除规则(不包括默认…

HR软件如何识别保留优秀员工

在企业信息化的时代,越来越多的年轻员工开始追求他们的激情,辞掉那些乏味的工作,而选择加入重视员工生活质量的企业。他们不再追随那些以牺牲员工福利为代价追求利润的公司。 员工认可度有助于加强组织中的团队合作关系,反过来&a…

木马程序(病毒)

木马的由来 "特洛伊木马"(trojan horse)简称"木马",据说这个名称来源于希腊神话《木马屠城记》。古希腊有大军围攻特洛伊城,久久无法攻下。于是有人献计制造一只高二丈的大木马,假装作战马神&…

实用技巧盘点:Python和Excel交互的常用操作

大家好,在以前,商业分析对应的英文单词是Business Analysis,大家用的分析工具是Excel,后来数据量大了,Excel应付不过来了(Excel最大支持行数为1048576行),人们开始转向python和R这样…

【通信原理(含matlab程序)】实验六:模拟信号的数字化

💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ &#x…

一文理解JVM虚拟机

一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java虚拟机运行时数据区分布图: JVM栈(Java Virtual Machine Stacks): Java中一个线程就会相应有一个线程栈与之对应,因为不同的线程执行逻辑有所不同&#xff…

【JavaGuide面试总结】Java IO篇

【JavaGuide面试总结】Java IO篇1.有哪些常见的 IO 模型?2.Java 中 3 种常见 IO 模型BIO (Blocking I/O)NIO (Non-blocking/New I/O)AIO (Asynchronous I/O)1.有哪些常见的 IO 模型? UNIX 系统下, IO 模型一共有 5 种: 同步阻塞 I/O、同步非阻塞 I/O、…

浏览器兼容性 问题产生原因 厂商前缀 滚动条 css hack 渐近增强 和 优雅降级 caniuse

目录浏览器兼容性问题产生原因厂商前缀滚动条css hack渐近增强 和 优雅降级caniuse浏览器兼容性 问题产生原因 市场竞争标准版本的变化 厂商前缀 比如:box-sizing, 谷歌旧版本浏览器中使用-webkit-box-sizing:border-box 市场竞争,标准没有…

Java多线程案例之线程池

前言:在讲解线程池的概念之前,我们先来谈谈线程和进程,我们知道线程诞生的目的其实是因为进程太过重量了,导致系统在 销毁/创建 进程时比较低效(具体指 内存资源的申请和释放)。 而线程,其实做…

14岁初中生将免去四考,保送清华本硕博连读,乡亲们敲锣打鼓祝贺

导语: 很多学生在很小的时候,都曾有豪言壮语:“将来一定要考上清华北大”。可是真正接受教育,开始学习之后,学生们才能发现,原来学习这么难。不要说真的走进清华北大,即使是进入“985”大学&am…

C++ 智能指针(一) auto_ptr

文章目录前言 - 什么是智能指针?std::auto_ptrauto_ptr的使用常用成员方法:1. get()方法2. release()方法3. reset()方法4. operator()5. operator*() & operator->()auto_ptr的局限性前言 - 什么是智能指针? 在全文开始之前&#xf…

Redis事务的概述、设计与实现

1 Redis事务概述事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断 —— 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。以下是一个事务的例子, 它…

mysql-事务以及锁原理讲解(二)

1、前言 众所周知,事务和锁是mysql中非常重要功能,同时也是面试的重点和难点。本文会详细介绍事务和锁的相关概念及其实现原理,相信大家看完之后,一定会对事务和锁有更加深入的理解。 2、什么是事务 在维基百科中,对事…

7 处理多维特征的输入

文章目录课程前提知识问题引入模型改进修改神经层的增加学习能力与超参数课本代码课程来源: 链接课程文本来源借鉴: 链接以及(强烈推荐)Birandaの课程前提知识 BCELoss - Binary CrossEntropyLoss BCELoss 是CrossEntropyLoss的一个特例&am…

JavaEE day7 初识JavaScript2

函数小结 1.可以赋值给变量(其实就是被变量所指向) 2.装入容器中作为元素存在 3.在函数调用的过程中,函数类型作为实参 4.函数作为另一个函数的返回值 可以直接return一个函数 5.和java不同,JS中允许在一个函数中定义另一个函数,也就是嵌…

介绍一个令强迫症讨厌的小红点组件

前言 在 App 的运营中,活跃度是一个重要的指标,日活/月活……为了提高活跃度,就发明了小红点,然后让强迫症用户“没法活”。 小红点虽然很讨厌,但是为了 KPI,程序员也不得不屈从运营同学的逼迫(讨好),得想办法实现。这一篇,来介绍一个徽标(Badge)组件,能够快速搞…

解决OpenEuler系统 Minimal BASH-like line editing is supported

2023年开工解决的第一个问题~呃,起因是这样的,由于业务需要,修改内核参数后重新打包内核,然后安装内核rpm包后,强制关机,结果就出现如上界面。网上搜索后绝大部分是因为安装了双系统后找不到grub系统引导文…

ELK_Elasticsearch基础介绍

目录 一、搜索是什么? 二、数据库做搜索的弊端 三、全文检索、倒排索引和Lucene 四、什么是Elasticsearch 1、Elasticsearch的功能 2、Elasticsearch的使用场景 3、Elasticsearch的特点 五、elasticsearch核心概念 一、搜索是什么? 概念&#x…

vue2与vue3面试题之区别

目录vue2与vue3面试题之区别01:数据双向绑定( proxy 替代 defineProperty)02:生命周期函数的更换03:vue3的新特性04:缓存组件与更新组件05:ref和reactive的区别06:watch和watchEffec…