深入Java核心_JVM内存分配&内存使用查看

Java中的内存泄露

     当以前分配的一块内存不再使用或不再访问,但系统却没有释放该块内存。那么对于该进程来说,总的可用的内存会减少,这种现象就叫做内存泄漏。

预防和减少内存泄露?

    1.了解内存是怎么分配的。
    2.了解内存是怎么释放的—GC。

Java运行时数据区 

Runtime Data Area组件:它主要分为二个部分(堆和非堆),GC主要作用于堆。

1、Heap (堆):一个Java虚拟实例中只存在一个堆空间。堆包括以下三部分:

    1.1 Eden Space: The VM initially assigns all objects to the eden space,and most objects die there.

  JVM会把新创建的对象先放入这个区域,这个区域中的对象大多数是#瞬时对象#。

    1.2 Survivor Space:The VM moves any remaining objects from the eden space to one of the survivor spaces.

    Eden Space满了后,jvm会把继续使用的数据转移到这个区域(存放Eden Space中继续被引用的对象)。

    1.3 Tenured Space:The VM moves objects that live long enough in the survivor spaces to the "tenured" space in the old generation.

    存放被引用时间较长的对象,Survivor中满了后放入继续被引用的对象。

2、非堆内存

    2.1 Code Cache(方法区域):被装载的class的信息存储在Method area的内存中。

    2.2 Perm Gen(持久化区域):存放静态常量等等

如下图所示:

备注:Java Stack(java的栈):虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈


GC的算法简述

1. 引用计数(Reference Counting)
     (1)为每一个对象添加一个计数器,计数器记录了对该对象的活跃引用的数量。
     (2)如果计数器为0,则说明这个对象没有被任何变量所引用,即应该进行垃圾收集。
2.标记-清除收集器(Mark-Swap Collectors)
     (1)首先停止所有工作,从根集遍历所有被引用的节点,然后进行标记,标记完后恢复工作。 (2) 回收阶段会收集那些没有被标记的节点(被回收)。
3.拷贝收集器(Copying Collectors)
     (1)假设将内存分为两个区域(from space和to space)。所有的对象在分配内存时都先分配到from space 。
     (2)在内存回收阶段,把所有标志为活动的对象,copy到to space,之后清除from space空间。
 

Garbage Collection 官方描述

    The HotSpot VM defines two generations: the young generation (sometimes called the "nursery") and the old generation. 

    The young generation consists of an "eden space" and two "survivor spaces." The VM initially assigns all objects to the eden space, and most objects die there. When it performs a minor GC, the VM moves any remaining objects from the eden space to one of the survivor spaces. The VM moves objects that live long enough in the survivor spaces to the "tenured" space in the old generation. When the tenured generation fills up, there is a full GC that is often much slower because it involves all live objects. The permanent generation holds all the reflective data of the virtual machine itself, such as class and method objects.
    The default arrangement of generations looks something like this:

 /

JVM垃圾回收机制

  1.Young Generation(新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成)  
  2.Tenured Generation
  3.Permanent Generation 

备注:新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象。

    JVM分别对新生代和旧生代采用不同的垃圾回收机制。

1.新生代的GC:
    新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到 survivor,最后到旧生代。

2.旧生代的GC:
    旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。在执行机制上JVM提供了串行 GC(SerialMSC)、并行GC(parallelMSC)和并发GC(CMS),具体算法细节还有待进一步深入研究。

参考文章:
1.JVM内存管理总结   http://bbs.csdn.net/topics/310051808 
2.JVM内存管理和JVM垃圾回收机制http://blog.163.com/guixl_001/blog/static/4176410420108296361891/
3.java内存机制_堆和栈  http://blog.163.com/guixl_001/blog/static/4176410420108299387259/
4.java 虚拟机运行环境数据区域说明 http://blog.csdn.net/dahaizisheng/article/details/2672733
5.JVM调优总结(七)-典型配置举例1  http://pengjiaheng.iteye.com/blog/538582

6.Jconsole官方文档 http://docs.oracle.com/javase/1.5.0/docs/guide/management/jconsole.html

7.官方文档  http://docs.oracle.com/javase/specs/

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值