JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型

2.1 jvm内存模型概览

2.2 pc计数器

它是一块很小的内存空间,集合可以忽略不记,也是运行速度最快的存储区域。不会随着程序的运行需要更大的空间。

在jvm规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程生命周期保持一致。

它是唯一一个在java虚拟机规范中没有规定任务outofmemoryError 情况的区域。

2.3 线程栈

2.3.1 概述特点

Java 虚拟机规范允许Java栈的大小是动态的或者是固定不变的。

如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常。

如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出—个OutOfMemoryError异常。

栈中不存在GC,但存在OOM

2.3.2 栈帧包含的信息

栈帧包含信息:

1)局部变量: 由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据线程安全问题。

当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量,将会按照顺序被复制到局部变量表中的每一个slot上。

2)操作数据栈

操作数栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中,并更新PC寄存器中下一条需要执行的字节码指令。

3)动态链接

指向运行期中常量池该方法的引用,常量池的作用,就是为了提供一些符号和常量,便于指令的识别。

4)方法出口等信息

无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。

2.3.3 发生栈溢出的情况*

1.局部数据过大,当函数内部的数组过大时,有坑导致堆栈溢出。

2.递归调用层次太多,递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。

2.3.4 设置栈内存大小*

#设置栈内存大小:-Xss size (即: -XX:ThreadStackSize)

2.3.5 方法和栈帧之间的关系

在线程上正在执行的每个方法都各自对一个栈帧。栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。

2.4 本地方法栈

java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。

2.5 java堆

1.jdk7的结构

2.jdk8的结构

二  实操案例

2.1 设置和查看栈大小

1.代码

/*** 演示栈中的异常:StackOverflowError** @author shkstart* @create 2020 下午 9:08** 设置栈的大小: -Xss   (-XX:ThreadStackSize)** -XX:+PrintFlagsFinal*/
public class StackErrorTest {private static int count = 1;public static void main(String[] args) {try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}try {count++;main(args);}catch (Throwable e){System.out.println("递归的次数为:" + count);}}}

2.设置

3.查看: jinfo -flag    ThreadStackSize pid

2.2 查堆的大小

1.代码

package com.ljf.jvm.optimise.staick;/*** 1. 设置堆空间大小的参数* -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小*      -X 是jvm的运行参数*      ms 是memory start* -Xmx 用来设置堆空间(年轻代+老年代)的最大内存大小** 2. 默认堆空间的大小*    初始内存大小:物理电脑内存大小 / 64*             最大内存大小:物理电脑内存大小 / 4* 3. 手动设置:-Xms600m -Xmx600m*     开发中建议将初始堆内存和最大的堆内存设置成相同的值。** 4. -XX:+PrintFlagsFinal** @create 2021  20:15*/
public class HeapSpaceInitial {public static void main(String[] args) {//返回Java虚拟机中的堆内存总量long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;//返回Java虚拟机试图使用的最大堆内存量long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;System.out.println("-Xms : " + initialMemory + "M");System.out.println("-Xmx : " + maxMemory + "M");//        System.out.println("系统内存大小为:" + initialMemory * 64.0 / 1024 + "G");
//        System.out.println("系统内存大小为:" + maxMemory * 4.0 / 1024 + "G");try {Thread.sleep(1000000);} catch (InterruptedException e) {e.printStackTrace();}}
}

2.查看

2.2 设置堆大小和日志输出

1.代码

/** 测试:大对象直接进入老年代* -Xms60m -Xmx60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails* @create 2021  21:48*/
public class YoungOldAreaTest {public static void main(String[] args) {byte[] buffer = new byte[1024 * 1024 * 20];//20m}
}

2.进行设置:    -Xms60m -Xmx60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails

3.输出日志

2.3 设置元空间的大小与日志输出

1.代码

package com.atguigu.methodarea;/*** 结论:* 静态引用对应的对象实体始终都存在堆空间** jdk7:* -Xms300m -Xmx300m -XX:PermSize=300m -XX:MaxPermSize=300m -XX:+PrintGCDetails* jdk 8:* -Xms300m -Xmx300m -XX:MetaspaceSize=300m -XX:MaxMetaspaceSize=300m -XX:+PrintGCDetails* @author shkstart  shkstart@126.com* @create 2020  21:20*/
public class StaticFieldTest {private static byte[] arr = new byte[1024 * 1024 * 100];//100MB -> 200+MBpublic static void main(String[] args) {System.out.println(StaticFieldTest.arr);//        try {
//            Thread.sleep(1000000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }}
}

2.设置:

 -Xms300m -Xmx300m -XX:MetaspaceSize=300m -XX:MaxMetaspaceSize=300m -XX:+PrintGCDetails

3.查看

2.4 设置堆中年轻代和日志输出

1.代码

/*** -Xms600m -Xmx600m -XX:SurvivorRatio=8 -XX:+PrintGCDetails* @create 2020  17:51*/
public class HeapInstanceTest {byte[] buffer = new byte[new Random().nextInt(1024 * 200)];public static void main(String[] args) {ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();while (true) {list.add(new HeapInstanceTest());try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}
}

2.设置:  -Xms600m -Xmx600m -XX:SurvivorRatio=8 -XX:+PrintGCDetails

3.日志输出

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

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

相关文章

DIC技术助力新能源汽车主机厂力学测试研发与整车性能提升

在新能源汽车研发过程中&#xff0c;非接触式全视场应变DIC测量方案&#xff0c;越来越受到汽车主机厂的信赖与认可。传统接触式传感器&#xff0c;在精度、灵活性和数据处理能力上存在局限。DIC技术可提供精确、高效、全视场、便捷的非接触式测量解决方案。 在汽车研发阶段&a…

C语言知识体系思维导图

为了更清晰地描述C语言知识体系&#xff0c;笔者用一个结构化的思维导图来概括其主要组成部分。见下&#xff1a; 这个思维导图旨在提供一个全面而系统的视角&#xff0c;帮助学习者逐步构建扎实的C语言知识体系。随着学习的深入&#xff0c;可以根据个人兴趣和职业需求&#x…

《Diffusion Models Without Attention》CVPR2024

摘要 这篇论文探讨了在高保真图像生成领域&#xff0c;去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Models, DDPMs&#xff09;的重要性。尽管DDPMs在捕捉复杂视觉分布方面表现出色&#xff0c;但在高分辨率图像生成上面临显著的计算挑战。现有的方法&…

计算机毕业设计 《计算机基础》网上考试系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

大模型分离架构学习记录

GPU Direct GPU 网络的情况已经发生了很大变化。每个 GPU 都有自己的内部互联&#xff0c;例如 NVIDIA 的 A100 或 H800&#xff0c;它们内部的 NVLink 互联可以达到 600GB 甚至 900GB。这种内部互联与外部以太网网络集群设计之间存在耦合关系。GPU 是单机多网卡的&#xff0c…

创意无限:五款AI绘画应用,让艺术创作更简单

随着人工智能技术的不断进步&#xff0c;AI绘画已经成为一个不可忽视的现象。在短视频平台上&#xff0c;用户只需轻触屏幕&#xff0c;就能生成风格各异的画作&#xff0c;这种一键生成的特效迅速吸引了大量关注。AI绘画技术的快速发展&#xff0c;不仅让艺术创作变得更加便捷…

国产化数据库挑战及发展趋势

非国产数据库如Oracle、MySQL和MSSQL等在某些领域占据重要地位&#xff0c;但国产数据库的市场份额正在逐步提升&#xff0c;特别是在政策支持和市场需求的双重推动下&#xff0c;国产数据库的替代进程正在加速。 一、国产数据库市场规模 2024年中国数据库市场规模预计为543.1亿…

Python 数学建模——灰色关联度分析

文章目录 介绍原理代码实例 介绍 灰色关联度分析&#xff0c;可以反映两个序列 X ( k ) X(k) X(k) 和 Y ( k ) Y(k) Y(k) 之间的联系&#xff0c;用 r r r 表征。然而&#xff0c; r r r 的绝对大小并没有过多的意义&#xff0c;它的意义只在不同的 r r r 进行比较时体现。…

C语言蓝桥杯:语言基础

竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_search函数&#xff0c;用于查找…

提升效率必备,掌握这些Shell文本处理技能!

Shell脚本是Linux系统里的一项基本功&#xff0c;就算它的语法看起来有点奇怪&#xff0c;读起来也不是特别顺畅&#xff0c;但在一些情况下&#xff0c;它仍然是最能干的解决办法。学好Shell脚本&#xff0c;不仅让你对Linux系统了解更深&#xff0c;还能让你手快地做好很多日…

使用程序方式获取与处理MySQL表数据

8.1  执行多条语句获取 MySQL 表数据 8.1.1  MySQL 中的常量 8.1.2  MySQL 中的变量 1&#xff0e;用户变量 用户可以在表达式中使用自己定义的变量&#xff0c;这样的变量称为用户变量。 用户变量在使用前必须定义和初始化&#xff0c;如果使用没有初始化的变量&#x…

外包干了三年,快要废了。。。

先简单说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了3年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

300. 最长递增子序列 1.dp定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较&#xff0c;而是我们要取dp[j] 1的最大值…

JAVA 的excel数据批量导入解析 现在都用什么API工具 Apache POI 、EasyExcel 、easypoi有什么区别

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;SpringBoot &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 在Java中&#xff0c;处理Excel数据批量导入解析时&#xff0c;常…

高空抛物检测算法的应用场景解析

高空抛物事件频发&#xff0c;对公众安全构成严重威胁。无论是居民区还是商业中心&#xff0c;从高层建筑中丢弃物品都可能导致人员伤亡和财产损失。传统的监控手段多以事后追溯为主&#xff0c;无法在事发时及时预警和干预。为应对这一难题&#xff0c;视觉分析技术的发展为高…

全国历年高考真题2008-2024

目录 分享链接&#xff1a; ⬇️⬇️⬇️ 点击下载

单元测试之mock使用

一、简介 一般程序中A类的m1方法调用B类的m2方法&#xff0c;而B类的m2方法又调用了C类的m3方法以此类推等等&#xff0c;而其中的某个方法的一些数据又需要调用其它服务或者查询数据库&#xff0c;一般单元测试只针对某个功能进行测试&#xff0c;但是如上面的情况在做单元测试…

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式&#xff1a;3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制&#xff1a;Maven & SpringBoot 多环境兼容 配置文件分类&#xff1a;4种 整合…

蓝桥杯4. Fizz Buzz 经典问题

题目描述 给定一个整数 NN&#xff0c;从 1 到 NN 按照下面的规则返回每个数&#xff1a; 如果这个数被 3 整除&#xff0c;返回 Fizz。如果这个数被 5 整除&#xff0c;返回 Buzz如果这个数能同时被 3 和 5 整除&#xff0c;返回 FizzBuzz。如果这个数既不能被 3 也不能被 5…

本地部署Llama 3.1大模型

Meta推出的Llama 3.1系列包括80亿、700亿、4050亿参数版本&#xff0c;上下文长度扩展至12.8万tokens&#xff0c;并增加了对八种语言的支持。 部署模型需要用到Ollama的一个工具&#xff0c;访问官方网站https://ollama.com 点击下载&#xff0c;选择下载你对应的操作系统下…