JVM整体结构解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 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影响性能。

相关文章
|
13天前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
|
3月前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
345 132
|
15天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
42 5
|
3月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
6天前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
46 29
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
150 2
|
3天前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
19 3

推荐镜像

更多