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

JVM笔记八-堆参数调优的更多相关文章

  1. JVM 堆参数调优 (四)

    堆参数调优 1.堆的结构 JAVA7 堆逻辑上分为:新生区.养老区.永久区:实际上堆只有新生区.养老区: Minor GC:轻量的垃圾回收:   Major GC(Full GC):重量级垃圾回收. ...

  2. JVM内存结构、参数调优和内存泄露分析

    1. JVM内存区域和参数配置 1.1 JVM内存结构 Java堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都 ...

  3. JVM内存模型及参数调优

    堆.栈.方法区概念区别 1.堆 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.根据垃圾回收机制的不同, Java堆有可能拥有不同的结构,最为常见的就是 ...

  4. 深入探究jvm之GC的参数调优

    在上一篇博客记录了GC的算法及种类,这篇博客主要记录一下GC的参数如何调整以提高jvm的性能. 一.堆的回顾: 堆的内存空间总体分为新生代和老年代,老年代存放的老年对象,新构造的对象分配在eden区中 ...

  5. (转)JVM参数调优八大技巧

    这里和大家分享一下JVM参数调优的八条经验,JVM参数调优,这是很头痛的问题,设置的不好,JVM不断执行FullGC,导致整个系统变得很慢,网站停滞时间能达10秒以上,相信通过本文的学习你对JVM参数 ...

  6. JVM:参数调优

    JVM:参数调优 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 前言 查看 JVM 系统默认值:使用 jps 和 jinfo 进行查看 -Xms:初始堆空间 - ...

  7. JVM探究 面试题 JVM的位置 三种JVM:HotSpot 新生区 Young/ New 养老区 Old 永久区 Perm 堆内存调优GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数法

    JVM探究 面试题: 请你弹弹你对JVM的理解?Java8虚拟机和之前的变化更新? 什么是OOM?什么是栈溢出StackOverFlowError?怎么分析 JVM的常用调优参数有哪些? 内存快照如何 ...

  8. JVM性能参数调优实践,不会执行Full GC,网站无停滞

    原文来自:http://bbs.csdn.net/topics/310110257 本文只做整理记录,供个人学习. 1 JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Full GC,导致整 ...

  9. SpringBoot-内部运行jvm参数调优

    SpringBoot JVM参数调优 这个根据服务器的内存大小,来设置堆参数. -Xms :设置Java堆栈的初始化大小 -Xmx :设置最大的java堆大小 实例参数-XX:+PrintGCDeta ...

  10. 性能测试三十六:内存溢出和JVM常见参数及JVM参数调优

    堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java h ...

随机推荐

  1. SQLServer统计采集数据库相关信息

    在MS Sql Server中可以能过以下的方法查询出磁盘空间的使用情况及各数据库数据文件及日志文件的大小及使用利用率: 1.查询各个磁盘分区的剩余空间:Exec master.dbo.xp_fixe ...

  2. P3731 题解

    简要题意是找到一条边连接使得最大团大小增加. 在补图上最大团等于最大独立集. 所以问题转化为删掉一条边使得最大独立集增加,又因为团不超过两个,所以原图是二分图,也就是使得最大匹配减少. 考虑什么样的匹 ...

  3. 图论最短路径问题与matlab实现

    上一次我们讨论了如何进行图论可视化,这一次我们通过matlab来找出图论中距离最小路径 目录 一.迪杰斯特拉算法(Dijkstra) 二.shortestpath函数用法 1.基本语法 2.参数设计 ...

  4. SpringBoot 启动时报错Unable to start embedded Tomcat

    导读 最近公司有个gradle构建的工程,需要改造成maven方式构建(点我直达).转为maven后,启动时一直报tomcat错误,最终排查是因为servlet-api这个包导致的依赖冲突,将这个依赖 ...

  5. mac svn管理工具

    App Store中搜索snailsvn 分付费(98元)和免费试用

  6. h5使用js拉起微信支付

    近期,业务需求对接了微信支付,做个总结.web网页想要拉起微信支付,有两种方法: H5下单支付 , JSAPI支付 .首先纯前端做不了微信支付,必须配合后端才能通过微信的下单请求.接下来说说这两种方法 ...

  7. 妙趣横生:利用Echarts实现SpreadJS引用从属关系的可视化魅力

    最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单 ...

  8. 我不应该用JWT的!

    一.前言 大家好呀,我是summo,之前有自学过Shrio框架,网上一搜就有SpringBoot整合Shrio+ JWT的文章,我是在学习Shrio框架的时候顺带学的JWT.后来我还看见有很多博主专门 ...

  9. log4js 的安装设置和实例

    1. 安装 yarn add log4js -D 2.设置 const log4js = require('log4js') 3.实例 var log = log4js.getLogger(); // ...

  10. [oeasy]python0117 文字的演化_埃及圣书体_象形文字_楔形文字

    埃及圣书体 回忆上次内容 两河流域 苏美尔文明 所使用的 楔形文字 不是象形文字     ​   添加图片注释,不超过 140 字(可选)   楔形文字的字型 究竟是怎么来的呢?   巴别塔 苏美尔的 ...