JVM的堆的内存, 是通过下面面两个参数控制的

-Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 
-Xmx 是最大堆的大小

当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可用内存),分配新的对象,那么就会扩展堆,如果-Xmx设置的太小,扩展堆就会失败,导致OutOfMemoryError错误提示。

实际上,细节不止于此, 堆还会被分成几个不同的区域,分别应用不同的GC算法

http://unixboy.javaeye.com/blog/174173
另:

JAVA分代垃圾回收机制

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。

  年轻代:

  所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

  年老代:

  在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

  持久代:

  用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

什么情况下触发垃圾回收:

由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:

  • 年老代(Tenured)被写满
  • 持久代(Perm)被写满
  • System.gc()被显示调用
  • 上一次GC之后Heap的各域分配策略动态变化

转载于:https://www.cnblogs.com/zedosu/p/6544700.html

JVM堆内存控制/分代垃圾回收相关推荐

  1. java知识点8——垃圾回收原理和算法、通用的分代垃圾回收机制、 JVM调优和Full GC、开发中容易造成内存泄露的操作

    垃圾回收原理和算法 内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可 垃圾回 ...

  2. JAVA之JVM分代垃圾回收策略(一)

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  3. JVM调优总结(4):分代垃圾回收

    原文出处: pengjiaheng 为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java ...

  4. JVM学习笔记之四:分代垃圾回收

    2019独角兽企业重金招聘Python工程师标准>>> 如图所示,在HotSpot虚拟机中共划分有三个代:年轻代(young generation),年老代(old generati ...

  5. JVM调优总结(五)-分代垃圾回收详述1

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  6. JVM调优总结(六)-分代垃圾回收详述2

    分代垃圾回收流程示意 选择合适的垃圾收集算法 串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器 ...

  7. JVM分代垃圾回收策略的基础概念

    JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...

  8. 垃圾回收之垃圾回收算法(标记清除、标记整理、复制)、分代垃圾回收

    2. 垃圾回收算法 之前我们学习了如何判断一个对象是不是可以作为垃圾被回收,但是具体回收还需要依赖一些回收方面的算法,常见的有三种: 分别是标记清除.标记整理.和复制这三种算法,下面先从第一种标记清除 ...

  9. GC算法-分代垃圾回收

    概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. ...

最新文章

  1. my vim IDE 编辑器的配置
  2. 【PySlowFast】Facebook开源算法代码库PySlowFast,轻松复现前沿视频理解模型
  3. DARPA 计划向下一代人工智能技术投入 20 亿美元
  4. NFS mount.nfs: access denied by server while mounting 一个解决办法
  5. Linux buffer/cache异同
  6. php设计模式--单例模式
  7. Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新
  8. qstring转qchar_Qt 对QString操作
  9. 【机器视觉】 dev_inspect_ctrl算子
  10. 虚拟ip工具_针对游戏防封换IP有用吗?
  11. java,javac,javap命令
  12. MVC之 自定义过滤器(ActionFilterAttribute)
  13. 论文赏析[ACL18]基于RNN和动态规划的线性时间成分句法分析
  14. php imagick 取得psd缩略图,PHP中使用Imagick操作PSD文件实例
  15. 日语整理之 自五 他五
  16. dpdk 驱动移植叩开 kni 模块那些黑暗的角落
  17. 锤子终究走起了小米的路子
  18. HDU 1847 ——Good Luck in CET-4 Everybody!
  19. 理想电压源和理想电流源
  20. scratch编程大炮打幽灵

热门文章

  1. pixhawk自学笔记之px4程序启动顺序
  2. 关于CPU Cache——程序猿需要知道的那些事
  3. mysql事务所_MySQL事务,这篇文章就够了
  4. count相加 sqlserver_mssql sqlserver sum(1)、sum(2)、count(1)、count(8)、count(*)、统计函数应用区别简介...
  5. Kafka配置offsets.retention.minutes和log.retention.minutes的区别
  6. pytorch 之 加载不同形式的预训练模型
  7. CentOS7 安装 MySQL 和简单优化
  8. 十大排序算法之归并排序
  9. IDEA配置git环境
  10. python实现数字形式转换