2-1JVM内存分析

news2024/12/24 0:30:02

一、java类的生命周期

1.加载(把class文件的数据加载到jvm内存的元空间)
2.连接
	验证	验证语法是否正确
	准备	给静态变量做内存分配和默认值分配
	识别	解析常量池
3.初始化
	静态变量赋初始值
	静态代码块执行
4.使用(被jvm使用)
5.卸载(如果在程序中没有再使用到这个类,这个类会被从jvm内存中清除)

二、程序执行过程

在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程

image-20210422085309803

image-20230201142347643

Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载完毕后,交给执行引擎执行。在整个执行的过程中,JVM 会用一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区,也就是常说的 JVM 内存。

​ 所以,当我们在谈 JVM 内存区域划分的时候,其实谈的就是这块空间——运行时数据区。

三、运行时数据区

运行时数据区可以分为以下几个部分

image-20210422085506696

01、程序计数器

​ 程序计数器(Program Counter Register)所占的内存空间不大,很小一块,可以看作是当前线程所执行的字节码指令的行号指示器

02、Java 虚拟机栈

Java 虚拟机栈中是一个个栈帧,每个栈帧对应一个被调用的方法。当线程执行一个方法时,会创建一个对应的栈帧,并将栈帧压入栈中。当方法执行完毕后,将栈帧从栈中移除。栈遵循的是后进先出的原则,所以线程当前执行的方法对应的栈帧必定在 Java 虚拟机栈的顶部。

image-20210422085620248

1)局部变量表

顾名思义,就是用来存储方法中的局部变量的,包括方法的参数。对于基本数据类型的变量,直接存储变量的值;对于引用类型的变量,存储的是对象的引用。局部变量表的大小在编译期间就确定了,程序执行期间,它的大小是不会改变的。

2)操作数栈

表达式的计算是在操作数栈中完成的。当一个方法刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是入栈/出栈操作。例如,在做算术运算的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。

3)指向运行时常量池的引用

当前方法所属的类的运行时常量池的引用,引用其他的常量类或者使用字符串常量池中的字符串。

4)方法返回地址

方法执行完(不论是正常执行还是发生了异常)后需要返回到方法被调用的位置,程序才能继续执行,方法返回地址保存一些用来帮助恢复上层方法的执行状态的信息。

5)动态链接

每个栈帧都包含了一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。

03、本地方法栈

本地方法栈与 Java 虚拟机栈类似,区别是本地方法栈执行的是本地方法,也就是带有 native 关键字修饰的方法。

04、堆

堆是所有线程共享的一块内存区域,在 Java 虚拟机启动的时候创建,用来存储对象(数组也是一种对象)。

以前,Java 中“几乎”所有的对象都会在堆中分配,但随着 JIT(Just-In-Time)编译器的发展和逃逸技术的逐渐成熟,所有的对象都分配到堆上渐渐变得不那么“绝对”了。从 JDK 7 开始,Java 虚拟机已经默认开启逃逸分析了,意味着如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。

05、元空间

JDK 8 的时候,原有的方法区(更准确的说应该是永久代)被彻底移除,取而代之的是元空间。

和堆一样,是线程共享的区域,它用来存储已经被 Java 虚拟机加载的类信息、常量、静态变量等。

JDK 7 的时候,字符串常量池从方法区中拿出来放到了堆中,运行时常量池中的其他东西还在方法区中。

JDK 8 的时候,移除了永久代,也就是说方法区不存在了,取而代之的是元空间。也就意味着字符串常量池在堆中,运行时常量池跑到了元空间。

四.堆的划分

堆内存如何划分,如何回收这些内容对象,有哪些回收算法?

image-20220323102238295

说明:

有GC垃圾收集器回收这些对象;
老年代一般采用标记清除算法;新生代一般复制算法

五.实战:内存溢出的定位与分析

内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等等,都可能会造成内存溢出。如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug。首先,我们得先学会如何定位问题,然后再进行分析。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析。

接下来,我们模拟内存溢出的场景。

5.1 内存溢出场景

编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程序能够正常执行,最后打印ok。

import java.util.*;
public class TestJvmOutOfMemory {
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            String str = "";
            for (int j = 0; j < 1000; j++) {
                str += UUID.randomUUID().toString();
            }
            list.add(str);
        }
        System.out.println("ok");
    }
}

5.2 使用如下软件监控jvm进行调优

image-20230202163835177

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

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

相关文章

跳槽前恶补面试题,成功上岸华为,拿到33k的测开offer

不知不觉间&#xff0c;时间过得真快啊。作为一名程序员&#xff0c;应该都清楚每年的3、4月份和9、10月份都是跳槽的黄金季&#xff0c;各大企业在这段时间会大量招聘人才。在这段时间里&#xff0c;有人欢喜有人悲。想必各位在跳槽前都会做好充足的准备&#xff0c;同样做足了…

还是你厉害啊,用 Python 下载高清视频真速度

今天我们来进行 Python 爬虫实战&#xff0c;学以致用嘛&#xff0c;这也是咱们不断学习的动力&#xff01; 我们要爬取的网站是YY直播&#xff0c;不知道有多少朋友知道&#xff0c;反正小编以前是不知道的&#xff0c;真的不知道~ 那么为什么我们选择这个网站呢&#xff0…

【5.1】Nacos注册中心--认识和安装Nacos/快速入门

【5.1】Nacos注册中心--认识和安装Nacos/快速入门1 认识Nacos2 安装Nacos3 服务注册到Nacos4 总结1 认识Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 2 安装Nacos 建议大家下载Typora之…

Grafana 系列文章(五):Grafana Explore 查询管理

&#x1f449;️URL: https://grafana.com/docs/grafana/latest/explore/query-management/ &#x1f4dd;Description: Explore 中的查询管理 为了帮助调试查询&#xff0c;Explore 允许你调查查询请求和响应&#xff0c;以及查询统计数据&#xff0c;... Explore 中的查询管理…

CTFshow_萌新--密码篇

一、萌新认证进群大喊萌新码&#xff0c;即可获得。。。。。二、萌新密码1密文&#xff1a;53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D并给上了一下工具包。①密文首先Hex解码得到串&#xff1a;S1lkZjBhM2Vi…

项目管理工具——Maven

目录儿一、Maven简介二、下载与安装环境配置三、Maven基础概念3.1 仓库3.2 坐标在中央仓库网获取依赖坐标3.3 本地仓库配置3.4 远程仓库配置一、Maven简介 Maven是用java语言编写的。Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型(PO…

商城项目的表设计

零、前言 1、优惠卷设计 电商项目中的优惠券系统这样设计&#xff0c;同事直呼 666 &#xff01; 2、SPU和SKU的定义及他们之间的关系 SPU全称Standard Product Unit&#xff0c;即标准化产品单元。 简单理解就是某一种产品。 SKU全称Stock Keeping Unit&#xff0c;即库存量…

PHP多进程(三) 理解多进程

本篇是一个过渡篇 ( 重在理解多进程 以及进程执行过程和进程执行后的数据 ) 废话不多说直接上代码 运行下面代码前 可以先想想有几个进程以及$count 是多少? <?php// 开始多进程 $count 10; for ($i0;$i<2;$i){epd(我是循环记数值.$i);$pid pcntl_fork(); // fork…

使用DBeaver 编辑链接达梦数据库

1、点击 “数据库”&#xff0c;选择“驱动管理器” 2、选择“新建” 3、 设置驱动 驱动名称&#xff1a;自定义 这里命名为“DM” 类名&#xff1a; dm.jdbc.driver.DmDriver URL模板&#xff1a;jdbc:dm://{host}:{port} 或jdbc:dm://{host}[:{port}]/[{database}] 默认端…

根据java反射-手写springIoC

我们都知道&#xff0c;Spring框架的IOC是基于Java反射机制实现的&#xff0c;下面我们先回顾一下java反射。 回顾Java反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能…

ResNet简单介绍+Pytroch代码实现

文章目录一、背景介绍二、ResNet网络结构1.ResNet34结构示意图2.不同层数的ResNet采用的Block结构。3.不同层数的ResNet网络结构示意图4.实验结果三、Pytroch代码1.代码简单介绍2. 常见ResNet网络代码汇总四、参考文献一、背景介绍 问题&#xff1a; 当网络层数越来越深时&…

Vulkan 编程指南记录

1 创建Vulkan instance 利用CreateInfo结构体指定硬件驱动需要使用的程序信息&#xff0c;这些信息可能会被作为驱动程序的优化依据指定程序需要使用的全局扩展。比如和窗口系统交互的扩展&#xff08;通过glfw库的接口获取&#xff09;。可以通过vkEnumerateInstanceExtensio…

一篇文章全知全能SpringBoot Bean的生命周期

系列文章&#xff1a;https://gamwatcher.blog.csdn.net/article/details/124603278这篇文章也是计划了蛮久的了&#xff0c;一直没写&#xff0c;正所谓大道行思&#xff0c;取则行远&#xff0c;总结也是学习的一种方式。&#x1f648;记得看目录哦1、关于spring1.1 什么是sp…

Spring Security在前端后端分离项目中的使用

Spring Security 是 Spring 家族中的一个安全管理框架&#xff0c;可以和Spring Boot项目很方便的集成。Spring Security框架的两大核心功能&#xff1a;认证和授权 认证&#xff1a; 验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。简单的理解就…

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作

文章目录1. 引言2. 结构关系3. 环境配置3.1 引入jar包3.2 创建数据源3.2 创建User实体类3.4 创建UserMapper类3.5 创建UserService类4. 操作演示5. 注意事项1. 引言 mybatis大家都有使用过&#xff0c;既面向对象又灵活可配。不友好的地方是&#xff0c;会随着使用出现大量xml…

C++之缺省参数以及C++的输入输出

文章目录前言一、缺省参数的定义二、缺省参数的分类1.全缺省参数2.半缺省参数三、缺省参数的注意事项1. 半缺省参数必须从右往左依次来给出&#xff0c;不能间接给缺省值2. 缺省参数不能在函数声明和定义中同时出现3. 缺省值必须是常量或者全局变量4. C语言不支持四、C的输入&a…

考虑实时市场联动的电力零售商鲁棒定价策略(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

JavaEE初阶第三课:网络初识

欢迎来到javaee初阶的第三课&#xff0c;这节课我会带大家来初识网络 荔枝目录1.认识IP和端口1.1 IP1.2端口2.认识协议2.1协议分层&#xff08;TCP/IP协议&#xff09;2.2封装与分用2.3两台主机之间的网络通信流程&#xff08;非同一网段&#xff09;3.其他常见名词 解释3.1客户…

电脑老是蓝屏是什么原因?怎么修复蓝屏

电脑老是蓝屏是什么原因&#xff1f;其实电脑蓝屏的原因是有很多种的&#xff0c;每个地方出问题都会导致电脑蓝屏&#xff0c;所以我们要想知道蓝屏的原因&#xff0c;那么就需要一步步的去检测&#xff0c;去排除掉一些可能&#xff0c;才能得出正确的蓝屏原因的答案。 一.什…