JVM了解

来源:互联网 发布:网络歌手翻唱歌曲 编辑:程序博客网 时间:2024/05/18 01:46

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

 

原创粉丝点击