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…

2409wtl,网浏包装

原文 介绍 本教程帮助你用IE引擎构建一个基于WTL,并使用我编写的处理IWebBrowser2接口包装类的迷你浏览器. 因为知道代码可能很难读,因此本教程帮助你逐步开发一个迷你浏览器. 背景 大部分项都与互联网浏览有关.我常用超文本视图使用SDI. 有时,我要用真正的浏览器函数,因…

创意无限:五款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 进行比较时体现。…

Java设计模式【命令模式】-行为型

1. 介绍 命令模式&#xff08;Command Pattern&#xff09; 是一种行为型设计模式&#xff0c;它将一个请求封装为一个对象&#xff0c;从而使我们可以用不同的请求对客户端进行参数化&#xff0c;并且支持请求的排队、记录日志以及撤销、重做等功能。命令模式将请求的发送者与…

微信小程序路由跳转之间的区别

navigateTo&#xff1a; 功能描述&#xff1a; navigateTo用于保留当前页面&#xff0c;跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化&#xff1a; 当使用navigateTo进行页面跳转时&#xff0c;当前页面会被推入页面栈中&#xff0c;但不会被销毁&#xff0…

掌握Go语言中的时间与日期操作

Go语言中的时间与日期操作 在编写程序时&#xff0c;处理时间和日期看似是一项无关紧要的任务&#xff0c;但在需要同步多个任务或从文本文件中读取时间时&#xff0c;它的重要性便凸显出来。Go语言中的time包为我们提供了丰富的时间与日期操作功能。本文将详细介绍如何在Go语…

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;还能让你手快地做好很多日…

python的特性,以及和Java的区别

两者各有各的魅力&#xff0c;像是编程语言界的两个明星选手。咱们先看看Python的几个重要特性&#xff0c;然后来个友好对比&#xff0c;看看Java和Python在哪些方面有“性格差异”吧&#xff01; Python的主要特性 简洁易读&#xff1a; Python最出名的就是它的简洁性&#…

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

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

Python判断两张图片的相似度

在Python中&#xff0c;判断两张以numpy的ndarray格式存储的图片的相似度&#xff0c;通常可以通过多种方法来实现&#xff0c;包括但不限于直方图比较、像素差比较、结构相似性指数&#xff08;SSIM&#xff09;、特征匹配等。以下是一些常见方法的简要介绍和示例代码。 1. 像…

TypeScript系列:续篇 - 对象类型(含数组、元数组、函数)

在 TypeScript 中&#xff0c;对象类型用于定义对象的形状&#xff08;shape&#xff09;&#xff0c;即对象包含哪些属性以及这些属性的类型。 对象类型可以是具体的&#xff0c;也可以是抽象的&#xff0c;用于类型检查和类型推断。 对象类型的最基本形式&#xff1a;接口&…

数据库视图和索引

参考链接&#xff1a; 数据库的视图和索引的概念和区别_索引和视图的区别-CSDN博客 MySQL 数据库--索引&#xff08;理论详解及实例演示&#xff09;_数据库索引-CSDN博客 1.视图 视图是从一个或多个表中导出来的表&#xff0c;是一种不是一种真正存在的概念。这样&#xf…

CUDA int128相乘是怎么实现的

CUDA int128相乘是怎么实现的 一.指令对应关系1.cuda C代码2.PTX代码[二个int64]3.SASS指令[多个u32] 二.复现过程 CUDA int128相乘是怎么实现的 一.指令对应关系 1.cuda C代码 clock_t t0clock64(); __prof_trigger(0); int128_t r4r2*r3; //二个int128_t相加 __prof_trig…