探索JVM

阅读更多
   
     从今天起,算是给自己一个约束吧..坚持每周必要写一篇技术文章,养成一个习惯,时间久了就能形成知识体系。

     今天来对JVM内存分配及JAVA内存回收、OOM异常等知识点做下复习

     1) JAVA 内存分配
        java内存分为六大类,堆、栈、寄存器、静态域、常量池、非RAM,这里主要介绍的是堆和栈。

        JAVA每个线程都会有相对应的栈来维持其运作,JDK1.5以前默认的栈空间是256KB,现在默认的空间是1MB,当用户像web应用服务器发送请求的时候,tomcat会从线程池中拿出一个线程相应用户请求,相对应的此线程也会到JVM中申请栈空间。这里要声明下, 线程不是与“用户”绑定,而是与“请求”绑定,举个简单的实例,用户发送请求的时候,如果与请求相对应的线程没有执行完,即使Session过期,此线程也会继续执行。

        JAVA堆内存是JVM进程中唯一的,分为新生区、幸存区、养老区、永久存储区、初始分配内存时候,对象放在新生区中,JVM会把不经常引用的内存移至到伊甸区,最后把部分移至到养老区,当类运行的时候,JAVA会把类信息移至到永久存储区,普通GC不会回收永久存储区对象。

        静态变量会放在方法区中、实例变量会放在堆中,相对应引用会放在不同的栈中,只有当运行的时候才会对类变量进行内存分配。

      2) javaGC

        javaGC分为普通GC和FULL GC,普通GC时间比较短,会回收新生区、幸存区、FULL GC会移除堆中所有空间的未引用对象,JVM GC的时候会停止对外“服务”,因此减少GC的时间也是JVM优化的“点”之一,JVM有不同的回收器。不同的回收算法以后我会研究,这里待续。

      3)OOM异常总结

        Java heap space java堆溢出
        PermGen space   方法区溢出或者常量池溢出
        unable to create new native 线程太多溢出
        StackOverflowError   栈空间不够溢出

        相对应的溢出方式我们有相对应的调节方法,在工作中如果发现OOM问题,要以解决问题优先,其次是经验总结,把问题记录下来长久下来形成知识体系~
       

你可能感兴趣的:(JVM,JAVA,outofmemory,oom,gc)