Java内存区域

[color=blue][b]Java[/b][/color]和C++之间有一堵又内存动态分配和垃圾收集技术所围成的高墙。
对于Java程序员来说,虚拟机的自动内存管理机制的帮助下,不需为每个new操作去写配对的delete/free代码,而且不容易出现内存泄漏和内存溢出的问题,看起来虚拟机管理一切都很好,但是一旦出现了内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将变得很困难。
Java虚拟机在执行Java程序的过程中会把所管理的你存划分为若干个不同的数据区域。这些都有各自的用途和生命周期,有的数据区域随虚拟机进程的启动而存在,有些则依赖用户线程的启动和结束而建立和销毁。
Java虚拟机所管理的内存将会包括以下几个运行时数据区域:
[img]http://dl.iteye.com/upload/attachment/0071/8303/76b38e0b-9c39-3815-8d0c-f7f9260e2b9e.jpg[/img]

接下来简要介绍一下各个组件的作用:
[b]1、程序计数器[/b]
一块较小的内存空间,线程隔离,是当前线程所执行的字节码的行号的指示器。
如果线程正在执行Java方法,这个计数器记录是正在执行的虚拟机字节码指令的地址。
如果正在执行的是Native方法,则该计数器为空。
此内存区域是唯一一个没有规定任何OutOfMemoryError情况的区域。

[b]2、Java虚拟机栈[/b]
线程私有,生命周期与线程相同,描述了Java方法执行的内存模型,进栈和出栈则完成一个方法的执行。每个方法执行都会创建一个栈帧:用于存储局部变量表、操作栈、动态链接、方法出口等信息。
会出现的异常:
栈深度太深--StackOverFlowError
无法申请足够的内存--OutOfMemoryError

[b]3、本地方法栈[/b]
作用与Java虚拟机栈一样,区别是本地方法栈是为虚拟机使用到的Native方法服务的。
会出现的异常:
同上!!!

[b]4、Java堆[/b]
线程共享,在虚拟机启动时创建,是Java虚拟机管理的最大的一块内存,创建的唯一目的是存放对象实例,是GC管理的主要区域,也被称为GC堆。
Java堆可细分为:新生代和老年代。
Java堆上的内存空间不要求物理连接,但必须逻辑连接。即可固定大小又可自定扩展,通过-Xms和-Xmx来控制。
会出现的异常:
无法申请足够的内存--OutOfMemoryError

[b]5、方法区[/b]
与Java堆一样,也是线程共享的内存区域,在虚拟机启动时创建,别名为Non-Heap。
用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
常量池是Java方法区的一部分,存放编译时期生成的各种字面量和符号引用,该部分的内容在类加载后存放于方法区的运行时常量池中。
[color=red]它被归为堆的一个逻辑部分。[/color]
GC在这个区域比较少出现,在这个区域回收的目标主要针对常量池的回收和对类型的卸载。回收的条件比较苛刻。
HotSpot虚拟机把方法区称为“永久代”。
会出现的异常:
无法申请足够的内存--OutOfMemoryError
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值