本地方法
|
非java代码实现的java方法,使用native关键字,除abstract外可与java关键字连用
|
程序计数器
|
可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能。该区域时java虚拟机规范中没有规定outofmeroryError情况的区域
|
虚拟机栈
|
1、生命周期同线程一致
2、程序员通常指的栈内存区,更确切的是指虚拟机栈中的局部变量表部分
3、局部变量表存放编译器的各种基本数据类型,对象引用
4、线程请求的栈深度大于虚拟机所允许的深度时抛出stackOverFlowError
5、当虚拟机在扩展时申请不到足够的内存的时候会抛出OutOfMemoryError
6、虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧(stack frame),用于存放局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行完成就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
|
本地方法栈
|
1、功能同虚拟机栈,只不过该区域执行的是native方法
2、同虚拟机栈一样会抛出stackOverFlowError和outOfMemoryError
3、有些虚拟机将本地方法栈和虚拟机栈合二为一
|
Java堆
|
1、Java虚拟机所管理的内存中最大的一块
2、存放几乎所有的对象实例
3、GC管理器的主要管理区域
4、根据GC的分代算法将堆分为新生代和老年代,或者更细的分为Eden空间,From Suvivor空间,To Suvivor空间
5、堆为线程共享区
6、从内存分配的角度来看,堆中可以划分出多个线程私有的分配缓冲区(TLAB)
7、对内存的划分是为了更好的回收内存和分配内存
8、Java堆在逻辑上是连续的,在物理上可以不连续
9、大小可调,通过-Xmx和-Xms参数调节大小
10、当堆中没有内存分配给新创建的对象实例,并且堆无法再扩展的时候就会抛出outOfMemoryError
|
方法区
|
1、线程共享区
2、存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码
3、俗称永久代
4、通过参数-XX:MaxPermSize来限制方法区的大小
5、该区域的内存回收主要针对常量池和对类型的卸载
6、当该区无法满足内存分配的需求的时候会抛出oytOfMemoryError
|
运行时常量池
|
1、方法区的一部分
2、class文件中存放编译期生成的各种字面量和符号的引用的常量池信息,在加载完后放入运行时常量池
3、抛出outofMemoryError的情况同方法区
|
直接内存
|
1、不是虚拟机运行时数据区的一部分
2、不受堆内存大小的限制
3、NIO使用Native函数库直接操作堆外内存提高性能,但是如果堆内存分配不合理,就会导致动态扩展的时候抛出outOfMemoryError
|
内存分配与回收策略
- 对象优先在新生代Eden区分配
大部分对象创建的时候会在新生代的Eden空间分配空间,当Eden区没有足够的空间时,JVM会发起一次Minor GC
- 大对象直接进入老年代
大对象是指需要大量连续的内存空间的Java对象,典型的大对象就是那种长字符串和长数组,大对象经常会导致内存空间还有,但提前触发了GC来腾出空间安置他们。虚拟机提供参数-XX:PretenureSizeThreshold,所需内存超过该参数值的对象直接分配在老年代
- 长期存活的对象将进入老年代
虚拟机给每个对象定义了一个年龄计数器,当对象在Eden区出生并且经历一次Minor GC后依然存活并且能被Survivor容纳的话,该对象将会被移到Survivor区并且对象年龄加一,当它的年纪达到一定值(默认是15)时就会被移到老年代,如果老年无法存放的话就会发起一次Full GC,对于晋升老年代的对象年龄阀值可以通过参数-XX:MaxTenuringThresHold来设置
- 动态对象年龄判断
通常情况下新生代的对象必须达到对象年龄才会放入老年代,但是如果Survivor区中同一年龄的对象占用的总内存大于Survivor空间的一半,那么Age>=该年龄的对象直接放入老年代
- 空间分配担保
在发生Minor GC之前,虚拟机会先检查老年代最大的连续空间是否大于新生代所有对象的总空间,如果大于则可以保证此次Minor GC是安全的,如果不成立,则虚拟机会查看-XX:HandlePromotionFailure的值是否允许担保失败,如果允许则发起Minor GC,尽管此次GC是非安全的,如果不允许则发起一次Full GC
相关推荐
Java虚拟机(JVM)是Java程序运行的核心,它负责管理程序的内存,包括内存的分配、使用和回收。在深入理解JVM内存管理和垃圾收集器之前,我们需要先了解JVM内存模型的基本结构。 内存模型主要包括以下几个部分: 1...
5. **内存管理**:JVM自动进行垃圾收集,管理堆内存。它采用分代收集算法,包括新生代、老年代和永久代,以及各种GC策略如Stop-the-world、并发标记等。 6. **异常处理**:JVM支持异常处理框架,通过异常表来确定...
2. 第二部分聚焦JVM的内存管理,包括虚拟机内存区域的划分、内存溢出异常的原因、垃圾收集算法与收集器的工作原理,以及监控和调试工具的使用,这些都是优化程序性能的关键。 3. 第三部分详细阐述了虚拟机的执行子...
Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了跨平台的运行环境。深入理解JVM的工作原理对于优化Java程序性能、排查问题以及提升开发能力至关重要。以下将详细介绍JVM的主要组成部分、内存模型、...
### JAVA虚拟机的内存管理详解 #### 一、引言 在Java 2平台的强大支持下,J2SE能够自动管理内存,这大大减轻了开发者的负担,让他们不必再进行复杂的显式内存管理工作。本文档旨在对Sun J2SE 5.0版本中的Java ...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。在《实战Java虚拟机——JVM故障诊断与性能优化》一书中,作者深入探讨了如何对JVM进行故障排查和性能调优,通过...
Java虚拟机内存管理总结 Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象...
Java虚拟机(JVM)是Java程序的核心组件,它负责执行字节码并管理程序的生命周期。当遇到以下四种情况时,JVM的生命周期将会结束:执行System.exit()方法、程序正常执行完毕、程序异常终止或者由于操作系统错误导致...
深入 Java 虚拟机.pdf Java 虚拟机(Java Virtual Machine,JVM)是 Java 语言的 runtime 环境,是 Java 程序...Java 虚拟机也提供了自动内存管理、垃圾收集、多线程支持等功能,提高了 Java 程序的可靠性和性能。
使用 JAVA 虚拟机解决内存管理问题 JAVA 虚拟机是运行在主操作系统顶层的软件层,使通讯程序、Java 应用程序与任何底层硬件的改变互不相关。虚拟机技术是 Java 成功地移植到嵌入式系统的关键。Java 虚拟机是一种...
在Java编程中,Java虚拟机是至关重要的组成部分,它负责执行编译后的Java字节码,并通过动态类加载、内存管理、垃圾回收等机制保证程序的高效运行。本书深入探讨了以下几个关键知识点: 1. **JVM架构**:JVM由类...
《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...
Java虚拟机(JVM)的内存管理机制是Java编程中至关重要的部分,它涉及到程序的性能和稳定性。本文主要分析了Java虚拟机的内存管理,特别是垃圾回收机制及其实现。 首先,Java虚拟机中的内存主要分为堆内存和栈内存...
每个区域承担不同的内存管理职责,保证Java程序的稳定运行。 ##### 2.5 JVM内存模型详解 - **2.5.1 Java栈** Java栈用于存储局部变量和方法调用的状态,每个线程都有自己的Java栈,支持线程的独立执行。 - **...
以下是对Java虚拟机内存模型的详细解读。 1. **程序计数器(Program Counter Register)** - 这是每个线程私有的内存区域,用于存储当前线程执行的字节码的地址,每次方法调用都会更新这个计数器,以便下一次知道...
垃圾回收(Garbage Collection)是JVM中一个重要的自动化内存管理机制。它负责回收堆内存中不再使用的对象实例,从而防止内存泄漏。不同的JVM实现采用不同的垃圾回收算法,常见的算法有标记-清除、标记-整理、复制、...
支持复合对象的Java虚拟机内存管理技术研究 在面向对象系统中,对象是研究的基本单位,对象可以是简单的整数或复杂的飞机等。对象具有状态和操作,对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。...
《Java虚拟机规范(Java SE 7)》是Java开发者深入理解Java运行机制的重要参考资料,它详细阐述了Java虚拟机(JVM)的工作原理和内存管理机制,为开发者提供了宝贵的洞察力,帮助他们优化程序性能,理解和解决运行时...