对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也是直接分配到老年代,分配规则不是固定的,细节还是取决于垃圾收集器的组合,以及虚拟机和内存相关参数的配置。

  JVM 堆中分为 新生代 老年代 永久代,新生代分为 Eden区,SurvivorFrom区域和SurvivorTo区域

         

关于这几个概念的说明,可以参考 :http://ju.outofmemory.cn/entry/346964

普遍的分配规则
  • 对象优先在Eden分配
  • 大对象直接进入老年代
  • 长期存活对象进入老年代
  • 动态对象年龄判定
  • 空间分配担保

优先分配在Eden区

  大多数情况下,对象在新生代Eden区中分配。当Eden区中内存空间不足的时候,会进行一次Minor GC。

  Minor GC 与 Full GC (Major GC)
  Minor GC:指 发生在新生代的垃圾收集动作,因为新生代对象 "朝生夕死" 的特性,所以Minor GC非常频繁,一般回收的速度也快。
  Full GC:指发生在老年代的垃圾收集动作,Full GC的动作速度比较慢

大对象直接进入老年代

  大对象指的是,需要大量连续空间的java对象(例如数组和长字符串)。可以设置虚拟机参数:-XX:PretenureSizeThreshold  ,令大于这个参数的设置值的对象直接进入 老年代(-XX:PretenureSizeThreshold 参数只对 Serial 和 ParNew收集器有效,Parallel Scavenge收集器不识别这个参数)。

 
长期存活的对象进入老年代
  虚拟机给每个对象定义了一个年龄计数器(Age),如果对象在Eden分配了空间,当Minor GC发生后仍然存活,而且能够被Survivor容纳,则会移动到Survivor,并且Age +1,对象在Survivor区中每经历一次Minor GC,n年龄计数器则会+1,当达到一定程度(默认是15,这个阀值由参数 -XX:MaxTenuringThreshold 来设置),这个对象则会晋升到老年代中。
 
动态对象年龄判定
    为了适应各种应用程序的内存情况,虚拟机并不要求java对象的年龄达到MaxTenuringThreshold才会将其移入到老年代中。当在Survivor区内相同年龄的所有对象大小总和大于Survivor空间的一半时,这些对象将会移入到老年代中,而无需等待年龄达到 MaxTenuringThreshold 设置的值。
 
空间分配担保
    当发生Minor GC的时候,虚拟机将会检测之前每次晋升到老年代对象的平均大小是否大于老年代的剩余空间大小。(理解为根据之前晋升到老年代对象的平均大小的 "经验" 来判断老年代的的剩余空间是否足够存储那些即将晋升到老年代的对象)
  • 如果大于则进行一次Full GC
  • 如果小于则看 HandlePromotionFailure 设置是否允许担保失败,如果允许担保失败,则进行Minor GC,如果不允许,则再进行一次Full GC (大部分是打开允许的,为了避免频繁的 Full GC)。

JVM 内存分配和回收策略的更多相关文章

  1. jvm内存分配和回收策略

    在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为 ...

  2. A4. JVM 内存分配及回收策略

    [概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Ed ...

  3. JVM——内存分配与回收策略

    1.对象优先在Eden区分配 大多数情况下,对象在新生代Eden区分配.当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC. 虚拟机提供了 -XX:+PrintGCDetails这 ...

  4. JVM内存分配与回收策略

    对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. Minor GC:新生代GC,指发生在新生代的垃圾收集动作 ...

  5. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  6. JVM垃圾回收器、内存分配与回收策略

    新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...

  7. JVM学习十 -(复习)内存分配与回收策略

    内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...

  8. 最简单例子图解JVM内存分配和回收

    一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...

  9. 最简单例子图解JVM内存分配和回收(转)

    本文转自http://ifeve.com/a-simple-example-demo-jvm-allocation-and-gc/ http://www.idouba.net/a-simple-exa ...

随机推荐

  1. (转)Linux下PS1、PS2、PS3、PS4使用详解

    Linux下PS1.PS2.PS3.PS4使用详解 原文:http://www.linuxidc.com/Linux/2016-10/136597.htm 1.PS1——默认提示符 如下所示,可以通过 ...

  2. 牛客网Java刷题知识点之匿名对象

    不多说,直接上干货! 匿名对象的两种用途: 1.当对象对方法仅进行一次调用的时候,就可以简化成匿名对象. 2.匿名对象可以作为实际参数进行传递. 匿名对象顾名思义就是没有名字的对象. new Car( ...

  3. 大数据“重磅炸弹”——实时计算框架 Flink

    Flink 学习 项目地址:https://github.com/zhisheng17/flink-learning/ 博客:http://www.54tianzhisheng.cn/tags/Fli ...

  4. PHP中文手册1

    1.入门 关于换行 PHP 会在输出时自动删除其结束符 ?>后的一个换行.该功能主要是针对在一个页面中嵌入多段 PHP 代码或者包含了无实质性输出的 PHP 文件而设计,与此同时也造成了一些疑惑 ...

  5. JavaSE_4_集合

    1.Map和ConcurrentHashMap的区别? Map和ConcurrentHashMap的区别,Map是接口,ConcurrentHashMap是实现类 2.hashMap内部具体如何实现的 ...

  6. Ngnix服务器详解(Windows版本)(非原创)

    文章大纲 一.Ngnix简介二.Ngnix安装三.Ngnix之静态资源访问四.Ngnix正向代理与反向代理五.Ngnix之虚拟主机配置六.Ngnix之负载均衡七.Ngnix之访问控制八.Ngnix日志 ...

  7. 自己动手实现STL 03:内存基本处理工具(stl_uninitialized.h)

    一.前言 前面两篇已经编写了内存配置器和建构解构工具函数.这里,就准备编写并介绍下内存基本处理工具函数.比如uninitialized_copy().uninitialized_copy和 unini ...

  8. Vue日历

    Vue生成日历,根据返回值将日期标红 HTML: <h1>CSS 日历</h1> <div id="calendar"> <div cla ...

  9. bank conflct 一句话总结

    由于最新的多播模式区别于原来的广播模式,原来同一个warp不同线程访问同一个bank的相同地址不再是bank conflict, 现在总结为:只要同一个 warp 的不同线程会访问到同一个 bank ...

  10. [转]linux远程登入不需要密码

    如何通过一台linux ssh远程其他linux服务器时,不要输入密码,可以自动登入.提高远程效率,不用记忆各台服务器的密码. 工具/原料   ssh,ssh-keygen,scp 方法/步骤     ...