JAVA内存区域及使用分配

JAVA虚拟机运行时会将JVM使用的内存划分为不同的区域,每个区域负责不同的功能,以及各个区域的创建,销毁都各不相同。

下图是JVM运行时内存数据区的划分,

图1、JVM运行时数据区

1、程序计数器

每个线程都拥有一个独立的程序计数器,用于记录当前线程所要执行的字节码指令,该类内存区域为“线程私有”内存。

2、虚拟机栈

该区域也有人称为栈内存(对应java堆内存),这个叫法不完全正确,但可以便于理解。

该区域也是线程私有的,并且与线程的生命周期相同。

主要负责方法执行的内存部分,在每个方法执行时都会创建一个栈针存储局部变量,操作数等方法相关信息,每一次方法的调用到完成,都对应一个栈针在虚拟机栈中出入栈的过程。

该区域会抛出stackOverFlowError和OutOfMemoryError错误

stackOverFlowError 是线程请求的栈深度大于虚拟机允许的深度,如下面的代码

public static void main(String[] args) {
		testStackOverFlow();
	}
	public static void testStackOverFlow(){
		System.out.println("stackOverFLow");
		testStackOverFlow();
	}

OutOfMemoryError错误就是栈空间溢出,比如局部变量过多,占用内存过大,都会产生就不举例说明

3、本地方法栈

和虚拟机栈类似,只是负责本地Native方法,也会抛出stackOverFlowError和OutOfMemoryError错误,如IO中常用的文件读写操作的Native方法,可能是C语言或者其他语言的实现。

4、JAVA堆(JAVA Heap),GC堆

JAVA堆是JAVA虚拟机管理的内存,最大,最重要的部分,是所有线程共享的区域,

也是GC(垃圾回收)的主要回收部分,

再进行划分可以分为新生代,老生代(老年代);新生代可以划分为:Eden,From Survivor,To Survivor

主要存放对象实例,可以通过配置,设置不同代的大小和垃圾回收策略,很多优化也在堆上进行实现。

堆的详细介绍:http://www.begincode.net/blog/47

该区域会抛出 OutOfMemoryError异常

5、方法区(Method Area),非堆,永久代

该区域也是线程共享的内存区域,该区域也会进行垃圾回收,但可以忽略不计,因为效果很难令人满意

主要存储虚拟机加载的类信息,常量,静态变量等

该区域会抛出OutOfMemoryError异常,主要是启动时需要加载的类,常量,静态变量等信息特别多,超过了该区域设置的内存空间,就会抛出异常,

可以看看eclipse内存设置,如果将内存设置特别小就会抛出该内存溢出异常

http://www.begincode.net/blog/50

运行时常量池:属于方法区的一部分,主要存储运行时常量,如String的intern方法产生的字符串常量。

6、直接内存

直接内存没有在图中显示,以为他并不是虚拟机运行时数据区的一部分,不归虚拟机管理,但该内存区域也会出现OutOfMemoryError异常,

该区域使用主要是在NIO的缓冲区的使用,会用到系统直接内存,因为是通过本地方法分配的内存,当本机无法分配更多的内存时就会抛出内存溢出异常

时间: 2024-10-26 08:20:50

JAVA内存区域及使用分配的相关文章

Java内存区域和内存分配

最近面试时经常会被问到JVM以及内存分配的问题,觉得有必要学习总结一下下~~~ 一.Java内存区域 Java中,虚拟机自动进行内存管理,在Java虚拟机执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,主要包含以下几个部分: 1.程序计数器: 当前线程所执行的字节码的行号指示器: 字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令 线程私有:为了线程切换后能够恢复到正确的执行位置,每个线程需要有一个独立的程序计数器: JAVA方法,计数器记录正在执行

(转)Java 内存区域分配和垃圾回收(GC)机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop

Java 内存区域和GC机制

目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual M

Java内存区域划分和GC机制

Java 内存区域和GC机制 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM

JAVA 虚拟机深入研究(三)——Java内存区域

JAVA 虚拟机深入研究(一)--关于Java的一些历史 JAVA 虚拟机深入研究(二)--JVM虚拟机发展以及一些Java的新东西 JAVA 虚拟机深入研究(三)--Java内存区域 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的围城,城外的人想进去,城里的人想出来. Java运行的时候会把内存分为若干个,他们各有各的用途,每块区域的创建和销毁都是相对独立的,有的跟虚拟机一起混,有的则抱着用户的大腿同生共死. 按照第七版的<Java虚拟机规范>规定,JVM所管理的内存包括以下

Java虚拟机2:Java内存区域及对象

http://www.cnblogs.com/xrq730/p/4827590.html 几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB,相邻单位之间都是1024倍,1024为2的10次方,即 1Byte = 8bit,1K = 1024Byte,1M = 1024K,1G = 1024M,1T = 1024G 2.计算机存储元件 寄存器:中央处理器

Java 内存区域详解

引言 学习Java也有一段时间了,总感觉有些东西学的不是很精通.例如Java内存区域到底是怎么样的?程序是怎么跑的?对象是怎么存放的?这些都影响了我对自己的代码的熟悉程度. 一 运行时数据区域 Java虚拟机在执行java程序的过程中,会把它所管理的内存划分成若干个不同的数据区域(每当运行一个java程序都会启动一个虚拟机).有一本书叫做<Java虚拟机规范>,讲述了Sun公司对Java虚拟机实现的相关规范,其中讲了虚拟机将所管理的内存分为以下几个部分: 程序计数器 虚拟机栈 本地方法区 堆

深入理解java虚拟机系列(一):java内存区域与内存溢出异常

文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了开始.如果有什么错误或者遗漏,欢迎指出. 一.概述 先上一张图 这张图主要列出了Java虚拟机管理的内存的几个区域. 常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java内存区域的划分实际上远比这复杂,从上图就可以看出了.堆栈分法中所指的"栈"实际上只是虚拟机栈,或者说是虚拟机栈中的局部变量表部分.接下

深入了解Java虚拟机(1)java内存区域与内存溢出异常

java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局部变量,基本类型变量,引用等信息 3.Java本地方法栈:线程私有,为虚拟机使用到的Native方法服务 4.Java堆:线程共享,是垃圾收集器的主要工作地方:存储对象实例等 5.方法区:线程共享:存储类信息,常量,静态变量等 运行时常量:存放编译时生成的各种字面量和符号引用 6.直接内存:机器的内