`

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关键字修饰的方法,这里就不赘述了。

jvm笔记八-买球官网平台

在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?

现在再回过头,来看看堆内存,是不是更清晰了。

编辑

思路:

写个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)一起继续学习。

0
3
分享到:
|
评论

相关推荐

    深入虚拟机---jvm调优总结(摘自网上网上大牛分享),主要是详细介绍了gc的收集,觉得不错。

    如何配置jvm参数,并且调优,适合各路开发者,

    jvm优化3(tomcat参数调优,jvm参数调优,jvm字节码,代码优化),供大家查阅!!!!!!!!!!!!!!

    java_jvm_参数_-xms_-xmx_-xmn_-xss_调优总结.pdf java_jvm_参数_-xms_-xmx_-xmn_-xss_调优总结.pdf

    java应用jvm原理及参数调优深入讲解视频.1 java应用jvm原理及参数调优深入讲解视频.2 java应用jvm原理及参数调优深入讲解视频.3 java应用jvm原理及参数调优深入讲解视频.4 java应用jvm原理及参数调优深入讲解视频.5 ...

    jvm优化3(tomcat参数调优,jvm参数调优,jvm字节码,代码优化).zip

    一.java内存结构 2 二 垃圾收集算法: 3 三 jvm参数 4 四 jvm的垃圾回收集器 7 五 常用参数设置 7

    详细讲述了jvm参数的调优方法和步骤.并描述了gc垃圾回收机制的瓶颈,以及出现内存溢出的原因。

    nginx-upstream-jvm-route-0.1.tar.gz 用来实现nginx tomcat 集群session复制的问题!

    jvm虚拟机参数调优,tomcat调优,内含代码测试,性能测试讲解

    jvm实战-jvm调优案例分析与myeclipse性能调优实战

    tomcat7安装使用及jvm连接数参数调优

    对jvm进行一个较为全面的了解,更好掌握jvm的实现原理,以及调优的常用的方法。希望大家能够受益~

    nginx-upstream-jvm-route 支持nginx版本1.15 解决nginx: [emerg] invalid parameter "srun_id=tomcat1" 问题

    1.1 jvm调优总结-序3 1.2 jvm调优总结(一)-- 一些概念...1.9 jvm调优总结(八)-典型配置举例2 31 1.10 jvm调优总结(九)-新一代的垃圾回收算法34 1.11 jvm调优总结(十)-调优方法38 1.12 jvm调优总结(十一)-反思

    tomcat-jvm参数调优配置,以及常用参数的配置方式。并发数优化

    jvm调优总结 -xms -xmx -xmn -xss jvm调优总结 -xms -xmx -xmn -xss

    jvm_gc_-调优总结

    jvm 参数调优实践,有代码可供参考,详细调优比较!

    mini-jvm in rust实现jvm,jvm-rs-main.zip

global site tag (gtag.js) - google analytics