Java内存区域

运行时数据区域

Java虚拟机在运行程序时将其管理的内存分为若干数据区域:
JDK1.6

程序计数器

记录当前线程执行的字节码指令的地址。

Java虚拟机栈

调用方法时会创建一个栈帧存储局部变量表等信息。
虚拟机栈
可以通过-Xss这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小:
该区域可能抛出以下异常:

  • 当线程请求的栈深度超过最大值,会抛出 StackOverflowError 异常;
  • 栈进行动态扩展时如果无法申请到足够内存,会抛出 OutOfMemoryError 异常。

本地方法栈

和虚拟机栈类似,但只为本地方法服务。

Native Method,由其他语言编写,编译成基于处理器的机器码,本质是Java调用非Java代码的接口。

存放对象实例的线程共享内存区域,垃圾收集器的主要管理区域(故又称“GC堆”)。详见垃圾回收机制

方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
JDK1.8之后,方法区被元空间取代,使用本地内存,不再位于虚拟机内存中。
因为方法区的大小受虚拟机内存限制,容易溢出;而元空间使用直接内存,只受系统内存限制,不容易溢出。

方法区是Java虚拟机规范中的定义,相当于接口;永久代是HotSpot虚拟机对方法区的具体实现,相当于类。

JDK1.8

运行时常量池

运行时常量池是方法区的一部分,Class 文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。
JDK1.7把字符串常量池从方法区移到了堆中。

直接内存

JDK1.4 中新加入的 NIO(New Input/Output) 类,引入了一种基于通道(Channel)与缓存区(Buffer)的 I/O 方式,它可以直接使用 Native 函数库直接分配堆外内存(Native 堆),然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆之间来回复制数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值