1.首先java的运行时存储区域大致分为:java堆,虚拟机栈,本地方法栈,方法区,程序计数器这几个区域,下面对这几块区域的存储信息和可能抛出的异常进行分析。
1>程序计数器。
这个区域主要是用来标识字符码执行时候的行号指示器。如果正在执行的是java方法,那么此时这个指令代表字符码的地址,如果执行的是native方法,那么此时该值为空(Undefine),这个区域是线程私有的,也是唯一不会发生OutofMemoryError错误的区域。
2>java虚拟机栈
该区域在类中方法的执行时会使用,存储的方法内的局部变量,动态链接,方法出口等,每个方法在执行的时候会创建一个栈帧,方法的执行完毕就对应与出栈和入栈的过程。
在该区域,如果申请的栈深度过大,超过了虚拟机所允许的深度就会产生StackOverFlowError异常,如果jvm启动时指定的栈空间过小,那么会引起OutofMemoryError异常。
3>本地方法栈
这个区域主要是为虚拟机执行Native服务的,不同的虚拟机可以自由的实现它,HotSport把这部分区域和java虚拟机栈合二为一,这部分区域也会抛出StackOverflowError和OutofMemoryError异常。
4>java堆
java堆是虚拟机管理中最大的一块,几乎所有的java对象都会在这个区域上面进行分配,除了一些jvm进行的优化,比如栈上分配,标量替换等等,该部分也是垃圾回收的主要管理区域,由于现代的垃圾收集器都是分代收集的,所以java堆还可以细分为:新生代和老年代。
5>方法区
该区域也是个线程共享的区域,用来存储被jvm加载进来的类信息,常量,静态变量,即时编译器编译后的代码,这个区域的主要回收对象是常量池的回收和类型的卸载,当方法区无法进行内存分配时会发生OutofMemoryError异常。
6>运行时常量池
该区域是方法区域的一部分,主要用来存放编译器生成的各种字面量和符号引用。当常量池无法申请到足够的内存后也会发生OutofMemoryError异常。
7>直接内存
该区域不是java运行时数据的部分,java中的NIO机制引入了一种基于通道的I/O方法,它可以使用Native函数直接分配堆外内存,然后通过一个存放在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作,这样可以避免在java堆和native堆中来回的复制数据,从而提高性能。
2.对象的访问
Object obj = new Object() 这句代码会涉及到三个内存区域,分别是堆,栈,方法区,
首先在方法中时会存放在栈帧中,只保存该对象的一个引用,在这该对象的实例存储将会放在堆中来进行,而对象的类型等相关信息会放到java的方法区。
在栈中的这个引用访问对象主流的有两种方式,第一种是句柄,第二种是直接指针。
1>句柄:使用该方式时会在java堆中开启一片句柄池,用来存放该对象的实际地址,而栈中保存的知识句柄池的地址而已,使用该种方式的好处是在进行对象的移动时只需改变句柄池中的实例数据指针,而栈中的引用不需要修改。
2>直接指针访问方式,使用该种指针访问的话速度更快,他不需要进行指针的二次定位,sun HotSpot虚拟机就是采用的此种访问方式。
分享到:
相关推荐
Java内存区域与内存溢出异常.pdf
JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行...内存溢出问题是 Java 开发中常见的错误,通过调整容器参数和优化程序代码,可以避免内存溢出的发生。
Java内存区域是Java虚拟机(JVM)管理内存的核心组成部分,它们主要分为以下几个部分: 1. **程序计数器(Program...开发者应当关注内存分配、垃圾收集策略以及对象访问方式,以提高程序效率并避免内存溢出异常。
1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间不足时,会抛出`java.lang.OutOfMemoryError: Java heap space`异常。为了优化内存管理,Java采用了垃圾回收机制(Garbage ...
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
1. **识别问题**:通过异常信息定位是哪种类型的内存溢出,结合日志和监控工具分析内存使用情况。 2. **分析内存快照**:使用如MAT(Memory Analyzer Tool)等工具分析堆转储文件,找出内存泄漏的源头。 3. **优化...
Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area,Java 8后被元空间取代)以及程序计数器和...
Java堆是Java虚拟机中最大的一块内存区域,用于存储对象实例。当程序创建新的对象并分配给堆时,如果堆空间不足,就会抛出`OutOfMemoryError: Java heap space`异常。Java应用程序可以通过设置JVM的启动参数来控制堆...
1. **理解内存区域与内存区域异常**:学习JVM的内存结构,包括程序计数器、Java堆、虚拟机栈、本地方法栈、方法区和运行时常量池等,并了解它们发生异常的原因。 2. **掌握Java堆内存溢出异常的测试**:通过编写...
Java内存溢出问题通常指的是Java应用程序在运行过程中由于内存分配不当或使用过度导致JVM无法分配更多的内存,从而抛出`java.lang.OutOfMemoryError`异常。本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. ...
Java内存区域与内存溢出异常详解 Java内存区域可以分为程序计数器、虚拟机栈、本地方法栈、堆、方法区五个部分。每个部分都有其特定的作用和生命周期。 1. 程序计数器(Program Counter Register):是当前线程所...
在 JVM 中,如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出内存溢出异常信息。Heap Size 最大不要超过可用物理内存的 80%,一般的要将 Xmx 和 Xms 设置相同避免每次 GC 后都要调整虚拟机堆的...
1. **了解内存结构**:Java内存主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(PC Register)。不同的对象和数据类型在不同的内存区域中分配,...
本文将详细介绍Java编程中常见的内存溢出异常和代码示例,帮助读者更好地理解和避免内存溢出异常。 Java堆溢出异常 在Java中,堆是用于存储对象实例的区域。如果我们不断地创建对象,并且保证GC Root和创建的对象...
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
### Java内存机制学习和使用 #### 一、Java内存机制概览 Java内存管理是Java开发人员必须掌握的核心概念之一。良好的内存管理不仅能够提升应用性能,还能避免常见的内存泄漏问题。本文旨在深入探讨Java内存机制,...
1. `java.lang.OutOfMemoryError`: 这是最常见的内存溢出异常,可能由于以下几个原因: - JVM内存设置过小:如果分配给JVM的内存不足,当程序需要更多内存时,就会抛出此异常。 - 大量数据加载:一次性从数据库中...
Java内存管理和内存问题,特别是内存泄露与内存溢出,是Java开发者必须面对的重要主题。本文主要探讨了Java内存溢出的检查方法和工具,以及内存泄露的基本原理。 首先,当Java应用程序抛出`java.lang....
#### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)、永久代(Permanent Generation Space)等。不同的内存区域有着不同的作用和特点: ...