JVM堆内存介绍

news2024/10/7 10:18:27

0e7d2e3ecb114882a4455509d7e868dc.jpg一:JVM中内存

 

 

JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用运行线程方法

 

存放本地暂时变量与线程中方法运行时候须要的引用对象地址。

 

JVM全部的对象信息都

 

存放在堆内存中。相比栈内存,堆内存能够所大的多,所以JVM一直通过对堆内存划分

 

不同的功能区块实现对堆内存中对象管理。

 

堆内存不够最常见的错误就是OOM(OutOfMemoryError)

 

栈内存溢出最常见的错误就是StackOverflowError。程序有递归调用时候最easy发生

 

 

 

二:堆内存划分

 

在JDK7以及其前期的JDK版本号中。堆内存通常被分为三块区域Nursery内存(young 

 

generation)、长时内存(old generation)、永久内存(Permanent Generation for 

 

VM Matedata),显演示样例如以下图:

 

 

 

 

 

当中最上一层是Nursery内存,一个对象被创建以后首先被放到Nursery中的Eden内

 

存中,假设存活期超两个Survivor之后就会被转移到长时内存中(Old Generation)中

 

永久内存中存放着对象的方法、变量等元数据信息。通过假设永久内存不够。我们

 

就会得到例如以下错误:

 

java.lang.OutOfMemoryError: PermGen

 

而在JDK8中情况发生了明显的变化,就是普通情况下你都不会得到这个错误,原因

 

在于JDK8中把存放元数据中的永久内存从堆内存中移到了本地内存(native memory)

 

中,JDK8中JVM堆内存结构就变成了例如以下:

 

 

 

 

 

这样永久内存就不再占用堆内存。它能够通过自己主动增长来避免JDK7以及前期版本号中

 

常见的永久内存错误(java.lang.OutOfMemoryError: PermGen),或许这个就是你的

 

JDK升级到JDK8的理由之中的一个吧。

 

当然JDK8也提供了一个新的设置Matespace内存

 

大小的參数。通过这个參数能够设置Matespace内存大小,这样我们能够依据自己

 

项目的实际情况,避免过度浪费本地内存,达到有效利用。

 

 

 

-XX:MaxMetaspaceSize=128m 设置最大的元内存空间128兆

 

 

 

注意:假设不设置JVM将会依据一定的策略自己主动添加本地元内存空间。

 

假设你设置的元内存空间过小,你的应用程序可能得到下面错误:

 

java.lang.OutOfMemoryError: Metadata space

 

 

 

java1.8之前内存区域分为方法区、堆内存、虚拟机栈、本地方法栈、程序计数器。 下图所示:

 

 

 

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。很多人都更愿意把方法区称为“永久代”(Permanent Generation)。从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把原本放在方法区中的静态变量、字符串常量池等移到堆内存中。

 

在jdk1.8中,永久代已经不存在,存储的类信息、编译后的代码数据等已经移动到了元空间(MetaSpace)中,元空间并没有处于堆内存上,而是直接占用的本地内存(NativeMemory)。

 

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小: 

  -XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。 

  -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。 

  除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性: 

  -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集 

  -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集 

 

 

 

注意:如果不设置JVM将会根据一定的策略自动增加本地元内存空间。

 

如果你设置的元内存空间过小,你的应用程序可能得到以下错误:

 

java.lang.OutOfMemoryError: Metadata space

 

 

 

在Java7之前,HotSpot虚拟机中将GC分代收集扩展到了方法区,使用永久代来实现了方法区。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载。而在Java8中,已经彻底没有了永久代,将方法区直接放在一个与堆不相连的本地内存区域,这个区域被叫做元空间。 

 

 

 

常量池里存储着字面量和符号引用。

 

 符号引用包括:1.类的全限定名,2.字段名和属性,3.方法名和属性。

 

字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。)。 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身),也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。

 

 

 

1.字符串池常量池在每个VM中只有一份,存放的是字符串常量的引用值,存放在堆中.

2.class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量的符号引用。

3.运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。

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

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

相关文章

图为科技应邀出席第38届中国计算机应用大会

第38届中国计算机应用大会(CCF NCCA 2023)暨2023年人工智能应用学术会议于7月16日-19日在苏州召开。 本次会议由中国计算机学会(CCF)主办,CCF计算机应用专业委员会承办,苏州大学、苏州科技大学、南京理工大学等单位协办&#xff0…

数字孪生搭高台,温控节能唱新戏

“孪生”的基本思想最早起源于1969年的阿波罗计划,通过留在地球上的航天器对发射到太空的航天器进行工作状态的仿真模拟,进而辅助航天员完成决策,减少各种操作结果的未知性。 从2002年开始,数字孪生的概念和定义在不同领域逐渐被提…

三种数据库架构模式

数据架构设计模式 数据架构主要有三种模式: Shared Everything、Shared Disk、Shared Nothing。 Shared Disk 各处理单元使用本地的私有CPU和Memory,共享磁盘系统,分布式数据库。 典型的代表是Oracle RAC、DB2 PureScale。 例如&#xf…

Navicat远程连接服务器失败 2002 - Can‘t connect to server on ...(10060)

报错如下: 2002 - Can’t connect to server on ‘192.168.33.59’(10060) 解决方案: 下面列举可能出现的几种情况: 1.防火墙原因,需要关闭防火墙 systemctl stop firewalld systemctl disable firewalld2.数据库未开启&#x…

基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树

目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 情绪识别是一种重要的情感分析任务,旨在从文本、语音或图像等数据中识别出人的情绪状态,如高兴、悲伤、愤怒等。本文介绍一种基于…

Linux软件/系统看门狗嵌入式独立看门狗

updating linux看门狗的使用 freertos看门狗的使用 一、看门狗简介 看门狗,又叫Watchdog timer(看门狗定时器)是一种电子计时器,其用于检测和恢复计算机故障。一般有一个输入和一个输出,其中的输入叫做喂狗( kickingthe dog or service the dog)。输出一般连接到另外一个部…

HP暗影精灵9 Plus OMEN 17.3英寸游戏本17-ck2000出厂Win11系统原厂预装OEM系统

惠普暗影9笔记本电脑原装Windows11系统ISO镜像包 适用机型17-ck2000TX,17-ck2001TX,17-ck2002TX,17-ck2003TX 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家、OMEN Command Center等预装程序 所需要工具:32G或以上的U盘 文件格式:IS…

软件外包开发可行性调研

软件开发的可行性调研对软件工程来说是必要的,也是开启软件工程建设的第一步。在进行软件外包开发的可行性调研时,需要调查的内容比较多,同时调查研究并不是一次性完成的任务,而是一个持续过程,应随着项目进行进行调整…

FPGA开发:按键消抖

按键是FPGA开发板上的重要交互元件,因为按键的内部的结构设计,在按下和松开按键时,按键会无法避免地产生机械抖动,因此要对按键输入进行特殊处理,否则可能会因为机械抖动产生意外的重复触发。 按键消抖有很多方法&…

Git-分布式版本控制工具

Git仓库:本地和远程 获取git仓库: 本地初始化Git仓库(创建空目录,右键git bansh,执行git init)远程仓库克隆,git clone 远程仓库地址 版本库:.git隐藏文件夹,储存配置信…

【C++初阶】:优先队列(仿函数)

优先队列 一.基本使用二.模拟实现三.仿函数1.优先队列里的使用2.概念3.模拟 一.基本使用 优先队列的底层默认是使用vector构造的,也就是使用数组模拟(二叉树)堆。并且默认是按大堆存放数据(也就是父节点>子节点,左节…

51单片机串口

该部分的笔记来自视频教程链接https://www.bilibili.com/video/BV1bt4y197NR/?spm_id_from333.788&vd_sourceb91967c499b23106586d7aa35af46413 一、51单片机串口基础介绍 一般的应用层的协议中采用和校验或CRC校验,而奇偶校验还是解决基本通信中的帧格式中的…

练习时长两年半的网络安全防御“second”

目录 1.防火墙的安全区域 Trust区域 DMZ区域 Untrust区域 Local区域 安全区域的受信任程度与优先级 2. 安全策略 ​编辑 安全域间、安全策略与报文流动方向 安全域间是用来描述流量的传输通道,它是两个“区域”之间的唯一“道路”。如果希望对经过这条通 …

C++初阶 - 4.类和对象(下)

目录 1.再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 ---- 是构造函数的一部分 1.3 explicit 关键字 2.static成员 2.1概念 2.2 特性 3.友元 3.1友元函数 3.2 友元类 4.内部类 5.再次理解类和对象 1.再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0…

Hadoop中HDFS的架构

一、Switch语句 语法规则: ①语句中的变量类型可以是byte、short、int或者char;从javaSE5开始支持枚举类型; javaSE7开始,switch支持String。 ②没有break时,后续case的语句都会执行 二、修饰符 访问修饰符 Java中&#xff0c…

机器人导航(2):导航实现

文章目录 SLAM建图gmapping简介gmapping节点说明gmapping使用 地图服务map_server简介map_server使用之地图保存节点(map_saver)map_server使用之地图服务(map_server)map_server节点说明地图读取地图显示 定位amcl简介amcl节点说明订阅的Topic发布的Topic服务调用的服务参数坐…

prometheus直方图实践

目录 1.简介 2.方案 1.简介 Prometheus提供了Counter、Gauge、Histogram、Summary四类指标(详见Metric types | Prometheus),可以通过"github.com/prometheus/client_golang/prometheus"自定义采集指标、注册、采集数据、发布UR…

gerrit 提交搞了一天的账号密码

搞了一整天的账号密码怎么输入都不对 以为输入了也不对,查找各种文档也不太行 参考也不太行: https://blog.csdn.net/qq_43279637/article/details/103595122 最后发现 是使用了git clone http 脑残方式,正确应该使用 git clone ssh 就可以…

XILINX ZYNQ 7000 AXI总线 (三) AXI GPIO

一步一步来搭建一下AXI GPIO 创建ZYNQ 后先来看下各个接口的含义 1.M_AXI_GP0_ACKL和M_AXI_GP0 ZYNQ的PS部分是有一个GP接口,32 Bit 的AXI master接口,默认是打开的,如果双击绿框可以看到是打开的 M_AXI_GP0 就是AXI的主机接口&#xff…

电脑C盘空间大小调整 --- 扩容(扩大/缩小)--磁盘分区大小调整/移动

概述: 此方法适合C盘右边没有可分配空间(空闲空间)的情况,D盘有数据不方便删除D盘分区的情况下,可以使用傲梅分区助手软件进行跨分区调整分区大小,不会损坏数据。反之可直接使用系统的磁盘管理工具进行调整…