JVM:java虚拟机,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机的功能来实现的;JVM屏蔽了与具体系统平台相关的信息,实现了JAVA代码的跨平台。
1. JVM 垃圾回收机制:JVM是自动进行垃圾回收的,进行垃圾回收的原因:Java对象存活时间是不一定的,因此在程序运行一段时间后,如果不进行内存整理,就会出现零散的内存碎片(内存是比较稀少、珍贵的资源),导致在需要的时候无法分配大块的内存空间,这样就影响程序运行的效率。
垃圾回收(Garbage Collect):分为两类,分别是 Scaverage GC 和 Full GC
2. 内存分代:
我们在对内存进行回收时,注意到不同的对象生命周期不同,存活时间也不同,可以对不同生命周期的对象采取不同的垃圾回收方式来提高垃圾 回收的效率;
本身进行垃圾回收要新建一个垃圾回收线程,创建一下线程要分配内存;而垃圾回收是要回收内存,所以二者是矛盾的;以前采用先暂停所有的应用(为了停止新分配内存),现在JVM中采用并发的垃圾回收算法,使得在程序能正常运行(持续分配内存)的前提下,完成垃圾回收。
内存分代根据生命周期的长短分为:年轻代、年老代和持久代
新new的对象都放在年轻代,年轻代里面的对象是新产生的生命周期比较短,所以垃圾回收的频率比较高
年老代:多次垃圾回收后仍然存活的对象,就放在年老代
持久代:放的是java的类和算法,一般垃圾回收不会涉及到这里的内容
3. 垃圾回收的触发:
(1) Scaverage GC触发: 在新new一个对象,并在eden区申请内存失败就会触发 Scaverage GC
(2) Full GC触发:对整个堆进行整理,包括 年轻代、年老代和持久代都进行整理,所以这个要比 Scaverage GC要慢很多。
Full GC 触发的原因:
- 年老代写满
- 持久代写满
- System.gc() 被显示调用
4. 几种典型的内存溢出
- java.lang.OutOfMemoryError:java heap space ----->年老代堆空间占满
- java.lang.OutOfMemoryError:PermGen space ------>持久代空间占满
- java.lang.StackOverFlowError----------->堆栈空间占满
- Fatal:Stack size is small ------->线程堆栈空间占满
- java.lang.OutOfMemoryError: not create new pative thread ---->系统内存占满,不能创建新的线程
5. gc.log 入门
gc.log 的输出格式是开发人员可以设置的,一般的输出格式如下:
GC [GC 类型: 回收前年轻代占用的内存空间-à回收后年轻代所占的内存空间(回收的内存空间大小) 年轻代GC回收需要的时间 JVM的Heap在回收前所占用的内存àJVM 的Heap在回收后占用的内存(Heap 回收的内存) JVM整个GC占用的时间;
[GC [PSYoungGen: 786432K->27464K(917504K)] 786432K->27464(1966080K), 0.1357630 secs]
除此之外,还有Full GC输出:
[Full GC [PSYoungGen: 131044K->0K(917504K)] [ParOldGen: 638724K->691461K(1048576K)] 769768K->691461K(1966080K) [PSPermGen: 66676K->66576K(262144K)]
http://blog.renren.com/share/227555708/11768964932