上海哪学网站建设优化,太原做网站的工作室,如手机网站源码,深圳响应样式网站建设费用问题#xff1a;java中创建的对象一般放在哪里#xff1f;(全流程包含从创建到回收)
回答
大部分对象在堆中#xff0c;这个基本都知道#xff1b; 少部分对象是会在栈中的#xff0c;比如作用域不局限于方法内的方法内部变量#xff0c;这类对象的特征一般就是生命周期…问题java中创建的对象一般放在哪里(全流程包含从创建到回收)
回答
大部分对象在堆中这个基本都知道 少部分对象是会在栈中的比如作用域不局限于方法内的方法内部变量这类对象的特征一般就是生命周期短、内存小 至于为什么要放一部分进栈中是为了避免这种小而短的对象加大GC的频率这种对象方法结束会随着栈帧的释放而释放减少堆的垃圾回收的压力。 在jdk1.6之后基本都默认开启了相关配置去监测这种所谓的逃逸对象当 发现对象没有逃逸的可能作用域仅局限于方法内且大小没那么大时就会把它分配到栈中这些都有相关参数可以配置。
问题讲了栈中的对象那你讲讲放入堆中的对象一般是怎么处理的
回答 常规情况下我们创建的对象都默认是生命周期比较短的优先分配在年轻代的Eden区。 然后就进入了常规的分代收集算法的流程这里可以参考另一篇博客中的分代收集算法部分最全的GC流程描述 这里再补充一下里面没提到的几个细节
为什么默认年龄是15? 在程序编程中15是个很敏锐的数字因为是2^4-1也就是4个比特位所能表达的对象大小。事实上java对象头上存储分代年龄的长度确实就是4bit详见多线程原理之synchronized锁的原理动态年龄判断 除了年龄达到15还有一个方式会进入老年代就是在survivor空间中相同年龄的对象的总大小大于总空间大小的一半那么此时年龄大于等于这个相同年龄的对象都会进入老年代。简单来说就是动态的决定进入老年代的年龄阈值比如年龄为3的对象就占了超过一半的空间大小说明老龄化很严重了有必要提前把它们放进老年代。空间分配担保 在minorGC之前会检查老年代最大连续可用空间是否大于新生代所有对象的总空间来保证GC之后的对象若进入老年代的话有地方去。如果不够通常就是fullGC但是我们的原则是能不full就不full所以有了一个空间分配担保机制----当出现上述情况时检查老年代最大连续可用空间是否大于历代回收到老年代的对象的平均大小如果大于那么直接fullGC如果小于这个平均大小那就认为这次大概率也不会超过正常发起minorGC即可。