`
nepshi
  • 浏览: 49295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM虚拟机内存管理机制

    博客分类:
  • JAVA
阅读更多
Java虚拟机运行时管理的数据区域被称为“运行时数据区域”。该区域可以分为线程共享区域,包括
  • 方法区(Method Area):所有线程共享的内存区域,用于存放已被JVM加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。运行时常量池(Runtime Constant Pool)用于存放编译期生成的各种字面量和符号引用。
  • 堆(Heap):所有线程共享的内存区域,用于存放对象实例。

和线程私有区域,包括
  • 虚拟机栈 (VM Stack):每个方法被调用时会创建栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。调用时入栈,结束时出栈。局部变量表存放了编译期可知的各种基本数据类型,局部变量表所需的内存在编译期间完成分配。
  • 本地方法栈(Native Method Stack):存储调用Native方法所需的各类信息。
  • 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器


GC对如何划分内存空间?
GC的管理的主要区域是堆。现在GC基本采用分代收集算法,将堆细分为新生代(new generation)和老年代(tenured generation)。新生代又可以细分为Eden空间、From Survivor空间和To Survivor空间。堆还可以划分线程私有的分配缓冲区(Thread Local Allocation Buffer)。

GC时如何判断对象无引用?
可以采用引用计数算法,但存在循环引用问题。目前主要的实现都采用根搜索算法(GC Roots Tracing)。通过查找对象实例到根是否存在可达路径,判断对象是否可GC。
GC Roots的对象包括:
  • 虚拟机栈(栈帧中局部变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 本地方法栈中JNI(Native方法)引用的对象


GC如何回收方法区?
GC在方法区上的主要目标是针对常量池的回收和对类型的卸载。GC回收方法区包括两部分内容:废弃常量和无用的类。
废弃常量可以通过系统中是否存在该常量的引用进行判断。
一个类被判断为无用,必须同时满足以下三个条件:
  • 该类所有的实例都已经被回收,堆中不存在该类的任何实例
  • 加载该类的ClassLoader已经被回收
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类


GC算法
  • 标记-清除算法(Makr-Sweep):第一阶段,标记出所有需要回收的对象;第二阶段,统一清除所有被标记的对象。缺点:效率不高、会产生大量不连续的内存碎片。
  • 复制算法(Copying):将内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor空间。GC时将Eden和Survivor中存活的对象一次性复制到另一块目标Survivor空间上,然后清理Eden和之前用过的Survivor空间。Eden和Survivor默认比例是8:1,如果目标Survivor空间不够,可以依赖老年代内存进行分配担保(Handle Promotion)。缺点:空间浪费;如果存活率高,复制效率不高。
  • 标记整理算法(Mark-Compact):首先标记无用对象,然后将所有存活对象向一端移动,然后清理掉边界以外的内存。
  • 分代收集算法(Generational Collection):将堆分为新生代(对象存活率低)和老年代(对象存活率高),新生代采用复制GC,老年代采用标记-清理或者标记-整理算法。


GC实现
新生代垃圾收集器
  • Serial:单线程收集器(复制算法)
  • ParNew:Serial的多线程版本(复制算法)
  • Parallel Scavenge:和ParNew类似,但可以控制CPU用于运行用户代码的时间与CPU总消耗时间的比值(复制算法)


老年代垃圾收集器
  • CMS(Concurent Mark Sweep):以获取最短回收停顿时间为目标的收集器。在互联网站或B/S系统的服务端上比较实用。GC分为四个步骤:初始标记(initial Mark)、并发标记(concurrent mark)、重新标记(remark)和并发清除(concurrent sweep)。缺点:对CPU资源敏感、浮动垃圾(并发清除过程中产生的垃圾)、内存碎片(需要额外碎片整理)。(标记-清除算法)
  • Serial Old:单线程收集器(标记-整理算法)
  • Parallel Old:Parallel Scavenge的老年代版本,在注重吞吐量及CPU资源敏感的场合,优先考虑Parallel Scavenge + Parallel Old。(标记-整理算法)


新生代-老年代收集器:
  • G1(Garbage First):标记-整理,无内存碎片;精确控制停顿;将堆(新生代和老年队)分为多个大小固定的分区,跟踪区域的垃圾堆积程度,根据允许的停顿时间,优先回收垃圾最多的区域。


内存分配策略
  • 对象优先在Eden分配
  • 大对象直接进入老年代
  • 长期存活的对象将进入老年代


Minor GC和Full GC
  • 新生代GC(Minor GC):发生在新生代的GC,非常频繁,速度很快
  • 老年代GC(Full GC):发生在老年代的GC,比Minor GC慢10倍以上。


——总结自《深入理解Java虚拟机:JVM高级特性与最佳实践》第2章、第3章
分享到:
评论

相关推荐

    JVM自动内存管理机制

    Java自动内存管理机制包含两部分:内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...

    Java内存管理机制相关资料汇总

    资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...

    JVM内存管理白皮书

    sun公司出版的jvm运行机制管理丛书,需要深入jvm的同学可以下载来看看

    jvm详解(java虚拟机详解)

    jvm详解高清pdf版,本文详细讲解了 JVM(Java Virtual Machine)的方方面面,首先由 java 的特性来描绘 JVM 的大致应用,再细细阐述了 JVM 的原理及内存管理机制和调优.最后讲述了与 JVM 密切相 关的 Java GC 机制.

    JVM内存管理及GC原理调优实战

    JVM调优是一个系统而又复杂的过程,由于Java虚拟机自动管理内存,在大多数情况下,我们基本上不用去调整JVM内存分配,因为一些初始化参数已经可以保证应用服务正常稳定地工作。但是当有性能问题的时候该怎么去调优,...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    12 1.4.5 64位虚拟机 / 13 1.5 实战:自己编译JDK / 13 1.5.1 获取JDK源码 / 13 1.5.2 系统需求 / 14 1.5.3 构建编译环境 / 15 1.5.4 准备依赖项 / 17 1.5.5 进行编译 / 18 1.6 本章小结 / 21 第二部分 ...

    JVM内存机制与故障处理.pptx

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而...

    Java知识,JVM面试资料

    自动内存管理:JVM 的垃圾回收机制自动管理内存分配和释放,提供了自动内存管理的功能。这大大简化了Java程序员的工作,减少了手动内存管理的错误和风险。同时,它还通过垃圾回收机制实现了自动资源释放,提高了程序...

    最新java面试专题01-JVM

    垃圾收集:JVM具有自动内存管理和垃圾收集机制,用于自动回收不再使用的对象占用的内存空间。垃圾收集器可以根据不同的算法和策略进行配置和优化,以提高内存使用效率和性能。 类加载机制:JVM通过类加载器加载类...

    JVM 相关知识的脑图介绍

    JVM提供了内存管理、垃圾回收、安全性等功能,使得Java程序具有跨平台性。JVM的结构包括类加载器、解释器、即时编译器等组件,通过优化和调整这些组件可以提高Java程序的性能。JVM的内部机制复杂而丰富,深入了解JVM...

    面向大数据处理框架的JVM优化技术综述

    当前,以Hadoop、Spark为...这些大数据处理框架采用分布式架构,使用Java、Scala等面向对象语言编写,在集群节点上以Java虚拟机(JVM)为运行时环境执行计算任务,因此依赖JVM的自动内存管理机制来分配和回收数据对象.

    java虚拟机知识点整理

    虚拟机类加载机制 编译期编译优化 运行期优化 高效并发-java内存模型与线程 线程安全与锁优化 1 标记-清除算法:首先标记所有需要回收的对象(引用计数或可达性分析算法标记),在标记完成后统一回收所有被标记的对象...

    java虚拟机2021面试题第二季

    2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...

    java虚拟机2021面试题第三季

    2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...

    java虚拟机2021面试题第一季

    2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...

    JVM基础知识及分析工具

    一、Jdk组成 二、Jdk32与jdk64的差异 三、自动内存管理机制 四、内存泄露与内存溢出 五、垃圾回收算法 六、虚拟机性能监控工具

    Java虚拟机

    第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7...

    eclipse.ini

    参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:java 虚拟机具有一个堆,...

    详细讲解了jvm在java中应用

    主要包含:JVM概述,内存结构讲解,对象实例化,垃圾回收,类的加载,程序编译,代码的优化,性能监控与调优. JVM:全称 Java Virtual Machine,一个虚拟计算机,Java 程序的运行环境(Java二...自动的内存管理,垃圾回收机制.

Global site tag (gtag.js) - Google Analytics