JVM之堆和方法区

目录

1.堆

1.1 堆的结构

1.1.1 新生代(Young Generation)

1.1.2 年老代(Old Generation)

1.1.3 永久代/元空间(Permanent Generation/Metaspace)

 1.2 堆的内存溢出

1.3 堆内存诊断

1.3.1 jmap

1.3.2 jvisualvm

2. 方法区

2.1 方法区的结构


1.堆

JVM堆是Java程序运行时内存管理的核心,它主要用于存储对象实例和数组。堆内存的特点是动态分配和回收,它允许对象的创建和销毁,同时也需要注意内存泄漏和性能问题。

1.1 堆的结构

JVM堆通常被分为三个主要部分:

1.1.1 新生代(Young Generation)

新生代用于存储刚刚被创建的对象。它被分为三个区域:Eden空间和两个Survivor空间(通常称为From和To空间)。新创建的对象首先被分配到Eden空间,经过一次垃圾回收后,仍然存活的对象会被移到Survivor空间。多次循环后,仍然存活的对象会被移到年老代。

1.1.2 年老代(Old Generation)

年老代用于存储生命周期较长的对象。在新生代中经过多次垃圾回收后,仍然存活的对象会被晋升到年老代。年老代中的对象一般需要经历更多的垃圾回收周期才会被回收。

1.1.3 永久代/元空间(Permanent Generation/Metaspace)

在早期的JVM版本中,永久代用于存储类的元数据、方法信息以及静态变量。然而,由于永久代容易导致内存泄漏和溢出问题,1.8后JVM引入了元空间来代替。元空间的元数据存储在本地内存中,不再受到固定大小的限制。

jdk1.8以及之后:在堆内存中,逻辑上存在,物理上不存在(元空间使用的是本地内存),如下图:

什么是永久代和元空间?

方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现。
方法区就像是一个接口,永久代与元空间分别是两个不同的实现类。
只不过永久代是这个接口最初的实现类,后来这个接口一直进行变更,直到最后彻底废弃这个实现类,由新实现类—元空间进行替代。

 1.2 堆的内存溢出

使用如下代码:

public class a {public static void main(String[] args)  {List<String> list=new ArrayList<>();String a="hello";while (true){a=a+a;list.add(a);}}
}

执行以上代码后就会发生堆内存溢出如下图:

Java堆的大小可以通过命令行参数来配置,主要参数包括:

  • -Xms:设置堆的初始大小。
  • -Xmx:设置堆的最大大小。

通常,将这两个参数设置为相同的值可以减少堆的动态调整,提高性能。例如:

java -Xms512m -Xmx512m -jar YourApp.jar

这将设置堆的初始大小和最大大小都为512兆字节。

1.3 堆内存诊断

1.3.1 jmap

首先jps找到java运行的进程,然后jmap -heap 进程id就可以查看堆内存了,如下图:

1.3.2 jvisualvm

执行下面的代码:

public class a {public static void main(String[] args) throws InterruptedException {Thread.sleep(30000);byte[] bytes = new byte[1024 * 1024 * 50];System.out.println("-------");Thread.sleep(30000);bytes=null;System.out.println("-------");Thread.sleep(30000);}
}

然后执行jvisualvm会得出如下图:当bytes=null后进行垃圾回收后,内存占用直接减少50M。如下图:

2. 方法区

方法区(Method Area)是JVM的另一个重要内存区域,它主要用于存储类的元数据、静态变量、常量池以及方法代码。

2.1 方法区的结构

方法区包含以下主要部分:

类的元数据

方法区存储了每个类的元数据,包括类名、父类、接口、字段、方法等信息。这些信息在程序运行时起到重要作用,例如方法的调用和字段的访问。

 静态变量

静态变量属于类,不属于对象的实例。这些变量在类加载时初始化,存在于方法区中。

常量池

常量池包含了类中使用的常量,例如字符串、数字、类名等。它为类的运行时常量提供了存储空间。

方法代码

方法区存储了类中的方法代码,包括字节码指令和方法的字节码表示。这些代码在方法被调用时执行。

在早期的JVM版本中,方法区被实现为永久代。然而,由于永久代的内存泄漏和性能问题,JVM在较新的版本中引入了元空间来替代永久代。元空间的好处是不再受限于固定大小,避免了永久代引起的一些问题。如下图:

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

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

相关文章

STM32启动模式详解

文章目录 前置知识1. 单片机最小系统组成2. BOOT电路3. 三种启动模式4. 存储器映射 从主FLASH启动从系统存储区启动从SRAM启动 前置知识 1. 单片机最小系统组成 一个单片机最小系统由电源、晶振、下载电路、BOOT电路、和复位电路组成。少一个单片机都启动不了。 2. BOOT电路 …

多源最短路径算法:Floyd-Warshall算法分析

文章目录 图的邻接矩阵 一.Floyd-Warshall算法思想(基于动态规划)二.Floyd-Warshall算法接口笔记附录:单源最短路径--Bellman-Ford算法1.Bellman-Ford算法接口核心部分2.Bellman-Ford算法接口 图的邻接矩阵 namespace Graph_Structure {//Vertex是代表顶点的数据类型,Weight是…

three.js(九):内置的路径合成几何体

路径合成几何体 TubeGeometry 管道LatheGeometry 车削ExtrudeGeometry 挤压 TubeGeometry 管道 TubeGeometry(path : Curve, tubularSegments : Integer, radius : Float, radialSegments : Integer, closed : Boolean) path — Curve - 一个由基类Curve继承而来的3D路径。 De…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…

百万级并发IM即时消息系统(2)

1.用户model type UserBasic struct {gorm.ModelName stringPassWord stringPhone string valid:"matches(^1[3-9]{1}\\d{9}$)"Email string valid:"email"Avatar string //头像Identity stringClientIp s…

nepctf2023 部分web复现

目录 <1> EZJAVA_CHECKIN(shiro550) <2> 独步天下-转生成为镜花水月中的王者(环境变量提权) <3> 独步天下-破除虚妄_探见真实(Venom代理&ping%0a绕过rce&c文件描述符未关闭连接父进程修改文件权限) <4> 独步天下-破除试炼_加冕成王(tp6rceu…

【Go 基础篇】Go语言数组内存分析:深入了解内部机制

在Go语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储一系列相同类型的元素。虽然数组在应用中非常常见&#xff0c;但了解其在内存中的存储方式和分配机制仍然是一个重要的课题。本文将深入探讨Go语言数组的内存分析&#xff0c;揭示数组在内存中的布局和分配…

网络协议三要素

计算机语言作为程序员控制一台计算机工作的协议&#xff0c;具备了协议的三要素。 语法&#xff0c;就是这一段内容要符合一定的规则和格式。例如&#xff0c;括号要成对&#xff0c;结束要使用分号等。语义&#xff0c;就是这一段内容要代表某种意义。例如数字减去数字是有意…

【Hadoop】Hadoop入门概念简介

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

ES6 新特性

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理前端技术的JavaScript的知识点ES6 新特性文件上传下载&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以…

关于linux openssl的自签证书认证与nginx配置

自签文档链接 重点注意这块&#xff0c;不能写一样的&#xff0c;要是一样的话登录界面锁会报不安全 域名这块跟最后发布的一致 nginx配置的话 server {listen 443 ssl; //ssl 说明为https 默认端口为443server_name www.skyys.com; //跟openssl设置的域名保持一致s…

传送带下料口堵塞识别检测算法 yolov5

传送带下料口堵塞识别检测算法通过python基于yolov5网络深度学习框架模型&#xff0c;下料口堵塞识别检测算法能够准确判断下料口是否出现堵塞现象&#xff0c;一旦发现下料口堵塞&#xff0c;算法会立即抓拍发出告警信号。Python是一种由Guido van Rossum开发的通用编程语言&a…

Power BI 连接 MySQL 数据库

Power Query 或 Power BI 只提供了对 SQL Server 的直接连接&#xff0c;而不支持其它数据库的直连。所以第一次连接 MySQL 数据库时&#xff0c;就出现下面的错误信。 这就需要我们自己去安装一个连接器组件。https://downloads.mysql.com/archives/c-net/ 错误解决方案 我一…

【Unity】终极移动指南-注解【理解移动到抓钩,再到贪吃蛇的实现】

文章目录 【Unity】终极移动指南-注解&#xff08;从移动、抓钩到贪吃蛇&#xff09;观前提醒链接地址&#xff1a; 内容一、 transform移动操作【1】transform.position变换位置【2】transform.Translate平移【3】transform.position 类似平移的操作【4】定向矢量【5】停在指定…

定位与轨迹-百度鹰眼轨迹开放平台-学习笔记

1. 百度鹰眼轨迹的主要功能接口 百度的鹰眼轨迹平台&#xff0c;根据使用场景不同&#xff0c;提供了web端、安卓端等各种类型的API与SDK&#xff0c;本文章以web端API为例&#xff0c;介绍鹰眼轨迹的使用。 2. API使用前的准备 使用鹰眼轨迹API&#xff0c;需要两把钥匙&…

Java单元测试 JUnit 5 快速上手

一、背景 什么是 JUnit 5&#xff1f;首先就得聊下 Java 单元测试框架 JUnit&#xff0c;它与另一个框架 TestNG 占据了 Java领域里单元测试框架的主要市场&#xff0c;其中 JUnit 有着较长的发展历史和不断演进的丰富功能&#xff0c;备受大多数 Java 开发者的青睐。 而说到…

SpringBoot整合JUnit、MyBatis、SSM

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SpringBoot整合 一、SpringBoot整合JUnit二、Spri…

Vue脚手架中安装ElementUi

目录 ElementUi简介&#xff1a; ElementUi下载&#xff1a; npm 安装&#xff1a; 引入ElementUi: 测试是否引入成功&#xff1a; Element-ui官网&#xff1a;组件 | Element ElementUi简介&#xff1a; ElementUi&#xff0c;是由国内的饿了么团队开发并开源的一套为开…

砍价活动制作秘籍,打造抢购风潮

砍价活动作为一种吸引用户参与、提高销售量的营销手段&#xff0c;已经成为了电商行业的热门选择。在如今竞争激烈的市场环境下&#xff0c;如何制作出成功的砍价活动&#xff0c;成为了每位电商从业者亟需解决的问题。在本文中&#xff0c;我们将为大家揭秘一种制作成功砍价活…

基于Thinkphp6框架全新UI的AI网址导航系统源码

2023全新UI的AI网址导航系统源码&#xff0c;基于thinkphp6框架开发的 AI 网址导航是一个非常实用的工具&#xff0c;它能够帮助用户方便地浏览和管理自己喜欢的网站。 相比于其他的 AI 网址导航&#xff0c;这个项目使用了更加友好和易用的 ThinkPHP 框架进行搭建&#xff0c;…