JVM 对象分配

JVM参数:

1)-Xmn: 新生代内存上限值

2)-Xms: 整个堆区初始内存分配的大小

3)-Xmx: 堆区内存的最大分配大小

4)-XX:SurvivorRatio: 决定eden与一个survivor大小之比

5)-XX:PretenureSizeThreshold: 大对象直接放入老年代,避免在Eden区和两个survivor区进行大量内存复制

6)-XX:MaxTenuringThreshold: 对象进入老年代的岁数,默认为15

担保机制:

   当对象无法放入survivor空间,对象将被直接放入老年代。  

   在发生Minor GC 之前,虚拟机会检查老年代最大可用连续空间是否大于新生代所有对象空间,如果成立,则Minor GC是安全的。否则,将检查是否设置允许担保失败,允许的话,检查可用空间是否大于历次晋升到老年代的对象的评价大小,如果大于,将进行Minor GC,否则,或者不允许担保失败,将进行一次Full GC。

长时间存活的对象将进入老年代:

   每经过一次minor GC,对象年龄将增加1岁,当超过XX:MaxTenuringThreshold时,进入老年代。

   且根据动态年龄判定机制,survivor空间中相同年龄的对象总大小达到survivor空间的一半时,所有岁数大于等于该年龄的对象将直接进入老年代。

原文地址:https://www.cnblogs.com/zncepup/p/11364909.html

时间: 2024-10-03 14:45:42

JVM 对象分配的相关文章

JVM对象分配和GC分布【JVM】

最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象: 栈:什么是栈? 先说一下栈的数据结构吧,栈它是一种先进后出的数据结构(FILO),跟队列刚好相反(先进先出FIFO),生活中有哪些例子, 举个例子 给子弹上膛,上弹的操作就类似于栈的数据结构,先压入的子弹后发射,因为它被压入到了最底部(栈底),所以,它会先发射最上面的子弹(栈顶), 说了这个概念,想必应该已经熟悉了栈的数据结构了吧. 再说一下栈,栈相当于一个桶,里面有方法区,局部变量表,方法返回地址

JVM对象分配内存的工作流程图

备注: 1.超大对象是指对象大小大于Eden+S0 2.新生代采用复制算法进行垃圾回收 3.老年代采用标记整理算法进行垃圾回收 原文地址:https://www.cnblogs.com/gaopengpy/p/12180381.html

jvm对大对象分配内存的特殊处理(转)

前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下: Shell代码   -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 紧接着,开始写程序.很简单,就是初

JVM之对象分配:栈上分配 & TLAB分配

1. Java对象分配流程 2. 栈上分配 2.1 本质:Java虚拟机提供的一项优化技术 2.2 基本思想: 将线程私有的对象打散分配在栈上 2.3 优点: 2.3.1 可以在函数调用结束后自行销毁对象,不需要垃圾回收器的介入,有效避免垃圾回收带来的负面影响 2.3.2 栈上分配速度快,提高系统性能 2.4 局限性: 栈空间小,对于大对象无法实现栈上分配 2.4 技术基础: 逃逸分析 2.4.1 逃逸分析的目的: 判断对象的作用域是否超出函数体[即:判断是否逃逸出函数体] //user的作用域

JVM GC 之二对象分配

Java体系中的内存自动管理其实是解决两大问题:给对象分配内存和回收分配个对象的内存. 一般情况下对象是在堆上分配(但也可能是经过JIT(Java即时编译)编译后被拆散为标量类型并间接的在栈上分配),对象主要是分配在新生代中的Eden区,如果启动了本地线程分配缓冲,将按线程优先分TLAB上.也可以通过配置 -XX:PretenureSizeThreshold参数直接分配在老年代中. 英文诗意:Max  Tenuring占有 Threshole阀值      对象有限分配在Eden区      多

JVM总结(一):概述--JVM对象探秘

这一节我们来讨论一下JVM对象建立过程. JVM对象探秘 对象的建立 对象的内存布局 对象的访问定位 JVM对象探秘 对象的建立 对象的建立过程   图一:对象建立过程 1.类加载检查. 当JVM检测到有一条new指令时,首先先检查该指令的参数是否在常量池中定位到一个类的符号引用,并检查这个符号引用所代表的类是否已被加载.解析和初始化过.如果存在的话,JVM将直接使用已有的信息对该类进行操作. 如果没有,则执行相应的类加载过程. 2.为新生对象分配内容. 不同的JVM垃圾收集器在内容分配的时候的

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

一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分为Eden区(圣经中的伊甸园).和两个Survivor区.新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区. 简单讲,就是生命期短的对象放在一起,将少数生命期长的对象放在一起,分别采用不同的回收

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

JVM的自动内存管理要自动化地解决两个问题:对象分配内存以及回收分配给对象的内存.回收内存前几篇已经讲了,现在说内存分配.对象的内存分配一般分配在堆内存中,也可能经过JIT 编译后被拆散为标量类型间接地在栈上分配.对象主要分配在新生代的Eden 区上,如果启动了本地线程分配缓存,将按线程优先在TLAB (本地线程分配缓存)上分配.少数情况下也可能会直接分配在老年代中,分配的规则不是固定的,与使用哪一种垃圾收集器组合,还与虚拟机中内存相关参数设置有关.对象优先在Eden区分配多数情况下,对象在新生

【007】【JVM——内存分配与收回策略】

 内存分配与收回策略 JVM的自动内存管理要自动化地解决两个问题:对象分配内存以及回收分配给对象的内存.回收内存前几篇已经讲了,现在说内存分配.对象的内存分配一般分配在堆内存中,也可能经过JIT 编译后被拆散为标量类型间接地在栈上分配.对象主要分配在新生代的Eden 区上,如果启动了本地线程分配缓存,将按线程优先在TLAB (本地线程分配缓存)上分配.少数情况下也可能会直接分配在老年代中,分配的规则不是固定的,与使用哪一种垃圾收集器组合,还与虚拟机中内存相关参数设置有关. 对象优先在Eden