JVM内存模型深度剖析与优化

欢迎大家关注我的微信公众号:
欢迎大家关注我的微信公众号

目录

JVM整体结构及内存模型

JVM内存参数设置 


JVM整体结构及内存模型

首先附一段简单代码,我们从代码层面来讲解内存模型 

public class Math {public static final int initData = 666;public static User user = new User();public int compute() {  //一个方法对应一块栈帧内存区域int a = 1;int b = 2;int c = (a + b) * 10;return c;}public static void main(String[] args) {Math math = new Math();math.compute();System.out.println("test");}}

JVM内存模型图

0

 以JDK8为例,JVM虚拟机内存分为堆内存、栈内存、方法区(元空间)、本地方法栈及程序计数器

栈内存(线程) 

        每开启一个线程,栈内存都会为每个线程分配一块区域,线程中每个方法对应一块栈帧内存区域。main方法是一个栈帧,main方法中调用了computer()方法,因此computer()也是一个栈帧。根据先进后出原则,每一个栈帧都按顺序从下至上排列。每个栈帧内存区域都包括局部变量表、操作数栈、动态链接及方法出口。

        栈和局部变量通过JVM指令会进行一些操作。执行int a = 1:首先将常量压入栈。jvm指令iconst_1将int类型常量1压入操作数栈。然后将栈中的值存入局部变量。指令istore_1 将int类型值存入局部变量1。此时局部变量表中a=1。执行int b = 2:iconst_2将int类型常量2压入操作数栈istore_2 将int类型值存入局部变量2。此时局部变量表中b=2。执行int c = (a + b) * 10:iload_1 从局部变量1中装载int类型值1,iload_2 从局部变量2中装载int类型值2,放入操作数栈,iadd 执行int类型的加法1+2=3。然后bipush 将一个8位带符号整数压入栈,也就是将10压入操作数栈。之后imul 执行int类型的乘法,即3*10=30,将结果30重新压入操作数栈。istore_3 将int类型值存入局部变量3,局表变量表中为int c = 30。iload_3从局部变量3中装载int类型值3,放入操作数栈,将30重新压回操作数栈,最后ireturn 从方法中返回int类型的数据,即执行return c

         动态链接:math.compute()方法调用,其实就在常量池中的一个个常量。当代码执行到该方法时,需要解析符号,在方法区里去找寻对应的符号的直接内存地址。

        方法出口:当执行完compute()方法之后,需要回到主线程里继续执行下面的代码。那回到什么位置,执行哪行代码,这些信息都存在方法出口里,来找到继续执行的位置。

注意:main()方法里创建了一个math对象,我们知道对象一般是放在堆内存里的,那么此时main栈帧里的局部变量表,对应的math内存区域存放的就是堆内存中Math对象的内存地址。因此栈内存跟堆内存的关系也表示栈内存里会存放很多堆内存里的内存地址。 

程序计数器 

        程序计数器用于计算jvm的操作步骤,每操作一次计数器+1,相当于索引来找到对应的操作内容,执行对应的指令。

方法区(元空间)

        元空间存放的是常量、静态变量、类元信息等。 当代码load到内存中时,会解析为运行时常量池,之后会详细解释,文本不在这里展开叙述。

本地方法栈

        java很多方法都是执行本地方法,比如new Thread().start(),这里的start()就是调用本地方法,他的底层是由C或C++来实现的。本地方法栈就是为这些本地方法来分配内存空间。

堆内存 

        堆内存主要分为年轻代和老年代,分配比例一般为1:2。年轻代又分为伊甸园区和幸存区(S0与S1),分配比例一般为8:1:1。我们新创建的对象一般存放在伊甸园区。当伊甸园区内存放满时,触发Young GC(Minor GC),将不再被其他对象所引用的对象进行销毁,而仍然有用的对象会放入S0区,并随着young gc不断回收,幸存的对象会不断在S0与S1之间来回存放,并且每幸存一次,生存年龄+1。当幸存对象生存年龄达到15时,会存入老年代。若老年代也满了,那么这个时候将产生FullGC(MajorGC),进行老年代的内存清理。若老年代执行了Full GC之后发现依然无法进行对象的保存,就会产生OOM异常“OutOfMemoryError”。

JVM内存参数设置 

0

 Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):

java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar -Xss:每个线程的栈大小

-Xss:每个线程的栈大小

-Xms:设置堆的初始可用大小,默认物理内存的1/64

-Xmx:设置堆的最大可用大小,默认物理内存的1/4

-Xmn:新生代大小

-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。

-XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。

关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N

-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。

-XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M左右,达到该值就会触发full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。这个跟早期jdk版本的-XX:PermSize参数意思不一样,-XX:PermSize代表永久代的初始容量。

由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QML COOK】- 007-Item对象、信号和槽

信号(signal)和槽(slot)是Qt的独特的设计,自然在QML中也被支持。 Item是QML所有类型的基类,Item类型不会显示在窗口上,但是可以支持信号和槽。本节就用Item编写一个信号和槽的实例。 1. 创建Q…

【ACL 2023】 The Art of Prompting Event Detection based on Type Specific Prompts

【ACL 2023】 The Art of Prompting: Event Detection based on Type Specific Prompts 论文:https://aclanthology.org/2023.acl-short.111/ 代码:https://github.com/VT-NLP/Event_APEX Abstract 我们比较了各种形式的提示来表示事件类型&#xff0…

uniapp 打包成 apk(原生APP-云打包)免费

修改APP配置 根据需求,修改 manifest.json 配置,常见的修改有: 应用名称,应用版本名称,应用版本号 升级版本时,应用版本名称和应用版本号必须高于上一版的值 应用图标 点浏览选择png格式的图片后&#x…

智汇云舟副总裁陈虹旭受邀出席2024昆山工业元宇宙创新论坛

近日,由昆山市工业和信息化局、昆山经济技术开发区科技局指导,中国电子商会元宇宙专委会主办的2024昆山工业元宇宙创新论坛圆满举行。来自西北工业大学、中国电信股份有限公司昆山分公司、中国电信天翼云公司等单位的一百余位专家和企业领导齐聚一堂&…

在阿里巴巴,领导提拔你不是看重你的能力

很多人都在想,为什么领导总是不提拔你,难道真的是如领导给你的反馈“你的能力不行”,这里我想告诉大家,这件事情绝对没有这么简单,尤其是在阿里巴巴这样“江湖气”非常浓的大厂。 Part.1 领导要提拔你,绝对…

代码随想录刷题笔记(DAY11)

今日总结:继续准备期末,今天的算法题目比较简单,晚上看看能不能再整理一篇前端的笔记。 Day 11 01. 有效的括号(No. 20) 题目链接 代码随想录题解 1.1 题目 给定一个只包括 (,),{&#xff…

Linux 软连接ln -s

什么是文件软链接? Linux 的“软连接”与windos 的"快捷方式"相似。文件软链接(Symbolic Link 或 SymLink)是一种特殊的文件类型,它实际上是一个指向另一个文件或目录的引用。创建软链接时,系统会建立一个新…

【Android+物联网】Android封装MQTT连接阿里云物联网平台

前言: 亲测可行,本文实现Android封装MQTT连接阿里云物联网平台。将MQTT协议和连接阿里云平台的操作通过Android studio写入APP中,并简单设计UI。实现手机APP远程控制单片机LED灯亮灭的功能。 关于《Android软件开发》,见如下专栏…

做网页抓取时如何处理验证码

网络爬虫是自动从网站提取数据的过程,它已经彻底改变了企业获取信息和获取洞察的方式。然而,为了防止自动化机器人访问网站,CAPTCHA旨在阻碍网络爬虫的工作。在本文中,我们将探讨处理CAPTCHA的有效策略,并介绍Capsolve…

GO——cobra

定义 Cobra 是 Go 的 CLI 框架 CLI,command-line interface,命令行界面 使用 注意 第一个cmd的USE即使命名了也没有意义,一般保持和项目名一致。 示例 package mainimport ("fmt""github.com/spf13/cobra" )func …

5分钟了解股票交易!上海股票开户交易佣金最低是多少?怎么开户费用最低?

股票交易是指通过证券市场买卖股票的活动。以下是股票交易的基本步骤: 开立证券账户:首先需要选择一家证券公司,向其提交相关材料开立证券账户,并完成账户开立手续。 研究和选择股票:在决定购买股票之前,建…

Css样式制作图形倒影

该CSS样式是WebKit(主要应用于Safari和其他基于WebKit的浏览器)的特定前缀属性,用于实现元素内容的反射效果。具体解释如下: -webkit-box-reflect: 定义了一个盒反射效果,仅在支持WebKit的浏览器中生效。 below 15px&a…