JVM和类加载机制-01[JVM底层架构和JVM调优]

JVM底层

  • Java虚拟机内存模型
    • JVM组成部分
      • 五大内存区域各自的作用
        • 虚拟机栈(线程栈)
          • 栈帧内存区域
        • 本地方法栈
        • 程序计数器
          • 为什么jvm要设计程序计数器?
        • 方法区
  • JVM优化-堆详解
    • JVM底层垃圾回收机制
    • jvm调优工具
      • jvisualvm.exe
      • Arthas工具使用

Java虚拟机内存模型

  • JVM跨平台原因
    就是在JVM层面对各个操作系统的指令做了不同处理
    在这里插入图片描述

JVM组成部分

在这里插入图片描述

五大内存区域各自的作用

虚拟机栈(线程栈)

每次运行的时候,都会给线程栈分配一部分内存,有多少个线程就分配多少个。来存放各自线程运行时的变量,说白了就是工作内存,工作内存哪里来的就是虚拟机栈中分配来的
在这里插入图片描述

栈帧内存区域

一个方法对应一个栈帧内存区域,
在这里插入图片描述
在这里插入图片描述

本地方法栈

方法执行到了本地方法,本地方法执行也需要内存空间,就从本地方法栈中分配一部分给本地方法。本地方法就是naitve修饰的方法(底层是C++)
在这里插入图片描述

程序计数器

某行程序在方法区中的内存地址
在这里插入图片描述

为什么jvm要设计程序计数器?

在这里插入图片描述
比如上面的程序,如果是多线程情况下,A线程执行到第4行的时候,被其他线程抢占资源,其他线程执行,其他线程完毕,A线程再回头执行,如果没有程序计数器,它就不知道它之前执行到第几行,就得重新执行,有了程序计数器,A线程一看,我之前执行到第4行,现在就从第4行开始再执行。

如果栈中存放的是变量是对象也就是引用类型的变量,那栈中存放的就是指向对象的指针,对象就存放在堆中,所有线程共享
在这里插入图片描述

方法区

存放常量+静态变量+类信息

方法区中存放的静态变量是引用类型的,那么方法区中存的即使静态引用变量的指针,对象还是存放到堆中。

在这里插入图片描述

JVM优化-堆详解

老年代占比2/3,年轻代占1/3。年轻代:8:1:1,年轻代又分为伊甸园区、s0、s1
在这里插入图片描述

JVM底层垃圾回收机制

在这里插入图片描述
新创建的对象都在新生代的伊甸园区,当伊甸园区满了后,字节码执行引擎就会开启垃圾收集线程,开始进行垃圾回收
常见的垃圾回收算法:

  • 引用计数法(已经淘汰了)
    在这里插入图片描述
  • 根可达性分析算法
    在这里插入图片描述垃圾收集线程根据根可达算法,找到垃圾后把非垃圾转移到survivor(幸存者)区域,而垃圾就被直接干掉了
    survivor区域的对象会在s0和s1之间反复挪动,一个minor gc挪动一次,当挪动15次也就是minor gc15次后,也叫分代年龄15次,还没有被干掉,就移动到老年代。
    在这里插入图片描述

jvm调优工具

jvisualvm.exe

调出jdk自带jvisualvm.exe工具进行查看
在这里插入图片描述

  • 测试代码
public class HeapTest {byte [] a=new byte[1024*100]; //100KBpublic static void main(String[] args) throws InterruptedException {ArrayList<HeapTest> heapTests=new ArrayList<>();while (true){heapTests.add(new HeapTest());TimeUnit.SECONDS.sleep(2);}}
}

执行本地方法就可以监视到
在这里插入图片描述

Arthas工具使用

在这里插入图片描述

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

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

相关文章

Java中的ArrayList和LinkedList有什么区别?

Java中的ArrayList和LinkedList是两种常用的集合实现类&#xff0c;它们都属于Java集合框架的一部分&#xff0c;但它们在内部实现、性能特点、使用场景等方面存在明显的区别。以下是对这两种集合的详细比较&#xff1a; 1. 数据结构差异 ArrayList&#xff1a;ArrayList是动…

SpringBoot之全局异常处理

默认情况下的异常现象 创建一个接口 &#xff08;接口需要传递参数key&#xff09; RestController RequestMapping("/exception") public class ExceptionController {GetMapping("/accept")public String acceptKey(RequestParam("key") Str…

C语言第5天作业 7月16日

目录 1.求1000以内所有的质数。 2.有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 3.猴子吃桃问题 4.判断最大值 1.求1000以内所有的质数。 质数&#xff1a;只能够1和它本身整除 #include <stdio.h> in…

Camera Raw:首选项

Camera Raw 首选项 Preferences提供了丰富的配置选项&#xff0c;通过合理设置&#xff0c;可以显著提升图像处理的效率和效果。根据个人需求调整这些选项&#xff0c;有助于创建理想的工作环境和输出质量。 ◆ ◆ ◆ 打开 Camera Raw 首选项 方法一&#xff1a;在 Adobe Bri…

Linux系统学习日记——vim操作手册

Vim编辑器是linux下的一个命令行编辑器&#xff0c;类似于我们windows下的记事本。 目录 打开文件 编辑 保存退出 打开文件 打开 hello.c不存在也可以打开&#xff0c;保存时vim会自动创建。 效果 Vim打开时&#xff0c;处于命令模式&#xff0c;即执行命令的模式&#x…

VUE中setup()

在Vue中&#xff0c;setup() 函数是Vue 3.0及更高版本引入的一个重要特性&#xff0c;它是Composition API的入口点。setup() 函数用于初始化组件的状态和逻辑&#xff0c;包括定义响应式数据、方法和生命周期钩子。以下是关于setup() 函数的详细解释&#xff1a; 1. 作用与特…

解决IDEA 中出现已有类、函数找不到的情况

缓存导致部分索引失效&#xff0c;需要刷新缓存并重启idea即可 1、File > Invalidate Cache / Restart... 2、Invalidate and Restart

C# 4.List

comboBox使用的下拉框 Lsit 列表 1 创建List对象 List<string> list new List<string>(); 2 Add给list 添加元素 list.Add("吃饭"); list.Add("睡觉"); list.Add("打豆豆"); 3 删除一个元素 list.Remove("吃饭"); // 删…

【精简版】jQuery 中的 Ajax 详解

目录 一、概念 二、jQuery 发送 GET 请求 三、jQuery 发送 POST 请求 四、$.ajax() 方法 1、含义 2、settings 选项 ① type 属性 ② async 属性 ③ headers 属性 ④ contentType 属性 ⑤ processData 属性 ⑥ data 属性 ⑦ timeout 属性 ⑧ beforeSend(jqXHR) 方…

聊聊常见的分布式ID解决方案

highlight: xcode theme: vuepress 为什么要使用分布式ID&#xff1f; 随着 Web 开发技术的不断发展&#xff0c;单体的系统逐步走向分布式系统。在分布式系统中&#xff0c;使用分布式 ID(Distributed IDs)主要是为了在没有单点故障的情况下生成唯一标识符。这些唯一标识符在很…

C++【OpenCV】图片亮度色度归一化

#include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;int main() {Mat image imread("SrcMF.jpg");// 灰度、Gamma归一化亮度cv::Mat m_gray;cv::cvtColor(image, m_gra…

Linux-CentOS7忘记密码找回步骤

虚拟机版本 一、进入开机页面&#xff0c;先按上下&#xff08;↑↓&#xff09;键&#xff0c;以免系统自动启动。 二、按“e”键进入编辑页面,找到如下图位置&#xff0c;输入&#xff1a;init/bin/sh 按CTRLX 进入单用户模式。 三、 输入 mount -o remount,rw / 然后按 ent…

为什么局部内部类和匿名内部类只能访问局部final变量?

简述final final修饰的类表示不可被继承&#xff0c;修饰方法表示此方法不可以被子类覆盖&#xff0c;但是可以被重载&#xff0c;修饰变量表示变量一旦被赋值就不可以更改它的值&#xff08;基础类型是值&#xff0c;引用类型是地址&#xff09; 修饰成员变量 a. 如果final修…

【ARMv8/v9 GIC- 700 系列 2 -- GIC-700 上电控制寄存器 GICR_PWRR】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC-700 上电GICR_PWRR 寄存器字段介绍GICR_PWRR 功能说明GICR_PWER 代码配置GICR_PWRR 使用场景GICR_PWRR 注意事项GIC-700 上电 GICR_PWRR(功耗寄存器)是ARM GICv4架构中用于控制GIC-700是否可以关闭电源的寄存器。它通过几个位…

sql server插入数据或查询慢如何诊断?

SQL Server插入数据慢的原因可能有多种&#xff0c;具体原因需要根据实际情况进行分析。以下是一些常见的原因及解决办法&#xff1a; 1. 索引问题 大量索引&#xff1a;在插入数据时&#xff0c;SQL Server需要更新所有相关的索引&#xff0c;这会增加插入操作的开销。 解决…

git-常用基础指令

一、基本指令 1. 配置用户名和邮箱 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"2. 初始化仓库 git init3. 克隆仓库 git clone <repository_url>4. 查看当前状态 git status5. 添加文件…

iPython与Matplotlib:数据可视化的秘籍

iPython与Matplotlib&#xff1a;数据可视化的秘籍 前言 欢迎来到"iPython与Matplotlib&#xff1a;数据可视化的秘籍"教程&#xff01;无论你是数据可视化新手还是希望提升技能的专业人士&#xff0c;这里都是你开始的地方。让我们开始这段数据可视化之旅吧&#…

C++:opencv将彩色图转换为灰度图

在C中&#xff0c;使用OpenCV库将彩色图转换成灰度图是一个相对直接的过程。你可以使用cv::cvtColor()函数&#xff0c;该函数可以将图像从一个颜色空间转换到另一个颜色空间。对于将彩色图转换为灰度图&#xff0c;你通常会从BGR颜色空间&#xff08;OpenCV中默认的彩色图像格…

Go语言并发编程-Goroutine调度

goroutine 概念 在Go中&#xff0c;每个并发执行的单元称为goroutine。通常称为Go协程。 go 关键字启动goroutine go中使用关键字 go 即可启动新的goroutine。 示例代码&#xff1a; 两个函数分别输出奇数和偶数。采用常规调用顺序执行&#xff0c;和采用go并发调用&…

Go 1.19: 性能提升与新特性

Go语言&#xff0c;以其简洁、高效和并发支持而广受欢迎。随着Go 1.19版本的发布&#xff0c;Go语言再次为开发者带来了一系列新特性和改进。本文将介绍Go 1.19的主要变化、新特性以及如何开始使用这个新版本。 Go 1.19 简介 Go 1.19是Go语言的一次重大更新&#xff0c;它在性…