java内存分为堆(heap),栈(stack),方法区(method Area),程序计数器(Program counter Register)
程序计数器:占用很小的内存,线程私有区域。唯一没有内存溢出异常(OutOfMemoryError)的区域。每个线程都有一个程序计数器用来记录程序的执行状态,可以看作是字节码的行号指示器。多线程是通过轮流切换并分配处理器执行时间的方式来实现的。一个确定的时刻一个处理器只有一个线程在运行,每个线程通过程序计数器来恢复之前执行的位置。
栈:分为JVM栈和本地方法栈
java虚拟机栈:线程私有区域。其生命周期与线程相同。
每个方法在执行的同时都会创建一个栈帧用于存储局部变量表(编译器可知的各种基本类型、reference)、操作数栈、动态链接、方法出口等信息,每个方法从调用到完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表的内存空间在编译期完成分配,运行期间不会改变其大小
线程请求的栈深度大于虚拟机所允许的深度 抛出StackOverflowError。还有内存不够用OutOfMemoryError。可以通过递归一个数字的++来造成
本地方法栈:跟java虚拟机栈差不多
java堆:线程共享的区域,所有对象的实例都在这里分配内存。是java垃圾收集器管理的主要区域。
方法区:线程共享区域,存储已经被虚拟机加载的类的信息(类名、访问修饰符、字段描述、方法描述),常量、静态变量、即时编译编译后的代码数据。方法区的内存回收比较苛刻(永久带),一般是对常量池的回收和对类型的卸载。
运行时常量池:存储编译期字面常量符号引用,这部分内容在类加载后进入方法区的运行时常量池。如文本字符串,声明为final的常量值等
Java中八种基本类型的包装类的大部分都实现了常量池技术,它们是Byte、Short、Integer、Long、Character、Boolean,另外两种浮点数类型的包装类(Float、Double)则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值在-128到127时才可使用对象池。
直接内存:nio的知识,通过 ByteBuffer.allocateDirect()创建,在堆外分配内存,
对象的创建new object():虚拟机遇到一个new的指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用所代表的类是否已被加载、解析和初始化过。如果没有必须执行相应的类加载过程。对象所需内存在类加载完成后便可完全确定,
hotsopt虚拟机中,对象在内存分为3个部分对象头、实例数据、对齐填充
对象头:哈希码、GC分代年龄,锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。还可能存储查找对象元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)
- 强引用:不会被回收
- 软引用:在系统将要发生内存溢出异常之前,把这些对象列进回收范围之中进行二次回收
- 弱引用:被弱引用关联的对象只能存活到下次垃圾收集发生之前
- 虚引用:....
GC回收:
通过GC Roots对象作为起点,从这些节点向下搜索,搜索所走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连,则证明此对象不可用
java语言中,可作为GC Roots 的对象包括以下几种
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 方法区中静态属性引用的对象。
- 方法区中常量引用的对象。
- 本地方法栈中JNI引用的对象
一个对象死亡要至少经过两次标记过程,第一次标记并进行筛选,筛选条件此对象是否有必要执行finalize()方法,如果有必要执行,对象放到F-Queue的队列中,并由虚拟机低优先级线程进行去执行。但并不承诺会等待它运行结束。可以在finalize()方法中将this赋给某个变量(最好不要介么做)。第二次标记时它将被移出即将回收的集合。
内存回收:要回收的内存分为新生代和老年代,
新生代分为3个部分8:1:1 每次回收90%,将还存活的对象复制到另外10%,如果不够用将通过分配担保机制分配到老年代, 然后清空那90%。(复制算法)
老年代对象存活率较高,所以采用标记-整理算法,让存活的对象向一端移动,然后清理边界以外的内存。
每次GC都会对新生代存活下的对象年龄加一如果熬过一个晋升老年代的阀值,就将其放到老年代中,阀值不是绝对标准
相关推荐
在 JVM 中,如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出内存溢出异常信息。Heap Size 最大不要超过可用物理内存的 80%,一般的要将 Xmx 和 Xms 设置相同避免每次 GC 后都要调整虚拟机堆的...
JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...
4. **垃圾收集机制**:GC是JVM自动管理内存的主要手段,涉及分代收集、标记-清除、复制、标记-整理等多种算法。书中会详细介绍各种算法的工作原理、优缺点,以及在不同场景下的选择。 5. **GC调优**:包括如何分析...
通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...
JVM内存模型深度剖析与优化 JVM内存模型是Java虚拟机的核心组件之一,它直接影响着Java应用程序的性能和可靠性。本文将深入剖析JVM内存模型的结构和工作机理,并讨论如何优化JVM参数以提高Java应用程序的性能。 一...
JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要。 ### 1. JVM内存结构 #### 1.1.1 JVM内存概述 JVM内存分为几个关键区域,每个区域都有特定的...
《深入理解IDEA插件JProfiler11:高效优化JVM内存》 在Java开发领域,高效运行和优化JVM内存是至关重要的。IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能...
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
### JVM性能调优——JVM内存管理与GC回收详解 #### 概览 在现代软件开发领域,Java凭借其强大的跨平台能力和丰富的生态系统成为企业级应用的首选语言之一。然而,随着应用程序复杂度的提高以及业务需求的变化,...
《JVM性能调优-JVM内存整理及GC回收》是一份深入探讨Java虚拟机(JVM)优化的重要学习资料,特别适合对JAVA编程有经验的开发者。这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage ...
**输出GC日志**是分析JVM内存状况的首要步骤。这可以通过在JVM启动参数中添加特定选项来实现。例如,使用以下参数: 1. `-XX:+PrintGC` - 输出GC的基本信息。 2. `-XX:+PrintGCDetails` - 输出更详细的GC信息,包括...
JVM 内存管理之道 JVM垃圾回收机制 JVM GC组合 JVM 内存监控工具
总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1 GC的深入见解,有助于Java开发者更好地理解和控制JVM的内存管理,提升应用程序的稳定性和效率。通过学习这些知识,开发者可以解决实际开发中...
MAT JVM内存分析工具可以帮助开发者深入理解Java虚拟机(JVM)的内存管理机制,通过分析堆内存快照来识别内存消耗异常的情况。 首先,MAT提供了丰富的视图来帮助用户查看内存状态,例如“概述”视图可以快速了解堆...
理解JVM内存模型和GC机制是Java开发人员的必备技能,通过合理配置JVM参数和选择合适的垃圾收集器,可以有效地提升应用程序的性能和稳定性。在实际项目中,结合监控工具(如VisualVM、JConsole等)进行调优,是解决...
接下来,我们讨论GC,它是JVM自动管理内存的关键机制。GC的主要目标是回收不再使用的对象,以防止内存泄漏。GC的类型主要有以下几种: 1. ** Minor GC**:主要针对年轻代(Young Generation)的垃圾收集,通常速度...
JVM(Java Virtual Machine)的垃圾收集器(GC,Garbage Collector)扮演着核心角色,负责自动管理应用程序的内存,防止内存泄漏和性能问题。MAT(Memory Analyzer Tool)是由Eclipse基金会提供的一个强大的分析工具...
JVM 内存参数详解以及配置调优 JVM 内存参数是 Java 虚拟机中最重要的参数之一,它直接影响着 Java 应用程序的性能和稳定性。在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、...