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

news2024/11/25 3:53:27

JVM性能调优

  • 1. JDK的体系结构
  • 2. Java语言的跨平台特性
  • 3.JVM整体结构及内存模型
    • 3.1 内存模型
      • 3.1.1 PC寄存器(线程私有)
      • 3.1.2 虚拟机栈(线程私有)
        • 1. 局部变量表
        • 2. 操作数栈

本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。

1、JDK体系结构与跨平台特性介绍

2、JVM内存模型深度剖析

3、从jvisualvm来研究下对象内存流转模型

4、讲透Gc Root与STW机制

5、日均百万级订单交易系统JVM参数如何设置

6、JVM参数设置通用模型

1. JDK的体系结构

在这里插入图片描述

JDK: JDK提供了编译、运行Java程序所需的各种资源和工具;包括Java编译器,Java运行时环境【JRE】;开发工具包括编译工具(javac.exe) 打包工具(jar.exe)等。

JRE: 即JAVA运行时环境,JVM就是包括在JRE中,以及常用的JAVA类库等;

SDK: SDK是基于JDK进行扩展的,是解决企业级开发的工具包。如JSP、JDBC、EJB等就是由SDK提供的 ;

JVM(Java Virtual Machine),Java虚拟机,可以看做是一台抽象化的计算机,它有一套完整的体系架构,包括处理器、堆栈 、寄存器等。

在运行时环境,JVM会将Java字节码解释成机器码。机器码和平台相关的(不同硬件环境、不同操作系统,产生的机器码不同),所以JVM在不同平台有不同的实现。目前JDK默认使用的实现是Hotspot VM。

2. Java语言的跨平台特性

在这里插入图片描述

一次编译,到处执行(Write Once ,Run Anywhere)。 用Java创建的可执行二进制程序,能够不加改变的运行于多个平台。从软件层面屏蔽不同操作系统底层硬件与指令上的区别

其实跨平台就是JVM来做的,我们在下载JDK的时候,会让我们选择不同的操作系统按照相应的JDK就是为了对应不同的操作系统。

3.JVM整体结构及内存模型

官方文档参考:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.htmI#jvms-2.5.4

3.1 内存模型

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为个不同的数据区。这些区域有各自的用途,以及创建和销毁事件。

JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。

在这里插入图片描述

3.1.1 PC寄存器(线程私有)

PC寄存器,也叫程序计数器。JVM支持多个线程同时运行,每个线程都有自己的程序计数器。倘若当前执行的是JVM方法,则该寄存器中保存当前执行指令的地址;倘若执行的是native方法,则PC寄存器为空。

这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。

3.1.2 虚拟机栈(线程私有)

栈里面是存局部变量的。每个线程有一个私有的栈,随着线程的创建而创建。栈里面存放着一种叫做“栈帧”的东西,每个方法在执行的时候会创建一个栈帧,存储了局部变量表(基本数据类型和对象引用),操作数栈,动态连接,方法出口等信息。

每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。

(方法中的局部变量的空间可以进行释放)

通常所说的栈,一般是指虚拟机栈中的局部变量表部分。局部变量表所需的内存在编译期间完成分配。

栈的大小可以固定也可以动态扩展,当扩展到无法申请足够的内存,则OutOfMemoryError。

当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误

演示栈帧:

package ding;


public class Math {
    public static final int initData = 666;
    public static People people = new People();

    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();
    }
}

当我们的线程一开始运行main方法,马上分配一块自己专属的线程栈,只要线程开始运行main方法,会在这一大块线程栈里面给自己的mian方法分配一块自己专属的地方,放main方法自己的局部变量,比如math。然后compute一运行又会给compute分配栈内存区域,用来放compute的局部变量。整个JVM内部他给每一个方法都会分配一块专属的内存空间,我们把这块空间叫做栈内存空间。

在这里插入图片描述
在这里插入图片描述
那这个里面的栈与数据结构的栈(先进后出)有什么不一样的吗?

这个栈就是数据结构里面的栈,是一样的,这个下面是栈底,上面是栈顶,就是mian在栈底,compute在栈顶,出的时候就是compute先出,然后main再出。

为什么用数据结构里面的栈存储内存空间呢?

比如这个compute方法他是后调用的,但是他会先执行完,然后释放空间。

如果是递归的话在内存里面也不是套娃,也是一个一个往上,有很多个compute,他是往栈顶一直走,不是套娃。

在这里插入图片描述

栈帧内部还是比较复杂的,除了放局部变量表之外,还有一块是操作数栈、动态链接、方法出口。

1. 局部变量表

就是放一些局部变量的

2. 操作数栈

看这个就需要看字节码文件

我们先来看字节码文件。
在这里插入图片描述
然后进行反汇编。打开终端
在这里插入图片描述
下面这个相当于是JVM的汇编语言。

Compiled from "Math.java"
public class ding.Math {
  public static final int initData;

  public static ding.People people;

  public ding.Math();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int compute();
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: bipush        10
       9: imul
      10: istore_3
      11: iload_3
      12: ireturn

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class ding/Math
       3: dup
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1
       8: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: aload_1
      12: invokevirtual #5                  // Method compute:()I
      15: invokevirtual #6                  // Method java/io/PrintStream.println:(I)V
      18: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      21: ldc           #7                  // String test
      23: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      26: return

  static {};
    Code:
       0: new           #9                  // class ding/People
       3: dup
       4: invokespecial #10                 // Method ding/People."<init>":()V
       7: putstatic     #11                 // Field people:Lding/People;
      10: return
}

JVM的指令手册可以看:https://blog.csdn.net/weixin_44991304/article/details/120057916

我们首先来看compute方法,在这个方法里面的第一句话:

0: iconst_1这句话的意思就是讲jint类型常量1压入操作数栈

这个前4行就是把变量a,b进行赋值。

就是先把1放到操作数栈里面,

然后是a在局部变量表里面,然后把操作数栈里面的1赋值给局部变量表里面的a。接着b也是这样的操作。

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

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

相关文章

SimpleCG绘图函数(3)--绘制矩形

前面我们已经学习了点和线的绘制,本篇我们继续绘图函数学习----矩形的绘制&#xff0c;也就是长方形的绘制,并给出一个绘制楼房的例子演示矩形的应用。 所有绘制矩形相关函数如下&#xff1a; //以下矩形左上角坐标(left, top)&#xff0c;右下角坐标(right,bottom ) //以线条…

跨境电商系统开发-电商商城系统平台定制方案

随着业务的拓展&#xff0c;不少企业开始将目光转向国外市场&#xff0c;那么如何定制一套属于想自己的跨境出海电商商城方案呢&#xff1f;需要做好以下关口把关&#xff1a; 欢迎名片交流探讨开发平台流程 买家端(h5/pc/app) www.mardao.cn 账号 密码 卖家端(h5/pc)…

八、(重点)视图集ModelViewSet自定义action路由routers

上一章&#xff1a; 七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 九、DRF生成API文档_做测试的喵酱的博客-CSDN博客 一、视图集ModelViewSet与ReadOnlyViesSet ModelViewSet视图集 与 ReadOnly…

基于FPGA:运动目标检测(包围盒仿真工程,及一些调试问题)

目录 前言一、安装器件库二、仿真工程操作1、进入文件列表2、找到bounding_box_locate.vt&#xff0c;双击打开文件3、修改路径4、路径设置5、切换回“Hierarchy”&#xff0c;即工程界面6、运行仿真7、查看波形 重点&#xff1a;调试问题三、仿真代码1、仿真顶层文件2、绘制包…

node篇-fs模块儿

nodejs-fs模儿 异步 1. mkdir() 创建一个目录 // 1.mkdir 创建一个目录&#xff0c;回调函数的参数含义&#xff1a;err const fs require(fs); fs.mkdir(./avater,(err)>{console.log(err);if(err && err.code EEXIST){console.log(当前目录已经存在)} }) 当我…

华硕天选4R FA617原装Windows11原厂预装系统工厂模式恢复安装带 ASUSRecevory 一键还原22H2版本

华硕天选4R FA617X原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16…

浅谈NoSQL数据库

数据库 数据库&#xff0c;又称为数据管理系统&#xff0c;是处理的数据按照一定的方式储存在一起&#xff0c;能够让多个用户共享、尽可能减小冗余度的数据集合&#xff0c;简而言之可视为电子化的文件柜——存储电子文件的处所。 数据库有&#xff1a;Oracle数据库、ACCESS数…

代码随想录算法训练营第四十五天 | 力扣 70. 爬楼梯(进阶), 322. 零钱兑换, 279.完全平方数

70. 爬楼梯&#xff08;进阶&#xff09; 题目 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff…

【浅学 JDBC】

浅学JDBC 笔记记录 一、1. JDBC的概念2. JDBC快速入门2.1 DriverManager2.2 Connection2.3 Statement2.4 ResultSet 3. JDBC入门案例使用3.1 查询所有学生信息3.2 根据id查询学生信息&&新增学生信息&&修改学生信息&&删除学生信息 一、 1. JDBC的概念 …

中科易安8周年,与你相约联网智能门锁

中科易安与物联网技术发展同频 持续推动安防信息化建设 打造多场景应用的数智化通行解决方案 促进技术与安全精准对接 联网智能门锁技术硬核 中科易安打造集NB-IoT、Sub-1G Cat.1、Wifi、RS485和BLE 5.0 在内的六大通信技术组网方案 以“联网”赋能智能门锁 实现通行数…

C++11之atomic原子操作

atomic介绍 多线程间是通过互斥锁与条件变量来保证共享数据的同步的&#xff0c;互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候&#xff0c;对共享资源的访问主要是对某一数据结构的读写操作&#xff0c;如果数据结构本身就带有排他性访问的特性&#xff0c…

chatgpt赋能python:Python中的等待:理解和优化

Python中的等待&#xff1a;理解和优化 Python是一种强大的编程语言&#xff0c;在构建各种应用程序时很常用。但是&#xff0c;随着应用程序越来越复杂&#xff0c;需要等待一些操作时&#xff0c;Python中的等待传统上会导致性能下降。在这篇文章中&#xff0c;我们将深入了…

可持续能源技术改变世界

文章目录 一、你在工作或生活中接触过可持续能源技术吗&#xff1f;可以分享下你的经历与看法。二、你认为可持续能源技术的优势和挑战有哪些&#xff1f;三、你了解过可持续能源技术的应用现状吗&#xff1f;四、对于可持续能源技术真的否改变世界这个问题你怎么看&#xff1f…

ifconfig工具与驱动交互解析(ioctl)

Linux ifconfig&#xff08;network interfaces configuring&#xff09; Linux ifconfig命令用于显示或设置网络设备。ifconfig可设置网络设备的状态&#xff0c;或是显示目前的设置。同netstat一样&#xff0c;ifconfig源码也位于net-tools中。源码位于net-tools工具包中&am…

《消息队列高手课》课程笔记(七)

如何使用异步设计提升系统性能&#xff1f; 异步设计如何提升系统性能&#xff1f; 假设我们要实现一个转账的微服务 Transfer(accountFrom, accountTo, amount)&#xff0c;这个服务有三个参数&#xff1a;分别是转出账户、转入账户和转账金额。 这个例子的实现过程中&…

chatgpt赋能python:Python中如何反转字符串:三种简单方法

Python中如何反转字符串&#xff1a;三种简单方法 当我们在处理字符串时&#xff0c;有时需要将其反向排列。在Python中&#xff0c;这可以通过以下三种简单方法实现&#xff1a; 1. 使用内置的切片方法 在Python中&#xff0c;可以使用字符串的切片方法将其反转。这种方法非…

(浙大陈越版)数据结构 第三章 树(上) 3.4 小白专场:树的同构(PTA编程题讲解)

题意理解和二叉树表示 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换变成T2&#xff0c;则称两棵树是“同构”的。 eg1&#xff1a;现请你判断如下两棵树&#xff08;左侧为T1&#xff0c;右侧为T2&#xff09;是否为同构树&#xff1f; 显然T1可以通过有限次左右孩子…

REST风格 -- SpringMVC入门保姆级教程(四)

文章目录 前言四、REST风格1.了解REST风格2.REST风格写法一般步骤3.REST风格快速开发4.REST风格中的注解5. 案例&#xff1a;基于REST风格页面数据交互 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#…

Redis高级篇 - 分布式缓存

分布式缓存 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c…

iPad触屏笔哪个牌子好用?Apple Pencil的平替笔

从无纸化的广泛使用&#xff0c;电容笔成为无纸化中不可替代的一部分。但由于原装电容笔的昂贵&#xff0c;市面上的电容笔品牌众多&#xff0c;不知如何下手&#xff0c;今天给大家推荐几款好用又平价的Apple Pencil平替笔。顺便给不知道如何挑选电容笔的小伙伴科普一下电容笔…