美文网首页
内存分配与垃圾回收

内存分配与垃圾回收

作者: ihujian | 来源:发表于2018-07-17 09:56 被阅读0次

参考

Java 内存区域和GC机制

内存区域划分

Java运行时内存划分
  1. 程序计数器
    程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。

    • 每个程序计数器只用来记录一个线程的行号,所以它是私有的。
    • 由于程序计数器只是记录当前指令地址,所以不存在内存溢出的情况。
  2. 虚拟机栈(JVM Stack)
    一个线程的每个方法在执行的同时,都会创建一个栈帧(Stack Frame),栈帧中存储的有局部变量表操作站动态链接方法出口等,当方法被调用是,栈帧在虚拟机栈中入栈,当方法执行完成时,栈帧出栈。

    局部变量表中存储着方法的相关局部变量,包括各种基本数据类型,对象的引用,返回地址等。在局部变量表中,只有long和double类型会占用2个局部变量空间(Slot,对于32位机器,一个Slot就是32个bit),其它都是1个Slot。需要注意的是,局部变量表是在编译时就已经确定好的,方法运行所需要分配的空间在栈帧中是完全确定的,在方法的生命周期内都不会改变。

    虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StackOverFlowError(栈溢出);不过多数Java 虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程会一直申请栈内存,知道内存不足,此时会抛出OutOfMemoryError(内存溢出)

    每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的。

  3. 本地方法栈
    本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一的区别是:虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法栈与虚拟机栈放在一起使用。

    本地方法栈也是线程私有的。

  4. 堆区(Heap)
    堆区是理解Java GC机制最重要的区域,没有之一,在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC 机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。堆区的存在是为了存储对象示例,原则上讲,所有的对象都在堆区上分配内存(不过现代技术里,也不是这么绝对的,也有栈上直接分配的)

    在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。堆区的存在是为了存储对象实例,原则上讲,所有的对象都在堆区上分配内存(不过现代技术里,也不是这么绝对的,也有栈上直接分配的)。

  5. 方法区(Method Area)
    方法区是各个线程共享的区域,用于存储已经被虚拟机加载的类信息(即加载类时需要加载的信息,包括版本、field、方法、接口等信息)、final常量、静态变量、编译器即时编译的代码等。

    在方法区上定义了OutOfMemoryError:PermGen space异常,在内存不足时抛出。

    运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存储编译期就生成的字面常量、符号引用、翻译出来的直接引用(符号引用就是编码是用字符串表示某个变量、接口的位置,直接引用就是根据符号引用翻译出来的地址,将在类链接阶段完成翻译);运行时常量池除了存储编译期常量外,也可以存储在运行时间产生的常量(比如String类的intern()方法,作用是String维护了一个常量池,如果调用的字符“abc”已经在常量池中,则返回池中的字符串地址,否则,新建一个常量加入池中,并返回地址)。

相关文章

  • Android 对象池实现原理和简单使用

    了解Android 垃圾回收 判断对象是否可以被回收垃圾收集算法内存分配与回收策略 GC频繁原因 Memory C...

  • 01垃圾回收机制

    垃圾回收(Garbage Collection,GC) 垃圾回收就是释放垃圾占用的空间 内存的动态分配和垃圾回收,...

  • 内存分配与垃圾回收

    参考 Java 内存区域和GC机制 内存区域划分 程序计数器程序计数器是一个比较小的内存区域,用于指示当前线程所执...

  • 《深入理解Java虚拟机》(二)--垃圾收集器与内存分配策略(4

    内存分配与回收策略 对象的内存分配规则不是固定的,是取决于你使用的是哪种垃圾回收器组合和虚拟机中的内存参数,如果启...

  • 内存管理

    内存管理1、什么时候触发垃圾回收? 垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回...

  • Java垃圾回收(GC)机制

    为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无...

  • 垃圾收集器与内存分配策略(一)

    垃圾收集器与内存分配策略之--对象已死吗 GC关注的问题其实就是三个: 哪些内存可以被回收 何时回收 如何回收 所...

  • JVM学习笔记(3)-垃圾收集算法

    JVM学习笔记(1)-内存管理机制 JVM学习笔记(2)-内存分配与回收 垃圾收集算法 JVM垃圾收集算法有四种:...

  • Java内存分配与垃圾回收

    垃圾收集算法 一、 标记-清除算法(Mark-Sweep) 算法分为“标记”和“清除”两个阶段,首先标记出所有需要...

  • Java内存分配与垃圾回收

    垃圾回收 什么需要垃圾回收 栈:不需要,会随着线程的结束而消亡。堆:重点关注,凡是共享的对象,理应需要回收方法区/...

网友评论

      本文标题:内存分配与垃圾回收

      本文链接:https://www.haomeiwen.com/subject/pudipftx.html