栈
一般是指 堆内存(Heap)的管理,因为栈(stack)、PC寄存器(PC Register)、本地方法栈(Native Method Stack)都是和线程一样的生命周期
-Xss 设置栈内存大小
栈是不需要垃圾回收的,尽管说垃圾回收是java内存管理的一个很热的话题,栈中的对象如果用垃圾回收的观点来看,他永远是live状态,是可以reachable的,所以也不需要回收,他占有的空间随着Thread的结束而释放
堆
堆内存分为以下几个区:
Old Space 、 Eden 、From Space、To Space
-Xms和-Xmx来指定堆内存最小值和最大值
通过-Xmn来指定Young Generation的大小
通过-XX:NewRatio来指定Eden区的大小,在Xms和Xmx相等的情况下,该参数不需要设置
通过-XX:SurvivorRatio来设置Eden和一个Survivor区的比值
垃圾回收
JVM中会在以下情况触发回收
-
对象没有被引用
-
作用域发生未捕捉异常
-
程序正常执行完毕
-
程序执行了System.exit()
-
程序发生意外终止
如何确定某个对象是垃圾
1.引用计数法:对象配备一个整形计数器,引用一次+1,引用失效-1,计数器=0,表示对象不再被使用
2.可达性分析:GC Roots,如果一个对象不能达到GC Roots的时候,说明可以被回收
垃圾回收算法
1.标记清除法:标记阶段(标记出所有需要被回收的对象),清除阶段(回收被标记的对象所占用的空间)
注意:标记清除算法先通过根节点标记所有可达对象,然后清除所有不可达对象,完成垃圾回收
缺点:效率低,内存碎片化严重(后续大对象找不到可利用的空间)
2.复制算法:将内存容量分成两块,每次只使用其中一块,当这块内存用完的时候,将存活的对象复制到另外一块,然后再把已使用的内存空间一次性清理掉
优点:算法实现简单,效率高,不易产生碎片
缺点:内存使用空间被压缩到一半
3.标记整理法:与标记清除法一样,区别在与完成标记后,不是直接清理可回收对象,而是将存活对象都移向内存的一端,然后清理掉端边界以后的内存
注意:标记整理算法的最终效果等同于标记清除算法执行完成后,再进行一次内存碎片的整理,因此也叫标记清除压缩算法
4.分代收集法:
核心思想:根据对象的存活生命周期将内存划分为若干不同的区域
新生代:每次垃圾回收时都有大量对象被回收
老年代:每次垃圾回收时只有少量对象需要被回收
新生代一般采用复制算法
老年代采用标记整理算法
注意:在堆之外还有一个永久代(Permanent Generation),它用来存储class类,方法,常量描述等。对永久代的回收主要包括废弃常量和无用的类
垃圾收集器
新生代垃圾收集器有Serial、ParNew、Parallel Scavenge,G1,属于老年代的垃圾收集器有CMS、Serial Old、Parallel Old和G1.其中的G1是一种既可以对新生代对象也可以对老年代对象进行回收的垃圾收集器。
Serial 单线程垃圾收集器,针对新生代的收集器,采用复制算法
ParNew Serial收集器的多线程版本,采用复制算法,伴随着CPU数量的增加,收集效率也会大大增加
Parallel Scavenge 并行收集器,采用复制算法,关注系统吞吐量
G1收集器(整个Java堆:包括新生代和老年代)
特点
并行与并发
分代收集(仍然保留了分代的概念)
空间整合(整体上属于“标记-整理”算法,不会导致空间碎片)
可预测的停顿(比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒)
Serial Old serial的老年代版本,采用标记整理算法 单线程
Parallel Old Parallel Scavenge的老年代版本,采用标记整理算法 多线程
CMS收集器 以最小回收时间停顿为目标的并发回收器,采用标记清除算法
垃圾收集器一览表
Serial | 新生代 | 复制算法 | 单线程 | 单线程收集器 |
Serial Old | 老年代 | 标记整理算法 | 单线程 | Serial的老年代版本 |
ParNew | 新生代 | 复制算法 | 多线程 | Serial收集器的多线程版本,可与CMS配合使用 |
Parallel Scavenge | 新生代 | 复制算法 | 多线程 | 类似ParNew收集器,更关注系统吞吐量 |
Parallel Old | 老年代 | 标记整理算法 | 多线程 | 与Parallel Scavenge收集器配合使用,特点:“吞吐量优先”,在注重吞吐量和CPU资源敏感的场合,都可以使用这个组合 |
CMS收集器 | 老年代 | 标记清除算法 | 多线程 | 以最小回收时间停顿为目标的并发回收器 |
G1 | 新生代、老年代 | 标记整理算法 | 多线程 | 面向服务端的收集器,能充分利用CPU和多核环境; 并行与并发收集器,它能够建立可预测的停顿时间模型。 |
相关推荐
JVM 内存管理之道 JVM垃圾回收机制 JVM GC组合 JVM 内存监控工具
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
### JVM内存管理详解 #### 一、引言 在探讨JVM内存管理之前,我们先来看一下为何要深入了解这一主题。对于深入掌握Java的人来说,内存管理是不可或缺的一部分。随着技术的发展,内存管理变得越来越自动化,但这也...
JVM内存管理是Java平台的一个重要特性,其内存空间的分配和回收机制对Java应用程序的性能和稳定性有着至关重要的影响。 首先,JVM内存管理涉及的内存空间主要分为方法区(Method Area)、堆(Heap)、本地方法栈...
**JVM内存管理及调优** Java虚拟机(JVM)是Java程序运行的基础,它为Java应用程序提供了运行环境。JVM内存管理是优化Java应用性能的关键环节,涉及到内存分配、垃圾回收以及内存溢出等问题。毕玄,一位在淘宝有着...
《JVM内存管理学习笔记》 在Java世界中,JVM(Java Virtual Machine)是运行所有Java应用程序的核心。深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、...
理解JVM内存管理和垃圾回收机制对于优化Java应用的性能至关重要。开发者可以根据应用的需求和特点,通过调整JVM参数来选择合适的内存配置和垃圾回收策略。同时,使用如JVisualVM等工具进行实时监控和分析,可以帮助...
总的来说,JVM内存管理、调优与监控是一项综合性的技术工作,需要对JVM内部机制有深入理解,并结合具体应用场景进行细致的分析和实践。由于JVM的实现可能存在差异,且规范与实现之间存在一定的不一致性,因此,进行...
理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...
在《JVM内存管理白皮书》中,深入探讨了JVM如何处理内存分配、垃圾收集以及各种收集器的工作原理。以下是对该白皮书部分内容的详细解读: 1. 显式与自动内存管理: 在传统的C++等语言中,程序员需要手动进行内存...
理解JVM内存管理和静态成员的工作原理对于优化Java程序的性能至关重要。合理的对象创建、内存使用以及静态成员的恰当运用,都可以帮助提升程序效率并降低内存消耗。在编写代码时,应根据实际需求选择静态或非静态...
JVM 内存管理面试常见问题全解 JVM 内存管理是 Java 程序员必须掌握的重要知识点,本文将对 JVM 内存管理的面试常见问题进行全解。 一、什么是 JVM Java Virtual Machine(Java 虚拟机)是 Java 程序实现跨平台的...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到...总之,JVM内存管理和垃圾回收是优化Java应用性能的关键。了解这些概念并正确配置JVM参数,可以帮助开发者创建更高效、更稳定的软件系统。
JVM内存管理知识思维导图.png
### JVM内存管理与GC模型详解 #### 一、引言 在现代软件开发中,Java虚拟机(JVM)作为一种广泛使用的平台,其内部机制尤其是内存管理和垃圾收集(GC)模型,对提升程序性能和稳定性至关重要。本文将深入探讨Sun ...
Java虚拟机(JVM)内存管理和...总结来说,JVM内存管理和垃圾回收是一个复杂而精细的过程,涉及多种策略和算法,旨在高效利用内存,减少应用暂停时间,并防止内存泄漏。理解和掌握这些原理对优化Java应用性能至关重要。