类似“不可持续的内存分配率”和“你需要维持低的内存分配率”这样的短语看起都像是属于 Java 冠军(Java Champions)的专有词汇。复杂、吓人、充满神秘色彩。

这些词语经常出现,但是如果你深入了解这些概念,它的神秘色彩就烟消云散了。这篇文章将试着揭开上面这些术语的神秘面纱。

什么是内存分配率?我们为什么要关心它?

内存分配率是指单位时间内分配内存的总数量,通常用 MB/sec 表示。不过,如果你乐意,也可以用 PB/year 来表示。这就是全部的内容——没那么神秘,仅仅是指 Java 代码在一定时期内内存分配的大小。

不过只知道这一点没有太大的意义。如果你能忍受,我将带你在实践中应用这个概念。高分配率意味着你的程序存在性能问题。从实践角度来说,主要影响是使得 GC(Garbage Collection) 成为了瓶颈。从硬件角度来说,即使常用的硬件也能支持每核几 GB/sec 的分配率。而实际上,你的分配率不会超过 1 GB/sec/core。所以你可以放心,硬件基本不可能成为应用的瓶颈。

所以,当我们关注 GC 的时候,就可以和真实情况类比了——如果你创建很多的成员,之后就需要做很多清理工作。我们知道,JVM 建立垃圾回收机制需要知道内存分配率,由此来改变 GC 执行的频率和 GC 停顿的时间。

内存分配率的测量

我们开始测量内存分配率。我们设置 JVM 参数:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps 来打开 GC 日志。现在,JVM 开始以下列方式记录 GC 停顿日志:

1
2
3
0.291: [GC (Allocation Failure) [PSYoungGen: 33280K->5088K(38400K)] 33280K->24360K(125952K),0.0365286secs] [Times: user=0.11sys=0.02, real=0.04secs]
0.446: [GC (Allocation Failure) [PSYoungGen: 38368K->5120K(71680K)] 57640K->46240K(159232K),0.0456796secs] [Times: user=0.15sys=0.02, real=0.04secs]
0.829: [GC (Allocation Failure) [PSYoungGen: 71680K->5120K(71680K)] 112800K->81912K(159232K),0.0861795secs] [Times: user=0.23sys=0.03, real=0.09secs]

根据上述 GC 日志,我们可以从年青代(Young Generation)上一次回收后的大小及下一次回收前的大小来计算出分配率。利用上面的例子,我们可以抽取出如下信息:

  • JVM 启动291毫秒后,加载的对象大小是33280K。第一次 minor GC 清理后,年青代剩余的对象大小是 5088K。
  • 启动446毫秒后,年青代占用的空间已经增长到38368K,并触发了下一次 GC,这次 GC 后,年青代占用的空间减少到5120K。
  • 启动829毫秒后,年青代的大小是71680K,GC 后再次减少到 5120K。

这些数据用如下的表格展示,计算出来的内存分配率添加年青代占用空间的后面:

事件 时间 添加年轻代之前 添加年轻代之后 已分配 分配率
1st GC 291ms 33,280KB 5,088KB 33,280KB 114MB/sec
2nd GC 446ms 38,368KB 5,120KB 33,280KB 215MB/sec
3rd GC 829ms 71,680KB 5,120KB 66,560KB 174MB/sec
Total 829ms N/A N/A 133,120KB 161MB/sec

有了这些信息,我们就可以说对这个特定软件,在测量期间的内存分配率是161 MB/sec。

影响分析

现在,通过这些信息,我们能够明白改变内存分配率,可以增加或减少 GC 停顿的频率,从而影响应用的吞吐率。首先,也是最重要的,你应该注意只有 Minor GC 清理年青代的停顿才会受影响。老年代(Old Generation)的清理,无论是频率还是持续时间都不直接受分配率的影响,但是受增长率(promotion rate)的影响,增长率是下一篇文章讨论的术语。

了解这些后,我们就只需要关注 Minor GC 的停顿,我们应该更进一步的去理解在年青代内部内存池的不同之处。因为内存分配是在 Eden 区中进行的,我们可以直接看 Eden 区的大小对分配率的影响。所以我们可以假设,随着 Eden 区的增长,minor GC 停顿频率频率会降低,应用就能满足更快的分配率。

事实上,当我们采用不同的 Eden 区大小(-XX:NewSize -XX:MaxNewSize 和 -XX:SurvivorRatio参数)来执行相同的实例时,我们可以看到两种不同的内存分配率:

  • 设置 Eden 区为100M,运行上面的例子,内存分配率降低到100MB/sec。
  • 增加个 Eden 区到1GB,增加的内存分配率接近 200MB/sec。

如果你仍然疑惑这为什么是对的——假设减少应用线程 GC 的频率,你就可以做更多的有用的工作。这样就可以生成更多的对象,从而支持更高内存分配率。

现在,在你得出“ Eden 区越大越好”的结论之前,你应该注意内存分配率可能不会直接关联应用的真实吞吐率。并且这只是一种侧重吞吐率的技术测量。内存分配率只影响 Minor GC 暂停应用线程的频率,但从整体的影响来说,你还需要考虑 Major GC 的停顿以及应用提供的业务操作。

原文链接:  plumbr  翻译:  ImportNew.com  -  paddx
译文链接:  http://www.importnew.com/16803.html

什么是Java对象分配率?相关推荐

  1. tlab java_Java中的逃逸分析和TLAB以及Java对象分配

    我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并一定分别在所 ...

  2. JAVA 对象分配过程

    1. 在JAVA中,对象的分配一般使用new关键字.  当虚拟机遇到new指令时,会先检查该指令所包含的参数在常量池中能否找到一个符号引用,并检查该符号引用所代表的类是否被加载.解析和初始化. 如果没 ...

  3. Java对象分配原理

    Java对象模型: OOP-Klass模型 在正式探讨JVM对象的创建前,先简单地介绍一下hotspot中实现的Java的对象模型.在JVM中,并没有直接将Java对象映射成C++对象,而是采用了oo ...

  4. 深入理解JVM之对象分配流程

    Java对象分配流程 栈上分配 参考: https://www.cnblogs.com/BlueStarWei/p/9358757.html (讲的很好) https://blog.csdn.net/ ...

  5. java 对象逃逸 解决_Java中的逃逸问题心得

    大家一般认为new出来的对象都是被分配在堆上,但这并不是完全正确,通过对Java对象分配过程分析,我们发现对象除了可以被分配在堆上,还可以在栈或TLAB中分配空间.而栈上分配对象的技术基础是逃逸分析和 ...

  6. 8.JVM 关于对象分配在堆、栈、TLAB的理解

    引言 我们知道,一般在java程序中,new的对象是分配在堆空间中的,但是实际的情况是,大部分的new对象会进入堆空间中,而并非是全部的对象,还有另外两个地方可以存储new的对象,我们称之为栈上分配以 ...

  7. java对象的内存分配

    (1) 寄存器(register).这是最快的保存区域,这是主要由于它位于处理器内部.然而,寄存器的数量十分有限,所以寄存器是需要由编译器分配的.我们对此没有直接的控制权,也不可能在自己的程序里找到寄 ...

  8. Java 对象都是在堆上分配内存吗?

    为了防止歧义,可以换个说法:Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定.满足特定条件时,它们可以在(虚拟机)栈上分配内存. JVM内存结构很重要,多多复习 这和我们平时的理解可能有 ...

  9. JAVA对象在JVM中内存分配

    如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java对象在内存中的空间分配. public class Student {private String name ...

最新文章

  1. juniper M320路由器基本配置
  2. PHP从入门到跑路(二),基础语法,数据库操作
  3. 五皇后问题 java_Java的5个古怪问题
  4. 知道接口地址 如何传数据_如何选显示器连接线?四种主流接口要知道
  5. C++之异常处理探究
  6. webstorm+nodejs环境中安装淘宝镜像
  7. Android学习之路-----倒计时欢迎界面(更有条理)
  8. vc对图像进行平移,转置等几何变换
  9. 数据挖掘十大算法之Apriori算法
  10. AnyLogic 教程JobShop—Prcess Modeling Library
  11. 基于消防GIS系统的智慧消防应用
  12. emmc5.1, ufs2.0, ufs3.0
  13. 基于tensorflow和卷积神经网络的电影推荐系统的实现
  14. 【云图】如何制作东莞酒店地图?
  15. qt 获取当前程序运行路径_Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法...
  16. 基本的计算机理论知识试题及答案,计算机的基础知识试题及答案
  17. Antivirus Zap Pro 3.9.4.1 推荐的Mac杀毒软件
  18. 消防给水及消火栓系统技术规范_消防给水系统需要进行分区给水的分析
  19. 网站管理助手安装多版本php
  20. 基于Verilog下的串口通信实验_Devin_新浪博客

热门文章

  1. hibernate 三种查询方式源码跟踪及总结
  2. C语言中嵌入正则表达式
  3. 根据 *_train_test.prototxt文件生成 *_deploy.prototxt文件
  4. Spring5源码 - 04 invokeBeanFactoryPostProcessors 源码解读_1
  5. Quartz-任务调度概述及Quartz(2.2.X)快速入门
  6. Spring JDBC-数据连接泄露解读
  7. 数据存储之-SQLite数据库一
  8. 基础JavaScript_Day01
  9. 爬虫学习笔记(八)—— Scrapy框架(三):CrawSpider模板
  10. python 珠玑妙算