内存区域划分
 
  

  • 程序计数器(Program counter Register)
    • 描述  程序计数器(Program Counter Register)是一块较小的内存空间.它可以看作是当前线程执行的字节码的行号指示器
    • 作用  线程切换之后能够恢复到正确的位置.
    • 范围  线程私有,随线程而生,随线程尔灭
    • 异常  此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域.
  • java虚拟机栈(Java Virtual Machine Stacks)
    • 描述  虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧,方法从调用到执行完成的过程,就对应栈帧入栈到出栈的过程.
    • 存储内容
      • 局部变量表
        • 对象引用
        • 基础数据类型  
      • 操作数栈
      • 动态链接
      • 方法出口
    • 范围  线程私有,随线程而生,随线程尔灭
    • 异常
      • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常.
      • 虚拟机栈在动态扩展过程中无法申请到足够的内存,将会抛出OutOfMemoryError异常.
  • 本地方法栈(Native Method Stack)
    • 描述 本地方法栈与虚拟机栈所发挥的作用非常相似,他们之间的区别不过是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的native方法服务.
    • 范围  线程私有,随线程而生,随线程尔灭.
    • 异常
      • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常.
      • 虚拟机栈在动态扩展过程中无法申请到足够的内存,将会抛出OutOfMemoryError异常.
  • java堆(Java Heap)
    • 描述  java堆是虚拟机所管理的内存中最大的一块.也是垃圾收集器管理的主要区域.
    • 作用  java堆是被所有线程共享的一块区域,虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存.
    • 范围  线程共享.
    • 异常  如果堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常.  
  • 方法区(Method Area)
    • 描述  方法区和java堆一样,是各个线程共享的区域.别名(Non-Heap),目的应该是和java堆区分开.
    • 存储内容
      • 类信息
      • 类名
      • 访问修饰符
      • 常量池
        • 字面量
        • 符号引用
      • 静态变量
      • 即时编译器编译后的代码
    • 范围  线程共享
    • 异常  当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常.
  • 直接内存(Direct Memory)

    • 直接内存并不是虚拟机运行时数据区的一部分.
    • 异常  本机直接内存的分配不会受到java堆大小的限制,但是各个区域的内存总和大于物理内存限制时,将会抛出OutOfMemoryError异常.
 
垃圾回收(GC)
  • 哪些内存需要回收?
    • 需要回收  →  java堆(重点) 和 方法区(永久代)
    • 不需要回收  →  程序计数器 和 java虚拟机栈 和 本地方法栈
  • 什么时候回收?
    • 判断对象已死

      • 引用计数算法  给对象添加一个引用计数器,每当有一个地方引用,计数器值就加1,引用失效时,计数器值就减1,计数器值为0就是该对象不可用.

        • 优点  实现简单,效率高
        • 缺点  不能解决对象之间的互相引用问题.
      • 可达性分析算法  这个算法的思路就是通过一系列的称为GCRoots的对象作为起始点,从这个节点开始向下搜索,搜素所走的路径称为引用链(Reference Chain) ,当一个对象到GCRoots没有任何引用链相连时,则证明此对象不可用.
      • 引用
        • 强引用  只要强引用还在,垃圾收集器永远不会回收掉被引用的对象.
        • 软引用  描述一些还有用但并非必须的对象,系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行二次回收.
        • 弱引用  用来描述非必须对象,被弱引用关联的对象只能生存到下一次垃圾收集发生之前.
        • 虚引用  最弱的引用关系,一个对象是否有虚引用,完全不会对其生存时间有任何影响,也不可以通过虚引用来获取一个对象实例.
      • 判生死  即使是在可达性分析算法中不可达的对象,也并非是非死不可,真正宣告一个对象死亡,至少要经理两次标记过程:
        • 第一次标记: 根据可达性分析算法判断如果对象不可达,进行标记并且进行筛选,筛选条件是是否有必要执行finalize()方法,如果finalize()被虚拟机执行过,或对象没有覆盖finalize()方法时,,都会被认为没必要执行.
        • 第二次标记: 如果第一次标记在筛选的时候,要执行finalize()方法,这是此对象的最后一次自救机会,如果执行完finalize()方法之后,此对象仍未逃脱,则此对象真的是要被回收了. 
    • 垃圾回收算法
      • 标记 - 清除算法  首先标记处所有需要回收的对象,标记完成后统一回收所有被标记的对象.
          缺点:
        • 效率问题,标记和清除两个过程效率都不高.
        • 空间问题,标记清除之后会产生大量的不连续的内存碎片,导致在分配较大对象时,无法找到连续的内存空间而不得不提前触发另一次垃圾收集动作.
      • 复制算法  把内存划分为两块,每次只使用其中的一块,当此块内存使用完了,就把还存活的对象复制到另外一块上去,然后把已使用过的内存空间全部清理掉.
          缺点 浪费了一半的内存空间.
      • 标记 - 整理算法  首先标记出所有待回收的对象,然后让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存.
          缺点  如果对象存活率较高,效率会很低.
      • 分代收集算法
  • 如何回收?
    • Serial 收集器  这是一个单线程的收集器,它在进行垃圾回收的时候,必须要暂停其他所有的工作线程.
    • ParNew收集器  Serial收集器的多线程版.
    • Parallel Scavenge 收集器  更关注吞吐量 = 处理用户代码时间/(垃圾回收时间 + 处理用户代码时间)
    • Parallel Old 收集器
    • Serial Old 收集器
    • CMS 收集器

JVM内存分布和垃圾回收的更多相关文章

  1. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  2. JVM内存分配与垃圾回收机制管理

    项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...

  3. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  4. 浅析JVM内存区域及垃圾回收

    一.JVM简介 JVM,全称Java Virtual Machine,即Java虚拟机.以Java作为编程语言所编写的应用程序都是运行在JVM上的.JVM是一种用于计算设备的规范,它是一个虚构出来的计 ...

  5. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  6. JVM内存管理和垃圾回收机制介绍

    http://backend.blog.163.com/blog/static/20229412620128233285220/     内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...

  7. 浅谈JVM内存分配与垃圾回收

    大家好,我是微尘,最近又去翻了周志明老师的<深入理解Java虚拟机>这本书.已经看了很多遍了,每次都感觉似乎看懂了,但没过多久就忘了.这次翻了第三章的垃圾收集器与内存分配策略,感觉有了新的 ...

  8. JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集

    (转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...

  9. JVM内存管理及垃圾回收

    一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...

随机推荐

  1. JS 封装插件

    媒体播放器插件: mediaelement-and-player.js 轮播图插件: swiper.min.js

  2. ACM_括号匹配

    括号匹配(栈) Time Limit: 2000/1000ms (Java/Others) Problem Description: 给一组包含[]()两种括号的序列,检查是否是合法的. 如:()[] ...

  3. Android 性能优化(12)网络优化( 8)Monitoring the Battery Level and Charging State

    Monitoring the Battery Level and Charging State PreviousNext This lesson teaches you to Determine th ...

  4. js复制功能

    // 复制功能 copyUrl() { var Url = document.getElementById('biao') Url.select() // 选择对象 document.execComm ...

  5. BST二叉查找树转双向链表DoubleLinke

    问题:在不创建任何新的节点的情况下,实现将一颗BST变成有序的双向链表. 分析: 在结构上,如图的一颗BST,每个节点都有left right指针分别指指向左右儿子.结构上和双向链表节点是完全相同的. ...

  6. 高效程序员的45个习惯·敏捷开发修炼之道(Practices of an Agile Developer)读书笔记

    首先,这本书值得再看一遍——这次的阅读,有很多东西都是知其“形”,不知其“神”的,这导致了我对其中某些建议持怀疑态度,接受了的建议也有待商榷. 总之,先记录本书的一些信息: Practices of ...

  7. Android Programming 3D Graphics with OpenGL ES (Including Nehe's Port)

    https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html

  8. 关于vue项目 路由中 使用的坑

    关于vue路由重定向的时候 记得一定要先声明先声明

  9. Ps 快捷键全解

    一.工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取)矩形.椭圆选框工具 [M]移动工具 [V]套索.多边形套索.磁性套索 [L]魔棒工具 [W]裁剪工具 [C]切片工具.切片选择 ...

  10. Discuz!伪静态原理分析

    伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为 ...