导言:java是基于一门虚拟机的语言,所以了解并且熟知虚拟机运行原理非常重要。
先整体看一张java虚拟机技术图:
一、堆
1、方法区,Method Area,主要存放已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。
又称为永久代。
比如spring 使用IOC或者AOP创建bean时,或者使用cglib,反射的形式动态生成class信息,
如果生成大量的动态类,造成堆内存不足,则会抛出OutOfMemoryError异常。
又比如tomcat把jsp编译成servlet类的时候,也会造成这种情况。
2、运行时的常量池:是方法区的一部分。用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。常量池有动态性,可以添加数据。比如string常量池,imtern()。其实就是享元模式的一种实现。
运行时常量池溢出:比如一直往常量池加入数据,就会引起OutOfMemoryError异常
3、java堆,java heap。是java虚拟机所管理的内存中最大的一块。是所有线程共享的一块内存区域,在虚拟机启动时创建。存放对象实例,数组。而垃圾收集器管理的主要区域也是这个区域,也被称为GC堆。
分为新生代和老年代。
当对象大量生成造成内存不足时,也会抛出异常。
二、栈
1、虚拟机栈,是线程私有的,与线程的生命周期相同。描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,用于存放局部变量表(基本类型、对象引用)、操作数栈动态链表、方法出口等信息。
如果一个线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常, 比如递归调用。
如果线程生成数量过多,无法申请足够多的内存时,则会抛出OutOfMemoryError异常。比如tomcat请求数量非常多时,设置最大请求数。
2、本地方法栈,Native Method Stack。也就是调用虚拟机使用到的Native方法服务。也会抛出以上两种异常。
3、程序计算器。当前线程所执行的字节码的行号指示器。
三、直接内存
并不是虚拟机运行时数据区的一部分。JDK1.4引入的nio,可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DiectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中提高性能,因为避免了java堆和Native堆中来复制数据。
四、小结
虚拟机内运行时数据区整体就是上面所述,所有java对象分配回收等一系列的操作都在上述数据区,我们自己也根据虚拟机规范写一个java虚拟机,也要遵循以上原则。
相关推荐
第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行...
3. 运行时数据区:模拟JVM的堆、栈、方法区等,存储对象实例和运行时信息。 4. 类型系统:定义Java的类、接口、数组等类型,并处理类型检查和转换。 四、Rust实现JVM的关键技术 1. 解析字节码:使用Rust的二进制...
- 运行时数据区:包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。 - JIT编译器:即时编译器将热点代码转换为本地机器代码,提高执行效率。 2. **JVM参数调优** - 内存设置:如-Xms和-Xmx用于设置堆内存大小...
2. **收集NMT报告**: 一旦JVM运行,可以使用`jcmd`命令获取NMT报告。例如,`jcmd <PID> VM.native_memory`会显示当前进程的内存使用情况。`<PID>`是Java进程的ID。 3. **Python处理NMT数据**: 解压缩后的项目可能...
为了更好地了解JVM的运行状态,可以启用以下选项来获取详细的性能数据: - **-XX:+PrintGC**:打印出GC的简要信息。 - **-XX:+PrintGCDetails**:打印出GC的详细信息。 例如: ``` -XX:+PrintGC [GC 118250K->...
- **运行数据区**:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等几个部分。 - **堆**:存储对象实例,是所有线程共享的一块内存区域。 - **方法区**(在Java 8后变为元空间):存储已加载类的信息,如类...
从0-1学习JVM,你需要理解以下几个关键知识点: 1. **JVM架构**:JVM主要由类加载器、运行时数据区、执行引擎、本地方法接口和本地库组成。每个部分都有其特定的功能,如类加载器负责加载类文件,执行引擎负责解释...
- JVM内存模型主要包括堆内存、栈内存、方法区和程序计数器。理解这些内存区域的功能和用途对于有效管理内存至关重要。 3. **JVM性能调优参数**: - `-Xms`和`-Xmx`分别用于设置初始堆内存和最大堆内存大小。合理...
Java虚拟机(JVM)是Java程序运行的基础,它的全称是Java Virtual Machine。在Java应用程序执行过程中,JVM负责管理内存,包括对象的分配、垃圾回收等关键任务。"jvm-full-gc.zip"这个压缩包很可能包含了关于JVM全GC...
1. **实时监控**:该工具可以实时显示JVM内存的使用情况,包括堆、栈和方法区的占用,帮助开发者了解应用程序运行时的内存状态。 2. **对象分配追踪**:通过可视化的方式,展示对象创建和分配的过程,便于找出内存...
在Java开发领域,JVM(Java Virtual Machine)是运行所有Java应用程序的核心,它负责解析字节码并执行程序。JVM调优是一项重要的技能,它能够帮助我们优化应用程序的性能,减少内存消耗,提高响应速度,确保系统的...
1. **JVM参数设置**:根据应用需求,设置合适的JVM启动参数,如堆大小(`-Xms`和`-Xmx`)、新生代与老年代的比例(`-XX:NewRatio`)、Eden区与Survivor区的比例(`-XX:SurvivorRatio`)、GC日志输出(`-XX:+...
运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。 Jvm中有多种垃圾收集器,如串行(Serial)垃圾收集器、并行(Parallel)垃圾收集器、并发(Concurrent)垃圾收集器等。其中,串行垃圾...
### JVM运行时数据区详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,定义了一系列用于程序执行过程中使用的数据区域。这些数据区域在JVM启动时创建,在JVM退出时销毁。其中一些数据区域是线程独立...
JVM参数调优是提升Java应用程序性能的关键环节,尤其是在高并发、大数据量的环境中,合适的JVM配置可以显著改善系统的响应速度和稳定性。 在进行JVM调优时,我们主要关注以下几个核心方面: 1. **内存设置**:JVM...
JVM性能监控和分析工具是Java开发者在进行性能调优和故障排查时不可或缺的帮手。JVM(Java虚拟机)提供了多种内置的工具以及支持第三方工具,以监控和分析Java应用程序的运行状态和性能指标。这些工具能够帮助开发者...
《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...
- **性能监控**:实时收集和分析应用程序的运行数据,如方法执行时间、内存消耗等。 - **故障排查**:通过插入日志或断点,便于在问题发生时快速定位原因。 - **功能增强**:无需修改源代码,即可为现有应用添加新...