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章
分享到:
相关推荐
Java自动内存管理机制包含两部分:内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...
资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...
sun公司出版的jvm运行机制管理丛书,需要深入jvm的同学可以下载来看看
jvm详解高清pdf版,本文详细讲解了 JVM(Java Virtual Machine)的方方面面,首先由 java 的特性来描绘 JVM 的大致应用,再细细阐述了 JVM 的原理及内存管理机制和调优.最后讲述了与 JVM 密切相 关的 Java GC 机制.
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 第二部分 ...
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而...
自动内存管理:JVM 的垃圾回收机制自动管理内存分配和释放,提供了自动内存管理的功能。这大大简化了Java程序员的工作,减少了手动内存管理的错误和风险。同时,它还通过垃圾回收机制实现了自动资源释放,提高了程序...
垃圾收集:JVM具有自动内存管理和垃圾收集机制,用于自动回收不再使用的对象占用的内存空间。垃圾收集器可以根据不同的算法和策略进行配置和优化,以提高内存使用效率和性能。 类加载机制:JVM通过类加载器加载类...
JVM提供了内存管理、垃圾回收、安全性等功能,使得Java程序具有跨平台性。JVM的结构包括类加载器、解释器、即时编译器等组件,通过优化和调整这些组件可以提高Java程序的性能。JVM的内部机制复杂而丰富,深入了解JVM...
当前,以Hadoop、Spark为...这些大数据处理框架采用分布式架构,使用Java、Scala等面向对象语言编写,在集群节点上以Java虚拟机(JVM)为运行时环境执行计算任务,因此依赖JVM的自动内存管理机制来分配和回收数据对象.
虚拟机类加载机制 编译期编译优化 运行期优化 高效并发-java内存模型与线程 线程安全与锁优化 1 标记-清除算法:首先标记所有需要回收的对象(引用计数或可达性分析算法标记),在标记完成后统一回收所有被标记的对象...
2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...
2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...
2. 内存管理:JVM负责内存的分配和垃圾回收。它会自动为Java应用程序分配内存,并在对象不再被引用时自动释放内存。 3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的...
一、Jdk组成 二、Jdk32与jdk64的差异 三、自动内存管理机制 四、内存泄露与内存溢出 五、垃圾回收算法 六、虚拟机性能监控工具
第二部分 自动内存管理机制 第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...
参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:java 虚拟机具有一个堆,...
主要包含:JVM概述,内存结构讲解,对象实例化,垃圾回收,类的加载,程序编译,代码的优化,性能监控与调优. JVM:全称 Java Virtual Machine,一个虚拟计算机,Java 程序的运行环境(Java二...自动的内存管理,垃圾回收机制.