美文网首页程序员
JVM 内存管理

JVM 内存管理

作者: 二毛_220d | 来源:发表于2019-04-07 15:43 被阅读0次

内存管理=内存分配+内存回收

内存分配

WechatIMG3.jpeg

JMM指Java内存管理
线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存,又称作TLAB线程本地缓冲区,中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

WechatIMG1.jpeg

虚拟机栈

特点如上图。
局部变量表存放了各种基本数据类型,对象引用类型,(“对象引用”可能是一个对象起始地址的引用指针,也可能是一个指向代表对象的句柄,不同的JVM实现不同),和return Address类型
StackOverflow : 栈深度超出允许范围
OutOfMemory: 当虚拟机栈在动态扩展时,无法申请到足够的内存则抛出

WechatIMG2.jpeg

  • 线程共享
  • 存放所有的对象实例和数组
  • 可拓展-xmx -xms控制大小
  • OutOfMemoryError

JVM规范中规定的是:所有对象实例及数组都要在堆上分配,但随着编译器发展,也出现了栈上分配等优化技术

没有在堆上完成对象的内存分配并且也无法扩展堆大小时,将抛出OutOfMemoryError

方法区

  • 线程共享
  • 存放所有已被加载的(类信息、常量、静态变量、JIT编译后的代码)
  • Hotspot可以设置大小
  • OutOfMemoryError
    又称非堆,在Hotspot上,方法区的回收和堆的回收是绑定在一起的,任何一方触发full gc都会另一方也进行full gc

运行时常量池

  • 运行时常量池是方法区的一部分,所以也是全局共享的。
  • 其作用是存储 Java 类文件常量池中的符号信息。
  • class 文件中存在常量池(非运行时常量池),其在编译阶段就已经确定;JVM 规范对 class 文件结构有着严格的规范,必须符合此规范的 class 文件才会被 JVM 认可和装载。
  • 运行时常量池 中保存着一些 class 文件中描述的符号引用,同时还会将这些符号引用所翻译出来的直接引用存储在 运行时常量池 中。
  • 运行时常量池相对于 class 常量池一大特征就是其具有动态性,Java 规范并不要求常量只能在运行时才产生,也就是说运行时常量池中的内容并不全部来自 class 常量池,class 常量池并非运行时常量池的唯一数据输入口;在运行时可以通过代码生成常量并将其放入运行时常量池中。
  • 同方法区一样,当运行时常量池无法申请到新的内存时,将抛出 OutOfMemoryError 异常。

内存溢出

  • 堆溢出
    不断往数组中添加实例
  • 栈溢出
    无限递归的方法调用--StackOverflow
    不断创建线程 — OOM
  • 方法区与运行时常量溢出
    无尽的String.intern() — before jdk1.6
    通过cglib 字节码增强,不断创建新类

内存回收

垃圾回收 — 如何判断对象已死

  1. 引用计数器
  2. 可达性分析
    2.1. 栈帧中引用的对象
    2.2. 方法区中静态属性引用的对象
    2.3. 方法区中常量引用的对象
    2.4. JNI引用的对象
    引用计数很难解决循环引用问题
    可达性分析通过从GC-Root,可能有多个,出发进行搜索,凡是没有在任何路径上的对象,就可以回收了

回收算法

  1. 标记-清除
    1.1. Stop The World
    1.2. 会产生大量碎片
  2. 复制
  3. 标记-整理
    3.1. 无需额外空间
  4. 分代收集
    4.1. 针对各年代的特点,采用不同算法。

标记就是通过可达性分析算法,为所有有引用的对象都打上标记,在标记和清除阶段,都需要将整个程序暂停,也就是stop-the-world。
复制算法,如果不想浪费50%的空间,就必须有额外空间做担保,例如老年代给新生代担保,那么由于没有再额外的空间给老年代担保了,所以老年代就不能采用复制算法。
标记-整理,又称作标记压缩,适合于老年代。

垃圾收集器

Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old
CMS 、G1
CMS是知道Java7为止默认的server模式的垃圾收集器
G1在Java7引入,在Java8成为推荐

相关文章

  • 初见JVM内存区域

    初见JVM内存区域 JVM一个重要的机制就是自动内存管理机制,为了深入理解JVM的内存管理机制,了解JVM的内存...

  • 【问答】补充

    Java JVM如何管理内存的? Java中内存管理是JVM自动进行的,创建对象或者变量时JVM会自动分配内存,当...

  • Android性能优化-内存泄漏的几个案例

    JVM内存管理 Java采用GC进行内存管理。深入的JVM内存管理知识,推荐《深入理解Java虚拟机》。 关于内存...

  • [JVM系列]JVM内存管理详解

    JVM内存管理详解

  • Java基础之引用类型

    一、概念 在Java语言中,由JVM进行内存的管理,JVM通过一定的内存回收机制来管理内存,对系统不再使用但JVM...

  • JVM内存结构、运行时内存以及类加载过程

    以下内容都是基于jdk1.8 1、JVM 内存管理 2、JVM内存区域 JVM内存区域主要分为线程私有Thread...

  • JVM内存结构

    以下信息摘录自:深入理解JVM的内存结构及GC机制 JVM内存管理 根据JVM规范,JVM把内存区域划分成了以下几...

  • Java基础

    JVM内存 1、JVM 内存管理和GC知识概述和总结(20190711) https://www.atatech....

  • [JVM] JVM内存结构浅析

    JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效稳定运行。 经典的JVM内存布...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

网友评论

    本文标题:JVM 内存管理

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