Java内存模型及GC原理
来源:互联网 发布:软件概要设计说明 编辑:程序博客网 时间:2024/06/01 08:58
sun官方网站:sunjava 虚拟机模型
JVM内存模型中分两大块,一块是 NEW Generation,另一块是Old Generation. 在NewGeneration中,有一个叫Eden的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to),它们用来存放每次垃圾回收后存活下来的对象。在OldGeneration中,主要存放应用程序中生命周期长的内存对象,还有个PermanentGeneration,主要用来放JVM自己的反射对象,比如类对象和方法对象等。
在NewGeneration块中,垃圾回收一般用Copying的算法,速度快。每次GC的时候,存活下来的对象首先由Eden拷贝到某个SurvivorSpace, 当Survivor Space空间满了后, 剩下的live对象就被直接拷贝到OldGeneration中去。因此,每次GC后,Eden内存块会被清空。在OldGeneration块中,垃圾回收一般用mark-compact的算法,速度慢些,但减少内存要求.
垃圾回收分多级,0级为全部(Full)的垃圾回收,会回收OLD段中的垃圾;1级或以上为部分垃圾回收,只会回收NEW中的垃圾,内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。
1,out ofmemory
当一个URL被访问时,内存申请过程如下:
A. JVM会试图为相关Java对象在Eden中初始化一块内存区域
B. 当Eden空间足够时,内存申请结束。否则到下一步
C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
D.Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
F.完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”outof memory错误”
造成full gc的原因:
new了很多对象,没有即时在主动释放掉->Eden内存不够用->不断把对象往old迁移->old满了->fullgc
full gc 如何预防,:
1,使用了缓存
2,没使用缓存的情况,貌似不会出现fullgc的情况,除非内存太小,或者设置不对,程序有漏洞.
- Java 内存模型及GC原理
- Java内存模型及GC原理
- Java内存模型及GC原理
- Java 内存模型及GC原理
- Java内存模型及GC原理
- (转)Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理 --经典
- Java 内存模型及GC原理
- Java内存模型及GC原理
- Java 内存模型及GC原理
- Java 内存模型及GC原理
- Android断点续传
- 类名.class和类名.getClass()
- Siemens NX8 NXOpen 终于支持.net framework 4.0了
- MPEG2 TS基本概念和数据结构(转)
- android 基础学习笔记
- Java内存模型及GC原理
- 多年以后,再拾Linux
- oracle中的函数
- 64位Linux安装db2 v9.7的问题
- WCF 理论知识(一)
- 模型驱动软件开发实战步骤
- 剖析java.util.concurrent锁
- JNI的使用
- [IT 男人帮] 谷歌如何测试软件 —— 第三部分