JVM系列(八):堆(Heap)的相关知识介绍

目录

1、JVM堆的概念

2、JVM堆的特点

3、JVM堆的内部结构

3.1 组成

3.2 堆内存内部空间所占比例

3.3 永久代和元空间区别

4、堆空间的大小设置

5、堆空间垃圾回收


1、JVM堆的概念

JVM中的堆是用来存放对象的内存空间,几乎所有的Java对象、数组都存储在JVM的堆内存中。比如当我们new一个对象或者创建一个数组的时候,就会在堆内存中分配出一段空间用来存放。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,便于后续的执行。

2、JVM堆的特点

  • 堆内存的存储特点:先进先出,后进后出

  • 堆是JVM占用区域最大的一块,并且在运行时动态地分配内存大小

  • 线程共享,整个 Java 虚拟机运行过程中只会有一个堆,所有的线程都访问同一个堆。而JVM中的程序计数器、Java 虚拟机栈、本地方法栈都是一个线程对应一个。

  • 虚拟机启动的时候创建堆。

  • 堆是JVM中涉及垃圾回收的主要场所。

  • 堆可分为新生代(Eden 区:From Survior,To Survivor)、老年代。

  • JVM规范规定堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。

  • 关于 Survivor(幸存区) s0,s1 区: 复制之后有交换,谁空谁是 to。

3、JVM堆的内部结构

3.1 组成

堆内存逻辑上由新生代 ( Young )、老年代 ( Old )、永久代(Perm)组成

新生代 ( Young )包括:Eden、From Survivor(From幸存区)和To Survivor(To幸存区)组成。

JDK1.7堆内部组成

JDK1.8 堆内部组成,其中永久代(Perm)换成了元空间

堆内存逻辑角度::堆=新生代+老年代+永久代或者元空间

堆内存物理角度:由新生代 ( Young )和老年代 ( Old )组成,公式如下:

堆内存的实际大小=新生代的大小+老年代的大小

3.2 堆内存内部空间所占比例

新生代与老年代的默认比例: 1:2

新生代区的默认比例是: 8:1:1

说明:在 HotSpot 中,Eden 空间和另外两个 SurvIvor 空间缺省所占的比例是 8:1:1

3.3 永久代和元空间区别

永久代:使用的是JVM的内存;存储字符串和数组容易出现性能和内存溢出问题,大小不好指定,GC复杂度高。

元空间:不再使用JVM的内存而是使用计算机本地内存,元空间大小只受本地内存限制。

元空间的设置参数:-XX:MetaspaceSize(初始值值)和-XX:MaxMetaspaceSize(最大值)

4、堆空间的大小设置

-Xms:表示堆区的初始内存,等价于 -XX:InitialHeapSize

-Xmx :表示堆区的最大内存,等价于 -XX:MaxHeapSize

注意:如果堆中的内存大小超过 “-Xmx" 所指定的最大内存值的时候,将会抛出 OutOfMemoryError 异常。

说明:一般情况下会将 -Xms 和 -Xmx 两个参数配置相同的值,其目的是为了能够在 java 垃圾回收机制清理完堆区后避免重新分隔计算堆区的大小,从而提高性能。

默认情况下:

初始内存:物理电脑内存大小 / 64

最大内存:物理电脑内存大小 / 4

5、堆空间垃圾回收

堆空间的垃圾回收有三种机制,MinorGC,MajorGC,FullGC。

Minor GC:清理年轻代内存空间(包括 Eden 和 Survivor 区域),释放在Eden中所有不活跃的对象,释放后若Eden空间还不满足以放入新对象,JVM会试图将部分Eden中活跃对象放入Survivor区。Survivor区被用来作为Eden及老年代的中间交换区域,如果老年代空间满了,Survivor区的对象会被移到老年代,否则会被保留在Survivor区。

Major GC:清理老年代内存空间,当老年代空间不够时,JVM会在老年代进行Major GC。

Full GC:清理JVM整个堆内存空间,包括年轻代和老年代空间。

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

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

相关文章

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程,感兴趣的朋友也可以下载试一试,当然有啥问题也可以互相沟通交流! 1、首先任务管理切换到性能选项卡,查看虚拟化是否已经启用,如果没有启用的话&…

JVM系列(九):MinorGC、MajorGC、FullGC垃圾回收介绍

今天给大家继续分享MinorGC、MajorGC、FullGC相关知识,如有不对的地方欢迎指正! 1、MinorGC (新生代垃圾回收) JDK1.8 堆内部结构 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC&…

JVM系列(十):JVM垃圾回收算法相关知识

今天给大家继续分享JVM垃圾回收算法相关知识,如有不对的地方欢迎指正。 JVM垃圾回收算法主要有标记清除、复制算法、标记整理、分代收集四种,下面来逐一介绍。 1、标记清除(Mark-Sweep) 标记清除作为最基础的垃圾回收算法&#…

Java8 拼接字符串 StringJoiner

StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。 我们查看一下一下代码,试着猜一下。 1.简单的字符串拼接…

分享Git常见的项目托管平台

今天给大家分享Git常见的项目托管平台,大家一起来看看吧! 1、GitHub GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。是全球最大、代码质量最高的Git开源项目平台。遗憾的…

网络技巧:教你给路由器装上电池,断电照样可以上网

家里要是停电了,你的WiFi还能上网吗?想都不用想,“肯定不能”估计所有人都会这样回答。如果小编跟你说即使停电了,也有个小方法让你能够用WiFi,你会相信不?下面大家一起来看看吧! 其实&#xff…

电脑软件:推荐一款磁盘空间分析工具——WizTree

目录 1、WizTree是啥? 2、WizTree的特点 2.1 磁盘空间利用率分析 2.2 扫描速度快 2.3 支持多文件系统格式 2.4 树状图显示 2.5 大文件快速查找 2.5 支持文件名模糊搜索 2.6 支持导出文件和 MFT 数据 2.7 支持导入文件和 MFT 数据 2.8 命令行支持 3、总结…

分布式自增ID算法---雪花算法(SnowFlake)Java实现

分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。 算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1bit,不用,因为二进制中最高位是符号位,1表示负数&…

软件:给大家推荐一款国产非常好用的效率软件uTools

目录 1、uTools介绍 2、安装下载 3、uTools常用功能介绍 今天给大家推荐一款办公人员必备的效率软件uTools,可以大幅度提升你的生产力,感兴趣的朋友可以下载试一试,相信你一定会爱不释手。 1、uTools介绍 uTools是一款插件化,极简、跨平…

数据库知识:SQLServer创建非sa用户笔记

数据库安全是数据库运维非常重要的环节,今天给大家分享SQLServer如何创建非sa用户,并且设置数据库对应的访问权限,希望对大家能有所帮助! 1、创建登录名 1.1、创建登录名 安全性→登录名→新建登录名(鼠标右键&#xf…

微软电脑管家2.0公测版体验

前言 微软电脑管家2.0公测版本终于发布了,之前给大家分享过微软电脑管家测试版的文章,今天给大家再介绍一下微软电脑管家2.0公测版究竟带来了哪些更新,大家一起来看看吧! 安装要求 微软官方公布的安装要求是windows10的1809版本…

布隆过滤器(Bloom Filter)的原理和实现

布隆过滤器使用场景 之前在《数学之美》里面看到过布隆过滤器的介绍。那么什么场景下面需要使用布隆过滤器呢? 看下下面几个问题 字处理软件中,需要检查一个英语单词是否拼写正确在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上在网络爬虫里&a…

硬件知识:RTMP和RTSP传统流媒体协议介绍

今天给大家分享RTMP和RTSP传统流媒体协议介绍,希望对大家能有所帮助! 1、RTSP 1.1 RTSP协议介绍 RTSP (Real-Time Stream Protocol)由Real Networks 和 Netscape共同提出的,基于文本的多媒体播放控制协议。RTSP定义…

电脑知识:台式电脑应该选择品牌和组装,值得收藏

互联网时代的发展,电脑对大家日常办公、游戏、影音娱乐都是常用的设备。今天主要给大家分享一下购买台式电脑应该注重品牌还是组装,相信看完本文对你选购台式电脑提供更多的参考。 1、品牌电脑 品牌电脑就是由大品牌电脑厂商(联想、IBM、戴…

Docker基础:Docker是什么,为什么这么火

一、Docker是什么? Docker是一个开源的应用容器引擎,它基于go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的 Linux 机器上运行。Docker 的核心思想打…

信息系统 项目十大管理和五大过程

PMBOK五大过程组是什么? PMBOK五大过程组是:启动过程、规划过程、执行过程、监控过程、收尾过程。 各用一句话概括项目管理知识体系五大过程组: 1、启动过程组:作用是设定项目目标,让项目团队有事可做; 2、…