JVM笔记八-堆参数调优
JVM垃圾收集器(Java Garbage Collection)。本教程均在JDK1.8+HotSpot为例来讲解的.
先来看看Java7的:
再来看看Jva8的
从上图中我们可以看出,java8之后换成了元空间。那么怎么证明,堆区是有新生代、永久代、元空间三部分组成的呢?OOM这个错误我们都熟悉,那么怎么手动制造出一个OOM呢?如果16G的物理内存,JVM堆内存能够分到多少G的内存空间呢?我们带着这些疑问来一起学习吧
在Java8中,永久带已经被移除了,被一个称为元空间的区域所取代。元空间的本质和永久带类似。
元空间与永久带之间最大的区别在于:
永久带使用的是JVM的堆内存空间,但是java8以后的元空间并不是虚拟机中的空间,而是使用了本机的物理内存空间的。
因此,默认情况下,元空间大小仅受到本地内存大小的限制。类的元数据放入native memory,字符串常量池和静态类变量存放在java堆区中。这样可以加载多少类的元数据,就不在由MaxPermSize控制了,而是由系统的实际可用空间来控制。
Java默认堆区空间大小是物理内存的六十四分之一(1/64).默认最大堆空间是物理内存的1/4
想要对JVM调优的话,就先要知道自己的家底。默认情况下,当前服务的JVM最大和最小内存是多少呢?怎么查看呢?
我们可以使用Runtime这个类来查看。具体代码如下:
运行结果:
来看看凯哥本子上物理内存大小:
可以看到是24GB。
从打印的结果,我们看知道,凯哥本子上的JVM最大内存是5.4个G。也就是大约等于物理内存的1/4
JVM最小内存就是:368。大约是物理内存的1/64.
是不是证明了JVM默认堆内存最大值占用物理内存的1/4,最小值占用物理内存的1/64。没有忽悠,没有骗人吧。
看到了吗?totoalMemory方法和maxMemory方法都是native的。在前面,我们讲解JVM体系图的时候,讲解了native关键字修饰的方法,这里就不赘述了。
代码证明堆内存空间就是新生代、老年代、元空间三个区域:
在idea中通过VM options参数来操作
找到需要修改的类,然后在VM options,添加参数。如下图:
输入如下参数:-Xms1024m -Xmx1024m -XX:+PrintGCDetails
堆内存调优参数说明:
命令 | 描述 |
-Xms | 设置初始分配大小,默认物理内存的1/64 |
-Xmx | 最大分配内存,默认为物理内存的1/4 |
-XX:+PrintGCDetails | 输出详细的GC处理日志 |
修改好了之后,重新运行程序,我们看看控制台打印的信息:
修改后,我们发现堆内存的最大和最小的值是相等的。需要说明一点,在生产环境中,我们最好也把最大和最小值设置一样。这样可以减少空间差距切换从而影响了程序的稳定健壮性。
在上图2部分区域,就是打印出了jvm的详细信息。我们可以明显的看到如下几个数据:
PSYoungGen、ParOldGen、Metaspace这三个区域,正好就是我们之前文章说的,新生代、老年代、元空间这三个区域。这是逻辑上区分的。
在物理上区分是2个,分别是新生代和老年代,怎么证明呢?
还记得我们参数设置的是1024m吧。把新生代和老年代的total相加,是不是就是打印出最大和最小堆内存的值?
再来看看新生代和老年代空间占用比例:305664/699392是不是于等于1/2。
怎么证明新生代是有伊甸园区、from区、to区三部分组成呢?三部分占用比例怎么证明是8/1/1呢?请看下图:
是不是有三个区域。占用空间分别是:26214/43520/43520.是不是就是8/1/1?
现在再回过头,来看看堆内存,是不是更清晰了。
通过修改堆参数,模拟出OOM问题
思路:
写个while(true)死循环,通过设置JVM的参数,设置小一点。比如8M,然后执行就会出现OOM。或者new一个字节数组,大于配置的参数就可以。比如设置的堆内存大小是8M,那么byte[] bytes =new byte[10*1024*1024]; //10M的对象。一定会OOM
-Xms8m -Xmx8m -XX:+PrintGCDetails
运行后,查看控制台打印信息.
是不是看到了熟悉的
[Full GC (Allocation Failure) Exception in thread "main" java.lang.OutOfMemoryError: Java heap space。
下一篇文章预告:GC收集日志信息分析。欢迎大家和凯哥(凯哥java:kaigejava)一起继续学习。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
全球网络安全人才缺口首次缩小
网络行业培训和认证机构ISC²昨日(11月12日)发布的《2020年网络安全人才研究报告》显示,全球网络安全员工总数已增长至350万,安全人才缺口首次缩小,报告将技能人才差距的减少归因于大量人才涌入该领域,以及新冠疫情。 报告显示,截至2020年6月的12个月中,估计有70万名新专业人员加入了网络安全行业,岗位数升至350万。随之而来的是全球网络安全劳动力缺口减少,从去年报告的407万降至312万。 但是网络安全人才缺口依然是巨大的。为了填补这个缺口,在美国该领域的就业人数需要增长约41%,在全球范围则需增长89%。 疫情的影响 全球的网络安全专业人员都面临着巨大的压力,需要快速安全地将员工迁移到远程工作环境。 ISC²研究的数据表明,有30%的网络安全专业人员只有不到一天的期限完成到远程办公环境的迁移。 在这种前所未有的压力下,大多数组织都很好地应对了。绝大多数(92%)的受访者表示,他们的组织“有些”或“非常”有准备地进行迁移,只有18%的受访者认为这段时间内的安全事件有所增加。 即便如此,大多数(56%)的受访者表示,由于网络安全人员短缺,其组织面临更大的风险。 网络安全供应商M...
- 下一篇
什么是边缘计算和边缘人工智能?
本文将简单介绍什么是边缘计算,并讨论为什么比边缘计算如此重要,并将部分云计算的处理替换为边缘计算。同时也概要介绍边缘人工智能。 边缘计算 边缘意味着更加靠近数据源的处理技术,即将数据在数据来源的节点进行处理。传统的云计算,是将数据传输到云上,由云计算来处理,将结果再返回到边缘,这是集成处理的方法。云计算的处理方式,要求设备实时在线,且需要传输大量的数据;但对于不能经常联网,或者网络资源存在瓶颈的服务,就需要将数据在数据来源节点处理。 边缘计算包括最广泛的基础设施,包括蜂窝传感器网络、自组织、相互对等、分散云/雾、虚拟边缘计算、数据存储和恢复、自主自愈网络、分布式云应用、增强现实等等。 边缘计算与云计算 边缘意味着本地(或近本地)服务,而不是去网络中的某个地方。它可以是一台独立的物理计算机,如自动冰箱或服务器,其位置尽可能靠近源(即服务器位于该区域而不是地球的另一端)。 当需要低延迟或网络本身可能不总是可访问时,可以利用边缘,并实时做出选择。 大多数云应用程序在本地接收数据,将数据传输到云,处理并返回。边缘意味着云计算不是必须的,云端的边缘人工智能算法仍然可以在边缘测部署,在边缘操作。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Red5直播服务器,属于Java语言的直播服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16