JVM整体结构解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: JVM整体结构解析

一、JVM整体结构

JVM整体结构主要由三块组成:类装载子系统、字节码引擎、运行时数据区(内存模型)。 运行class文件时,首先由类装载子系统加class文件信息装载进运行时数据区,然后由字节码引擎来执行内存模型中的代码。

二、 JVM内存模型

栈:线程私有的一块区域,每创建一个线程就会从内存中分配一个区域来当作栈空间,其大小以-Xss指定,它的值一般为几百KB到1M。栈中的存储单位称为栈帧,线程每运行到一个方法都会创建一个与之对应的栈帧,用于存放该方法的局部变量表、操作数栈、动态链接和方式出口(方法返回地址),方法调用结束则栈帧销毁释放内存,因而栈帧符合栈数据结构的FILO(先进后出)特性,同时它也不会发生内存泄漏和GC,栈中存放的对象为对象的引用、基本类型的变量,栈的大小是编译期间可知的。

(1)局部变量表:用于存放当前方法局部变量的一个数组,变量0默认存的是方法的调用者this,往后依次存的局部变量。

(2)操作数栈:局部变量的值(操作数)在程序运行过程中用于做计算的一块临时存放内存空间,属于栈结构。

(3)动态链接:某些自定义方法的调用代码在编译时只会对当前方法做一个符号引用,在程序运行到这行代码时,会根据该符号引号找到相关代码在方法区的内存地址,这个直接引用称之为动态链接。即动态链接里存放的是方法代码在方法区的内存地址。

(4)方法出口:即方法的返回地址。存放的是当前方法在执行结束后上一层方法该执行哪一行信息。

本地方法栈: 本地方法栈与栈是相似的,也是线程私有的,不同的是它里面记录的本地方法调用的信息。

程序计数器:也称为PC计程器,它是线程私有的,记录的是当前线程运行的代码指令地址,只对java方法计数,如果运行到native方法则它的值为undefined,它是唯一一块不会发生内存泄漏的区域。

堆:线程共享的一块区域,用于存放new出来的对象、数组、实例变量。它是发生GC最频繁的一块区域,因此,堆也称为GC堆。堆的内存由-Xms指定,默认是物理内存的1/64;堆的最大内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70% 时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后自动调整堆的大小,引起性能的波动。堆按功能分可分为年轻代和老年代,默认比例1:2,年轻代可分为一个1个eden区和两个suvivor区。堆的这些区域在物理上都是连续的内存空间(从G1开始,往后的垃圾收集器就不是了)。新生成对象绝大多数都会先进入年轻代的eden区,eden区满后触发minor gc将存活的对象放入其中一个suvivor区,在下一次minor gc时又将eden和这个suvivor区存活的对象放入另一个suvivor区,如此往复。对象在suvivor区复制15次后会进入老年代,当老年代满时则触发full GC,fullGC的时间是minor gc的几十上百倍。故而对GC调优很大一部分就是减少full gc触发的频率。

 对象进入老年代的条件:

(1) 新生成的大对象直接进入老年代,JVM参数 -XX:PretenureSizeThreshold 可以设置大 对象的大小,如果对象超过设置大小会直接进入老年代,不会进入年轻代,这个参数只在 Serial 和ParNew两个收集器下 有效。

(2)长期存活的对象进入老年代,对象在 Survivor 中每熬过一次 MinorGC,年龄就增加1岁,当它的年龄增加到一定程度 (默认为15岁,CMS收集器默认6岁,不同的垃圾收集器会略微有点不同),就会被晋升到老年代中。对象晋升到老年代 的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

(3)对象动态年龄判断,如果一批对象放入suvivor区时,他们的总大小大于suvivor区的50%(-XX:TargetSurvivorRatio可以指定),则将偏大的对象直接放入老年代。对象动态年 龄判断机制一般是在minor gc之后触发的。

方法区:线程共享的一块区域,主要用于存放class类模型,静态变量的引用对象。在jdk1.8之前它 的具体实现称为永久代,用的是虚拟机中的内存空间,在jdk1.8及之后的版本它的具体实现称为元数据区,用的是本地内存。元空间的初始大小为21M,在使用的过程中它的大小会动态伸缩,而伸缩的过程中会触发full gc,因此在使用过程中通常会给方法区指定默认大小和最大大小,避免动态伸缩产生full gc影响性能。

相关文章
|
22天前
|
人工智能
歌词结构的巧妙安排:写歌词的方法与技巧解析,妙笔生词AI智能写歌词软件
歌词创作是一门艺术,关键在于巧妙的结构安排。开头需迅速吸引听众,主体部分要坚实且富有逻辑,结尾则应留下深刻印象。《妙笔生词智能写歌词软件》提供多种 AI 功能,帮助创作者找到灵感,优化歌词结构,写出打动人心的作品。
|
23天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
45 10
|
1月前
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
90 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
41 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
14天前
|
机器学习/深度学习 自然语言处理 数据管理
GraphRAG核心组件解析:图结构与检索增强生成
【10月更文挑战第28天】在当今数据科学领域,自然语言处理(NLP)和图数据管理技术的发展日新月异。GraphRAG(Graph Retrieval-Augmented Generation)作为一种结合了图结构和检索增强生成的创新方法,已经在多个应用场景中展现出巨大的潜力。作为一名数据科学家,我对GraphRAG的核心组件进行了深入研究,并在此分享我的理解和实践经验。
38 0
|
1月前
|
存储 安全 Java
JVM锁的膨胀过程与锁内存变化解析
在Java虚拟机(JVM)中,锁机制是确保多线程环境下数据一致性和线程安全的重要手段。随着线程对共享资源的竞争程度不同,JVM中的锁会经历从低级到高级的膨胀过程,以适应不同的并发场景。本文将深入探讨JVM锁的膨胀过程,以及锁在内存中的变化。
40 1
|
20天前
光纤电缆(FOC)的结构深度解析
【10月更文挑战第21天】
36 0
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
15 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0

推荐镜像

更多