jvm内存管理

来源:互联网 发布:mysql thread conn 编辑:程序博客网 时间:2024/06/16 10:59

      java不需要开发人员来分配内存和回收内存,jvm自动分配内存和回收内存的。简称GC,但是需要更加准确的判断程序的运行状况这样方便对程序进行性能调优。

   1、内存空间

     jvm规范将内存分为方法区、堆、本地方法栈、pc寄存器及jvm方法栈。

    方法区:方法区存放了要加载类的信息、类中的静态变量、final类型的常量、类中filed信息、类中方法信息,方法区是全局共享的,在一定的条件下会诶GC,方法区超过内存大小时,会抛出OutOfMemory.这块区域对应permanet Generation,又称持久代,默认最小值为16M,最大值为64M,可通过-xx:permSize及-xx:MaxSize来指定最大值和最小值。

     堆:堆用于存储对象实例及数组值。可以认为java所有通过new创建的对象的内存都在此分配,Heap中的对象所占用的内存都有GC进行回收,在32为系统上为2gb,64为则没有限制,可以通过设置-Xms和-Xmx来控制

sun从1.2开始对堆进行分代管理。主要分为新生代和旧生代。

    新生代(new generation)

      大多数情况下java程序中新建的对象都从新生代中分配内存,新生代由Eden space 和两块相同大小的survivor space构成。不同的GC方式会按值划分Eden和survivor的大小,有的GC还会根据运行状况来动态调整大小。

     旧生代:(old generation)

     用于存放新生代进过多次垃圾回收任然存活的对象,例如缓存对象,新建的对象也可能直接旧生代直接分配内存,主要为两种,一种是大对象一种是打数组对象。

     本地方法栈:本地方法栈用于支持native方法的执行,存储每个native方法调用的状态,实现中本地方法栈和jvm方法栈是同一个地方。

    PC寄存器和jvm方法栈:

     每个线程均会创建PC寄存器和jvm方法栈,当方法运行完毕时,其对应的内存也会自动释放。

2、内存分配

jvm对象所占用的内存主要从堆上进行分配,堆是所有线程共享的,因此分配内存需要加锁,这导致创建对象开销比较大,内存不足时会触发GC,如果任然不足,则会抛出OutOfMemory的错误信息。

3、内存回收

jvm通过GC来回收堆和方法区的内存,GC的原理是找到程序中不在引用的对象,然后回收这些对象,通常采用收集器的方是实现GC。主要的收集器有计数收集器和跟踪收集器。




   

0 0
原创粉丝点击