热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JVM开篇Java内存区域与内存溢出异常

Java虚拟机在运行时会将内存划分为若干区域,我们经常会说堆、栈,栈中存放的是基础类型和对象引用地址,堆中存放的是对象。那么实际上JVM运行时到底将内存划分了多少区域,这些区域都会存储什么数据以及如何进行回收?

JVM开篇---Java内存区域与内存溢出异常

如上图所示,JVM将内存划分为五个区域。

程序计数器:是线程隔离的一块较小的内存区域,因为java多线程是并发的,即轮轮流的切换线程并且分配处理器来执行的一种方式,所以每个线程都需要记录自己所执行的位置,所以在程序计数器内为每个线程都要保存一份独立的计数。程序计数器可以理解为程序执行到的字节码位置,一般来讲程序的执行就是改变这个计数值。如果当前执行的是Native方法,则这个计数器值为空(undefined)。该内存区域是唯一一块没有规定任何OutOfMemoryError的区域。

Java虚拟机栈:也是线程隔离的一块内存区域,与线程的生命周期相同。它描述了java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等。每一个方法的调用到执行完成,对应着栈的入栈与出栈操作。我们一开始说的存放基础类型和对象引用地址的栈就是指的虚拟机栈中的局部变量表。局部变量表里就存放了boolean、byte、int、long、float、double、对象的引用和returnAddress类型,其中long和double占用两个局部变量空间,其余都占用一个。局部变量表在编译器就已经确定大小,并分配内存空间,在运行过程中是不会改变的。returnAddress没有看太明白。这个区域有两种异常:一个是请求的栈深度超过了虚拟机所允许的深度,会报出***Error;一个是如果虚拟机可以动态扩展虚拟机栈,当无法申请更多内存时,会报OutOfMemoryError。

本地方法栈:与java虚拟机栈的区别就是,本地方法栈执行本地方法使用。

java堆:堆是被所有线程共享的一块最大的内存,所有的对象实例和数组都在堆上分配内存。此话现在不绝对,后续会说到。为了更快地进行垃圾回收,一般现在会将堆分代,新生代和老年代,又可以细化为eden区、from区、to区、老年代。

方法区:线程共享的内存,存储已经加载的类的信息、常量、静态变量、即时编译器编译后的代码等。运行时常量是方法区的一部分,就是我们所说的string所存放的地方。在之前的hotspot虚拟机上,方法区也可以叫做永久代,我们经常会遇到java.lang.OutOfMemoryError: PermGen space 这个就代表方法区溢出。因为将运行时常量、类信息存放在方法区,会经常导致内存溢出,并且永久代是hotspot独有的概念,所以从jdk1.7开始就逐渐的取消了永久代的概念。到jdk1.8已经完全取消,类信息、stirng和静态变量都将会被移到堆和本地内存中。永久代由MetaSpace所取代,保存到本地内存中,MetaSpace思想就是类和他的元数据的生命周期和他的类加载器的生命周期一致,每个类加载器的存储区都叫做一个元空间,所有的元空间组合到一起。我们再大量的创建string对象导致内存溢出,不会再是PermGen space了,而是变成了heap space溢出,因为stirng常量池已经移到了堆中。要想使MetaSpace溢出,需要创建新的类,导致其溢出。

新的设置MetaSpace的参数有:

-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
  -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
  除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:
  -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
  -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

以上就是JVM的基本运行时内存分配情况


推荐阅读
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 深入浅析JVM垃圾回收机制与收集器概述
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》的阅读心得进行整理,详细探讨了JVM的垃圾回收机制及其各类收集器的特点与应用场景。通过分析不同垃圾收集器的工作原理和性能表现,帮助读者深入了解JVM内存管理的核心技术,为优化Java应用程序提供实用指导。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • C++ 进阶:类的内存布局与虚函数类的实现细节
    C++ 进阶:类的内存布局与虚函数类的实现细节 ... [详细]
author-avatar
仇顺嵐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有