资讯专栏INFORMATION COLUMN

Java虚拟机笔记-内存区与内存溢出

Ocean / 1758人阅读

摘要:小结程序计数器和虚拟机栈是线程私有的,而堆和方法区是线程共享的除了虚拟机运行时内存,在中使用类可以直接操作本机内存。

Java的内存区域

Java虚拟机在执行Java程序中会把它所管理的内存划分为若干个数据区域,这些区域有各自的用途,以及生命周期,有些依赖虚拟机进程启动而存在,有些依赖用户线程的启动和结束而建立和销毁

运行时内存

程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
由于Java虚拟机的多线程是通过线程调度(轮询)切换分配处理器执行时间的方式来实现的,在任何一个确定的时刻都只会执行一条线程中的指令。所以为了当线程切换后能找到之前执行指令的位置,每个线程都需要有一个独立的程序计数器,各个线程之间的程序计数器互相不影响,这类内存区域为“线程私有”的内存区域。

Java虚拟机栈(Java Virtual Machine Stack)

Java虚拟机栈和程序计数器一样,Java虚拟机栈(以下简称栈)也是“线程私有”的,它的生命周期和线程相同,每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表(方法中定义的变量),操作数栈,动态链接,方法出口等信息。每个方法从调用直至执行完成的过程,就是对应着一个栈帧在栈中入栈和出栈的过程。

本地方法栈

本地方法栈和Java虚拟机栈一样,本地方法栈用于执行Native方法

Java堆(Java Heap)

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时被创建。此内存区域的唯一目的就是存放对象的实例,几乎所有的对象实例都在这里分配内存,Java堆是垃圾收集器管理的主要区域,由于现在很多收集器都采用分代收集算法,所有Java堆还可以细分为:新生代和老年代。可以通过-Xmx和-Xms来控制堆内存的大小

方法区

方法区和Java堆一样,也是各个线程共享的内存区域,它用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。一般也称作为“永代区”(Permanent Generation),这里要特别说明一下,因为我们使用的主流虚拟机HotSpot的设计团队用“永代区”来实现方法区,这样HotSpot的垃圾收集器就可以像管理堆那样管理这部分内存,在JDK1.7的HotSpot中,已经把字符串常量池移出“永代区”了。

直接内存(Direct Memory)

直接内存并不是虚拟机运行时数据区的一部分,但是如果你使用了NIO的类,就会导致OutOfMemoryError异常出现
NIO引入了一种基于通道(Channle)与缓冲区(Buffer)的I/O方法,它可以使用Native函数库直接分配堆外的内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能避免在Java堆和Native堆中来回复制数据的开销,本机直接内存的分配不会受到Java堆大小的限制,但是会受到物理内存的限制,所有也会抛出OutOfMemoryError异常。

小结

“程序计数器”和“Java虚拟机栈”是线程私有的,而“Java堆”和“方法区”是线程共享的

除了虚拟机运行时内存,在Java中使用NIO类可以直接操作本机内存。

方法区在HotSpot中用于存放各种“常量信息”

Java堆中存放了程序中所有的对象实例

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64731.html

相关文章

  • 深入理解虚拟Java内存区域

    摘要:运行时数据区域虚拟机在执行程序的过程中会把它管理的内存划分成若干个不同的数据区域。堆虚拟机所管理的内存中最大的一块,堆是所有线程共享的一块内存区域,在虚拟机启动时创建。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记 1 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/...

    dance 评论0 收藏0
  • 深入理解虚拟Java内存区域

    摘要:深入理解虚拟机高级特性与最佳实践第二版读书笔记与常见面试题总结本节常见面试题介绍下内存区域运行时数据区。运行时数据区域虚拟机在执行程序的过程中会把它管理的内存划分成若干个不同的数据区域。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记与常见面试题总结 本节常见面试题: 介绍下Java内存区域(运行时数据区)。 对象的访问定位的两种方式。 1 概述 对于Java...

    lavnFan 评论0 收藏0
  • JVM详解1.Java内存模型

    摘要:编译参见深入理解虚拟机节走进之一自己编译源码内存模型运行时数据区域根据虚拟机规范的规定,的内存包括以下几个运运行时数据区域程序计数器程序计数器是一块较小的内存空间,他可以看作是当前线程所执行的字节码的行号指示器。 点击进入我的博客 1.1 基础知识 1.1.1 一些基本概念 JDK(Java Development Kit):Java语言、Java虚拟机、Java API类库JRE(...

    TANKING 评论0 收藏0
  • Java开发

    摘要:大多数待遇丰厚的开发职位都要求开发者精通多线程技术并且有丰富的程序开发调试优化经验,所以线程相关的问题在面试中经常会被提到。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 JVM 内存溢出实例 - 实战 JVM(二) 介绍 JVM 内存溢出产生情况分析 Java - 注解详解 详细介绍 Java 注解的使用,有利于学习编译时注解 Java 程序员快速上手 Kot...

    LuDongWei 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<