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、首先任务管理切换到性能选项卡,查看虚拟化是否已经启用,如果没有启用的话&…

ANDROID内存优化(大汇总——中)

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总、挑选、简化后整理而成。 所以我将本文定义为一个工具类的文章,如果你在Android开发中遇到关于内存问题,或者…

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.简单的字符串拼接…

函数⑥作用域与命名空间

尽管 JavaScript 支持一对花括号创建的代码段&#xff0c;但是并不支持块级作用域&#xff1b; 而仅仅支持 函数作用域。 function test() { // 一个作用域for(var i 0; i < 10; i) { // 不是一个作用域// count}console.log(i); // 10 }注意: 如果不是在赋值语句中&#x…

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

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

【转】Java MySQL数据类型对照

Java MySQL数据类型对照 类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述 VARCHARLNVARCHARjava.lang.String12 CHARNCHARjava.lang.String1 BLOBLNBLOBjava.lang.byte[]-4 TEXT65535VARCHARjava.lang.String-1 INTEGER4INTEGER UNSIGNEDjava.lang.Long4 …

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

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

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

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

dockerfile nginx配置

Dockerfile 代码 From hub.c.163.com/public/nginx:1.2.1 RUN rm -v /etc/nginx/nginx.confADD nginx.conf /etc/nginx/RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN chown -R www-data:www-data /var/lib/nginxRUN mkdir -p /usr/src/node-app RUN m…

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

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

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

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

iOS Coding项目片段记录(八)

继续一些小知识点&#xff0c;想起来就贴出来。 监测网络状态1.主动监测监测网络状态是否WIFI (BOOL)isEnableWIFI {return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] ! NotReachable);}是否3G (BOOL)isEnable3G {return ([[Reachability reachab…

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

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

start() 跟 run() 方法的区别和联系

这里还有个知识点是 start() 跟 run() 方法的区别和联系。 直接调用 start() 方法&#xff0c;此时线程处于一个就绪&#xff08;可运行&#xff09;的状态&#xff0c;但是并没有真正的运行。而是得到CPU 的时间片后&#xff0c;开始执行 run() 方法&#xff0c;run() 方法里…