`

8、内存管理机制---内存分配与回收策略

 
阅读更多

    对象的内存分配,一般就是在堆上分配空间,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB(缓存)上分配。也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

 

1、对象优先在Eden分配

大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。

-xmn10M 为jvm的新生代空间;

-Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8 -Xloggc:D:/Documents/gc.log

 

public static void main(String...s) throws Exception{
		byte[] b1 = new byte[2 * 1024*1024];
		byte[] b2 = new byte[2 * 1024*1024];
		byte[] b3 = new byte[2 * 1024*1024];
		byte[] b4 = new byte[4 * 1024*1024];//超过了10m
	}
没有出现异常,查看gc日志:

 

 

0.082: [GC 0.082: [DefNew: 6692K->370K(9216K), 0.0028794 secs] 6692K->6514K(19456K), 0.0029189 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 def new generation   total 9216K, used 4794K [0x334f0000, 0x33ef0000, 0x33ef0000)
  eden space 8192K,  54% used [0x334f0000, 0x33941fa0, 0x33cf0000)
  from space 1024K,  36% used [0x33df0000, 0x33e4cb30, 0x33ef0000)
  to   space 1024K,   0% used [0x33cf0000, 0x33cf0000, 0x33df0000)
 tenured generation   total 10240K, used 6144K [0x33ef0000, 0x348f0000, 0x348f0000)
   the space 10240K,  60% used [0x33ef0000, 0x344f0030, 0x344f0200, 0x348f0000)
 compacting perm gen  total 12288K, used 146K [0x348f0000, 0x354f0000, 0x388f0000)
   the space 12288K,   1% used [0x348f0000, 0x34914a68, 0x34914c00, 0x354f0000)
    ro space 10240K,  45% used [0x388f0000, 0x38d77290, 0x38d77400, 0x392f0000)
    rw space 12288K,  54% used [0x392f0000, 0x3997ace8, 0x3997ae00, 0x39ef0000)

分析:

new generation(新生代):

          eden space 8192K =  10*1024kb  *80%

          form  space(survival) = 1024kb      ****这里可用的空间大小为9*1024kb****

          to   space(survival) = 1024kb

tenured generation(老年代):

       space  10* 1024kb

执行main方法时,会发生minor gc 因为新生代需要的内存空间为10m而可用的空间是9m,而b1,b2,b3大小为2m比to space(1m)大,不能通过复制方法执行;此时gc只能通过担保机制将b1,b2,b3放入tenured generation中,这样新生代可用空间又为9m了;

1.the space 10240K,  60% used

2.eden space 8192K,  54% used 

    from space 1024K,  36% used 

 

2、大对象直接进入老年代

       大对象就是指需要大量连续内存空间的Java对象,典型大对象:长字符串及数组。大对象对虚拟机的内存分配来说就是一个坏消息(遇到一群“朝生夕灭”的“短命大对象”,写程序时应当避免),经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”它们。

      虚拟机提供了一个-XX:PretenureSizeThreshold=3*1024*1024参数,令大于这个设置值的对象直接在老年代中分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存拷贝

      PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效,Parallel Scavenge收集器不认识这个参数,Parallel Scavenge收集器一般并不需要设置。如果遇到必须使用此参数的场合,可以考虑ParNew加CMS的收集器组合。

3、长期存活的对象将进入老年代
      内存回收时应该识别哪些对象应当放在新生代,哪些对象应放在老年代中。为了做到这点,虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并将对象年龄设为1。对象在Survivor区中每熬过一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold=15来设置。

4、 动态对象年龄判定
      为了能更好地适应不同程序的内存状况,虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。

5、空间分配担保
      在发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则改为直接进行一次Full GC。如果小于,则查看HandlePromotionFailure设置是否允许担保失败;如果允许,那只会进行Minor GC;如果不允许,则也要改为进行一次Full GC。大部分情况下都还是会将HandlePromotionFailure开关打开,避免Full GC过于频繁。     

   

 

 

 

分享到:
评论

相关推荐

    Python实现处理机和进程调度算法及内存分配回收机制源码+项目说明+代码注释(附Vue前端源码).zip

    Python实现处理机和进程调度算法及内存分配回收机制源码+项目说明+代码注释(附Vue前端源码).zip 多道程序系统中,进程与进程之间存在同步与互斥关系。当就绪进程数大于处理机数时,需按照某种策略决定哪些进程先占用...

    内存管理内存管理内存管理

    程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...

    操作系统(内存管理)

    对实际编程来说,理解您的内存管理器的能力与局限性至关重要。在大部分系统语言中,比如 C 和 C++,您必须进行内存管理。本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行...

    OS实验报告.docx

    本实验模拟实现处理机调度及内存分配及回收机制,以对处理机调度的工作原理以及内存管理的工作过程进行更深入的了解。 二、实验内容及要求 1.实验内容 (1)选择一个调度算法,实现处理机调度; (2)结合(1)...

    基于嵌入式设备浏览器内存管理策略研究

    基于嵌入式设备浏览器内存管理策略研究,摘要:为了解决嵌入式设备中内存频繁分配和释放所引起的内存碎片以及浏览器正常运行难问题,提出具有垃圾回收机制的可动态增长池式分配数据结构设计和具有Compaction机制的...

    谈谈JavaScript中的垃圾回收机制

     在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。  这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。...

    操作系统-第一章-绪论

    内存分配:按一定的策略为每道程序分配内存 内存保护:保证各程序在自己的内存区域内运行而互不干扰 内存扩充:为允许大型作业或多作业的运行,必须借助虚拟存储技术去获得增加内存的效果 3 )设备管理 设备管理:...

    深入分析Linux内核源码.chm

    6.2 Linux内存管理的初始化 6.3 内存的分配和回收 6.4 地址映射机制 6.5 请页机制 6.6 交换机制 6.7 缓存和刷新机制 6.8 进程的创建和执行 第七章 进程间通信 7.1 管道 7.2 信号(signal) 7.3 System V 的IPC机制 第...

    Linux2.6内核标准教程(共计8--第8个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    resin-jvm 调优

    不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了...

    Linux2.6内核标准教程(共计8-- 第1个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    Linux2.6内核标准教程(共计8--第6个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    Linux2.6内核标准教程(共计8--第3个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    Linux2.6内核标准教程(共计8--第4个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    Linux2.6内核标准教程(共计8--第2个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    Linux2.6内核标准教程(共计8--第7个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    Linux2.6内核标准教程(共计8--第5个)

    3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 ...

    基于C++实现的操作系统进程调度可视化与模拟源码+实验报告.zip

    本实验模拟实现处理机调度及内存分配及回收机制,以对处理机调度的工作原理以及内存管理的工作过程进行更深入的了解。 1.实验内容 (1)选择一个调度算法,实现处理机调度; (2)结合(1)实现主存储器空间的分配...

    Java虚拟机

    3.6 内存分配与回收策略 3.6.1 对象优先在Eden分配 3.6.2 大对象直接进入老年代 3.6.3 长期存活的对象将进入老年代 3.6.4 动态对象年龄判定 3.6.5 空间分配担保 3.7 本章小结 第4章 虚拟机性能监控与故障...

    【容器系统】之大数据容器化-基于Kubernetes构建现代大数据系统.pdf

    它的特点是基于内存计算,⽀持各类资源管理平台,其中以YARN最为常 见,同时⼜与Hadoop平台集成,在集群节点以HDFS作为分布式⽂件存储系统。 我们可以先看⼀下搭建⼀个常见的Apache Spark⼤数据平台需要哪些步骤: 1...

Global site tag (gtag.js) - Google Analytics