`
lovnet
  • 浏览: 6711052 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

深入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/

分享到:
评论

相关推荐

    深入理解JVM内存结构及运行原理全套视频加资料

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...

    java内存讲解

    内容包括:JVM的垃圾回收机制详解和调优;深入Java核心 Java内存分配原理精讲;详细介绍Java的内存管理与内存泄露,三个文档整合

    最详细的java内存讲解

    JVM的垃圾回收机制详解和调优; 深入Java核心 Java内存分配原理精讲; 详细介绍Java的内存管理与内存泄露;

    精通并发与 netty 视频教程(2018)视频教程

    32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与分析 36_文件通道用法详解 37_Buffer深入详解 38_NIO堆外内存与...

    精通并发与netty视频教程(2018)视频教程

    60_Netty的自适应缓冲区分配策略与堆外内存创建方式 61_Reactor模式5大角色彻底分析 62_Reactor模式组件调用关系全景分析 63_Reactor模式与Netty组件对比及Acceptor组件的作用分析 64_Channel与ChannelPipeline关联...

    Java虚拟机

    第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁...

    Java-Interview:此项目为 Java 面试的汇总,多数是一些 Java 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题

    Java 知识点,继续完善中。 多数是一些 Java 基础知识、底层原理、...对象的创建与内存分配 你应该知道的 volatile 关键字 分布式相关 分布式限流 基于 Redis 的分布式锁 分布式缓存设计 分布式 ID 生成器 常用框架\

    Java-Interview:https

    Java 知识点,继续完善中。...对象的创建与内存分配 你应该知道的 volatile 关键字 分布式相关 分布式限流 基于 Redis 的分布式锁 分布式缓存设计 分布式 ID 生成器 常用框架\第三方组件 Spring Bean 生命周期 Sprin

    java-interview

    Java 知识点,继续完善中。 多数是一些 Java 基础知识、底层原理、...对象的创建与内存分配 你应该知道的 volatile 关键字 分布式相关 分布式限流 基于 Redis 的分布式锁 分布式缓存设计 分布式 ID 生成器 常用框架\

    精通并发与netty 无加密视频

    第60讲:Netty的自适应缓冲区分配策略与堆外内存创建方式 第61讲:Reactor模式5大角色彻底分析 第62讲:Reactor模式组件调用关系全景分析 第63讲:Reactor模式与Netty组件对比及Acceptor组件的作用分析 第64讲:...

Global site tag (gtag.js) - Google Analytics