内容摘自周志明〈深入理解Java虚拟机〉第一版
Java虚拟机管理的内存包括:
- 程序计数器: 每个线程都需要独立的程序计数器,各线程之间不相互影响,此区域是虚拟机中唯一不会出现OutOfMemoryError的区域
-
Java虚拟机栈:也是线程私有。每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法被调用直至执行完成的过程,对应一个栈帧在虚拟机栈中从入栈到出栈的过程.以下例子可以引起StackOverflowError:
public class TestStack { private static int count=0; public static void recursion() throws InterruptedException{ count++; recursion(); } public static void main(String[] arg){ try{ recursion(); }catch(Throwable e){ System.out.println("deep of stack is "+count); e.printStackTrace(); } } }
输出:deep of stack is 9936 java.lang.StackOverflowError at javatuning.ch5.memory.TestStack.recursion(TestStack.java:13)
- 本地方法栈:与虚拟机栈类似,为虚拟机使用到的native方法服务.
-
Java堆:所有线程共有的一块内存区域,所有的对象实例以及数组都要在堆上分配。以下程序可以导致java.lang.OutOfMemoryError: Java heap space:
public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while (true) { list.add(new OOMObject()); } } }
输出:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.util.Arrays.copyOf(Unknown Source) at java.util.ArrayList.grow(Unknown Source) at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) at java.util.ArrayList.ensureCapacityInternal(Unknown Source) at java.util.ArrayList.add(Unknown Source) at com.jingshou.jvm.HeapOOM.main(HeapOOM.java:16)
-
Java方法区:它用于存储类信息,常量,静态变量,即时编译后的代码等数据.它也被称作永久代(Permanent Generation),它包含运行时常量池。运行时向常量池中大量添加内容或者动态产生大量的类都会导致OutOfMemoryError。如下:
public class TestPermMax { public static void main(String args[]) throws CannotCompileException, NotFoundException, InstantiationException, IllegalAccessException{ int i=0; try{ for (i = 1; i <=Integer.MAX_VALUE; i++) { CtClass c = ClassPool.getDefault().makeClass("Geym" + i); c.setSuperclass(ClassPool.getDefault().get("com.jingshou.JavaBeanObject")); Class clz = c.toClass(); JavaBeanObject v=(JavaBeanObject)clz.newInstance(); } }catch(Throwable e){ System.out.println("Create New Classes count is "+i); e.printStackTrace(); } } }
Eclipse下输出并非像书上写的有OutOfMemoryError: PermGen space。而是:Create New Classes count is 99004 Exception in thread "main" Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
最后,直接内存不是虚拟机运行时数据去的一部分,不受Java堆大小的限制.但是它依然有可能会被使用到并且导致OutOfMemoryError,它受到本机总内存的限制.
最后,即使是最简单的程序访问,也会涉及到Java堆,栈,方法区三个最重要的内存区域之间的关联关系
相关推荐
JVM内存模型深度剖析与优化 JVM内存模型是Java虚拟机的核心组件之一,它直接影响着Java应用程序的性能和可靠性。本文将深入剖析JVM内存模型的结构和工作机理,并讨论如何优化JVM参数以提高Java应用程序的性能。 一...
jvm内存模型.pdf
jvm内存模型,jvm脑图,jvm调优,jvm垃圾回收算法,jvm垃圾回收器,逃逸算法等总结。
### 三问JMM——有关JVM内存模型的深度解析 #### 前言 近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的...
JVM内存模型与垃圾回收是Java性能优化的关键部分。JVM(Java Virtual Machine)内存模型分为多个区域,包括新生代(New Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新生代又细分为...
"深入详解JVM内存模型与JVM参数详细配置" 本资源详细介绍了JVM内存模型的结构和组成部分,包括堆内存、方法区、栈内存、程序计数器等。同时,还详细介绍了JVM参数的配置和调整方法,以提高JVM的性能和效率。 ...
理解JVM内存模型对于优化Java程序性能至关重要,合理分配和管理内存能有效避免内存泄漏和性能瓶颈。例如,通过调整堆大小、设置合理的垃圾回收策略,可以优化应用的运行效率。此外,了解这些内存区域的工作原理也能...
### Java 虚拟机JVM内存模型知识点 #### 1. JVM概述 ##### 1.1 Java的特性与JVM的应用 Java语言的特性包括跨平台性、面向对象、安全性等。JVM是Java程序能够跨平台运行的关键,它负责将Java源代码转换成与平台无关...
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...
"Java JVM内存模型" Java虚拟机(JVM)内存模型是Java虚拟机的核心组件之一,它定义了Java程序在运行时的内存布局和管理方式。JVM内存模型主要分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。 1. ...
JVM内存模型内置了基于内存的并发模型,支持多线程机制,提供了同步锁(Synchronization)功能,使得在多线程环境下能够确保数据一致性。此外,JVM还提供了大量的线程安全的库包,这些特性使得开发者可以灵活控制...
jvm--java毕业设计-JVM内存模型和垃圾收集PPT37页--JVM内存模型和垃圾收集
总结来说,理解JVM内存模型和参数设置对于优化Java应用程序性能至关重要。正确配置JVM参数可以防止内存溢出,降低垃圾回收频率,提升系统响应速度。同时,逃逸分析等优化技术也是提高程序执行效率的有效手段。在实际...
jvm内存模型
JVM内存模型则是理解Java程序性能优化的关键,因为它规定了程序中的数据如何在内存中分配和访问。本文将深入浅出地探讨JVM内存模型,帮助你快速掌握这一核心概念。 首先,我们要知道JVM内存模型主要分为以下几个...