1、对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
2、大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个
Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
3、长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会...
分类:
编程语言 时间:
2015-07-03 09:12:46
阅读次数:
171
Full GC又称作Major GC,属于老年代GC,指发生在老年代的GC,相对这种GC的有新生代GC即Minor GC。出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的,Major GC的速度一般会比Minor GC慢10倍以上。下边看看有那种情况触发JVM进行Full GC及应对策略。
1、System.gc()方法的调用
此方法的调用是建议JVM进行Fu...
分类:
其他好文 时间:
2015-07-01 10:08:38
阅读次数:
208
内存分配策略与回收策略
给对象分配内存以及回收给对象分配的内存。对象的内存分配绝大部分主要是在Java堆上,有一部分特殊的就是JIT编译器,经过JIT编译后被拆散为标量类型并间接地在栈上分配内存。
对象主要分配集中在新生代的Eden区,如果启动了本地线程分配缓冲,按照线程优先在TLAB上分配。少数分配在老年代,分配在哪里取决于当前使用的垃圾回收器组合和虚拟机中相关内存参数的设定。
...
分类:
其他好文 时间:
2015-06-30 10:48:24
阅读次数:
126
作为一个程序员,仅仅知道怎么用是远远不够的。起码,你需要知道为什么可以这么用,即我们所谓底层的东西。
那到底什么是底层呢?我觉得这不能一概而论。以我现在的知识水平而言:对于Web开发者,TCP/IP、HTTP等等协议可能就是底层;对于C、C++程序员,内存、指针等等可能就是底层的东西。那对于Java开发者,你的Java代码运行所在的JVM可能就是你所需要去了解、理解的东西。
我会在接下来的一段时间,和读者您一起去学习JVM,所有内容均参考自《深入理解Java虚拟机:JVM高级特性与最佳实践》(第二版),感谢...
分类:
其他好文 时间:
2015-06-22 16:31:34
阅读次数:
123
Java GC(garbage collec,垃圾收集,回收)GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot对象化的实例是放在heap堆内存中的,这里讲的分代收集也是指对堆内存的回收GC的分代收集分为:年轻代、老年代、永久代。(方法区是被当做永久代的,不过JDK...
分类:
编程语言 时间:
2015-06-12 06:22:16
阅读次数:
412
我们先回顾一下主流Java的垃圾回收器(HotSpot JVM)。本文是针对堆的垃圾回收展开讨论的。 堆被分解为较小的三个部分。具体分为:新生代、老年代、持久代。 绝大部分新生成的对象都放在Eden区,当Eden区将满,JVM...
分类:
其他好文 时间:
2015-06-08 06:18:36
阅读次数:
160
刚上线了一个新的应用集群,第二天和第三天收到了应用FullGc超过阈值的报警短信。但是观察报警Java实例的jvm监控,堆内存仅仅用了1G多一点,还富余近700M。很困惑,剩余这么多内存没被使用,那么说明老年代内存是充足的才对啊!
针对报警的实例进程执行jstat -gcutil 命令,拿到了这个java进程的内存个个代的使用百分比。
发现P的使用率是98%,P,即 Perma...
分类:
其他好文 时间:
2015-05-29 18:12:47
阅读次数:
237
分几个帖子 跟大家一起学习一下内存分析的方法。这次先来聊聊为什么会发生内存泄漏:我们知道JVM根据generation(代)来进行GC,一共被分为young generation(年轻代)、tenured generation(老年代)、permanent generation(永久代, perm ...
分类:
其他好文 时间:
2015-05-20 21:56:39
阅读次数:
156
1. 对象优先在Eden分配
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间时,虚拟机将发起一次Minor GC。在如下的测试代码中,尝试分配3个2MB大小和1个4MB大小的对象,在运行时通过参数-Xmx20M,-Xms20M,-Xmn10M这三个参数限制了java堆大小为20MB,不可扩展,其中10MB分配给新生代,剩下的非配给老年代。-XX:SurvivorRatio=8决定了新生代中Eden区与一个Survivor区的比例为8:1,即 Eden: from Survivor:...
分类:
编程语言 时间:
2015-05-14 01:02:54
阅读次数:
134
堆内存的分代回收 Java针对堆的垃圾回收,将堆分为了三个较小的部分:新生代、老年代、持久代。新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器。1. 分代回收的依据:
对象生存时间长短:大部分对象在Young期间就被回收。
不同代采用不同的垃圾回收策略:对存活时间不同的对象分类,用不同的垃圾回收...
分类:
编程语言 时间:
2015-05-11 16:08:52
阅读次数:
149