来源:https://my.oschina.net/u/566829/blog/62249
java虚拟机所管理的内存包括以下几个运行时数据区域:
方法区(Method Area):线程共享的,存放已被虚拟机记载的类信息、常量、静态变量等数据。“永久代(Permanent Generation)”
虚拟机栈(Virtual Machine Stacks):线程私有,生命周期跟线程相同;java方法执行时创建栈帧存放局部变量表(各种基本数据类型、对象引用等)、操作数栈、动态链接等信息。
本地方法栈(Native Method Stack)
堆(Heap):线程共享的;存放对象实例;垃圾收集器管理的主要区域即GC堆。
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器。Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,所以线程需要一个独立程序计数器。
OutOfMemoryError异常
1、Java堆(heap)溢出
java HeapOOM -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
(将堆的最小值-Xms与最大值-Xmx参数设置为一样可以避免堆自动扩展;-XX:+HeapDumpOnOutOfMemoryError出现内存溢出异常时Dump出当前的内存堆转储快照以分析)
Java堆内存的OOM异常是实际应用中最常见的内存溢出溢出情况。异常信息:java.lang.OutOfMemoryError: Java heap space
解决简答思路:
内存映像分析工具---内存泄漏(Memory Leak)or内存溢出(Memory Overflow)---
if it is Memory Leak(泄漏对象到GC Roots的引用链),找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收
else Memory Overflow
(内存对象还存活,检查虚拟机的堆参数-Xmx与-Xms,与机器物理内存对比是否可以调大)
2.虚拟机栈(VM stack)和本地方法栈(Native Method stack)溢出
-Xoss参数(设置本地方法栈大小) -Xss参数(设置栈容量) HotSpot虚拟机中并不区分本地方法栈和虚拟机栈
异常:
栈深度(线程请求的)>虚拟机所允许的最大深度 : StackOverflowError
虚拟机在扩展栈时无法申请到足够的内存空间 : OutOfMemoryError
当栈空间无法继续分配时,本质上只是对同一件事情的两种描述
java JavaVMStackSOF -Xss128k
在单个线程下,无论是那种异常,都抛出下面异常:
异常信息:java.lang.StackOverflowError
在多线程下,OOM异常与栈空间是否足够大无关,而是每个线程分配内存越大,反而容易常生OOM异常(OS分配内存给线程有限,分配到大栈容量越大,建立线程越小,建立
线程的时候越容易将剩下的内存耗尽)。开发多线程应用时建立过多多线程导致OOM异常,在不能减少线程数或更换64位虚拟机的情况下,减少最大堆和减少栈容量来换取更多线程。
3、运行时常量池(Runtime constant Pool)溢出
常量池分配在方法区(method Area)内, -XX:PermSize和-XX:MaxPermSize控制方法区大小,间接控制常量池。
java RuntimeConstantPoolOOM -XX:PermSize=10M -XX:MaxPermSize=10M
异常信息:java.lang.OutOfMemoryError: PermGen space
4、方法区溢出
方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等
异常信息:java.lang.OutOfMemoryError: PermGen space
5、本机直接内存溢出
通过-XX:MaxDirectMemorySize制定,如果不指定,则默认与Java堆最大值-Xms一样
相关推荐
这份文档不仅对Java虚拟机的基本原理进行了详尽的描述,还定义了Java虚拟机的运行时环境、内存布局、类文件结构等关键要素。这对于理解Java程序是如何被执行的非常重要。 #### 版本信息 该文档的原文版本发布于...
java虚拟机运行数据区如图所示。 1、程序计数器 是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。如果线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;...
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...
- **Java虚拟机栈**:每个线程都有自己的栈,用于存储局部变量表、操作数栈、动态链接信息以及方法出口信息等。 - **堆**:所有线程共享的内存区域,用于存放对象实例和数组。 - **方法区**:与堆一样,也是各线程...
总之,Java虚拟机是Java平台的核心,它的深入研究对于Java开发者来说极其重要,可以帮助他们更好地理解代码的运行机制,提升程序性能,以及解决运行时可能出现的问题。通过阅读如《Java虚拟机规范》这样的专业书籍,...
- **异常处理**:提供了一套机制来处理运行时可能出现的各种异常情况。 - **垃圾收集**:自动管理和释放不再使用的对象所占用的内存,避免内存泄漏。 - **安全性**:通过沙箱模型等技术确保代码安全执行。 ### JVM...
8. **异常处理**:JVM支持异常处理机制,通过异常表来定位和处理运行时出现的异常。 9. **多线程**:JVM提供了内置的多线程支持,每个线程有自己的程序计数器、虚拟机栈和本地方法栈,共享堆和方法区。 10. **字符...
标题《Java虚拟机规范》主要关注点是Java虚拟机(JVM)的设计与工作原理,这包括对Java字节码的理解以及它如何在不同硬件和操作系统平台上实现跨平台的特性。规范中详细介绍了class文件的格式,这是Java源代码编译后...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境,使得Java代码能够在不同的操作系统上无缝运行,实现了“一次编写,到处运行”的理念。本资源包含了Java虚拟机的中文和英文版规范文档...
- **历史背景**: Java虚拟机的历史可追溯至1995年,随着Java语言的诞生而出现。它是一种软件实现的计算机,能够执行Java字节码。 - **基本概念**: JVM被设计为一个中间层,位于硬件系统和操作系统之上,使得Java程序...
Java虚拟机在运行时会根据需要分配不同类型的内存区域,这些区域对于确保程序的正常运行至关重要。 1. **程序计数器(Program Counter Register)**: - **线程私有**:每个线程都有独立的程序计数器。 - **功能**...
在Java开发过程中,Java虚拟机(JVM)的性能调优是提高应用程序运行效率的关键环节之一。通过合理的JVM参数配置,可以有效地管理内存分配、垃圾回收等关键资源,从而提升程序的稳定性和响应速度。本文将围绕"java...
为避免这种问题,可以通过设置JVM参数如`-Xms`和`-Xmx`来限制堆内存的最小和最大值,并通过`-XX:+HeapDumpOnOutOfMemoryError`在出现内存溢出时生成堆内存快照,便于分析。 堆内存快照可以帮助我们分析内存占用情况...
通过以上策略的组合应用,我们可以有效管理和解决Java虚拟机在处理大规模数据时可能出现的内存问题。然而,优化过程需要综合考虑应用的特性和资源限制,可能需要多次试验和调整才能找到最佳的解决方案。
2. **Java堆**:Java堆是Java虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的是存放对象实例,几乎所有对象实例都在这里分配内存。 3. **执行引擎**:...
Java虚拟机(JVM,Java Virtual Machine)是Java语言的核心组成部分,它负责解析并执行Java程序。在深入了解JVM之前,我们需要理解其基本结构和工作原理。以下是对JVM的详细解析: 1. **JVM启动与进程生命周期** ...