`

JVM内存模型

 
阅读更多

内容摘自周志明〈深入理解Java虚拟机〉第一版

Java虚拟机管理的内存包括:

  1. 程序计数器: 每个线程都需要独立的程序计数器,各线程之间不相互影响,此区域是虚拟机中唯一不会出现OutOfMemoryError的区域
  2. 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)
     
  3. 本地方法栈:与虚拟机栈类似,为虚拟机使用到的native方法服务.
  4. 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)
     
  5. 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内存模型深度剖析与优化.pdf

    JVM内存模型深度剖析与优化 JVM内存模型是Java虚拟机的核心组件之一,它直接影响着Java应用程序的性能和可靠性。本文将深入剖析JVM内存模型的结构和工作机理,并讨论如何优化JVM参数以提高Java应用程序的性能。 一...

    jvm内存模型.pdf

    jvm内存模型.pdf

    JVM内存模型详解

    jvm内存模型,jvm脑图,jvm调优,jvm垃圾回收算法,jvm垃圾回收器,逃逸算法等总结。

    三问JMM--有关JVM内存模型的PPT

    ### 三问JMM——有关JVM内存模型的深度解析 #### 前言 近期,在诚信通开源研究小组的专题学习分享会上,我们针对Java内存模型(JMM)进行了深入探讨,现将JMM相关的一些核心概念进行梳理,以便更好地理解和把握JMM的...

    JVM内存模型以及垃圾回收相关资料

    JVM内存模型与垃圾回收是Java性能优化的关键部分。JVM(Java Virtual Machine)内存模型分为多个区域,包括新生代(New Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新生代又细分为...

    深入详解JVM内存模型与JVM参数详细配置.pdf

    "深入详解JVM内存模型与JVM参数详细配置" 本资源详细介绍了JVM内存模型的结构和组成部分,包括堆内存、方法区、栈内存、程序计数器等。同时,还详细介绍了JVM参数的配置和调整方法,以提高JVM的性能和效率。 ...

    JVM内存模型及分区 JVM内存模型及分区

    理解JVM内存模型对于优化Java程序性能至关重要,合理分配和管理内存能有效避免内存泄漏和性能瓶颈。例如,通过调整堆大小、设置合理的垃圾回收策略,可以优化应用的运行效率。此外,了解这些内存区域的工作原理也能...

    Java 虚拟机JVM内存模型

    ### Java 虚拟机JVM内存模型知识点 #### 1. JVM概述 ##### 1.1 Java的特性与JVM的应用 Java语言的特性包括跨平台性、面向对象、安全性等。JVM是Java程序能够跨平台运行的关键,它负责将Java源代码转换成与平台无关...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...

    java jvm内存模型

    "Java JVM内存模型" Java虚拟机(JVM)内存模型是Java虚拟机的核心组件之一,它定义了Java程序在运行时的内存布局和管理方式。JVM内存模型主要分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。 1. ...

    JVM内存模型和性能优化.docx

    JVM内存模型内置了基于内存的并发模型,支持多线程机制,提供了同步锁(Synchronization)功能,使得在多线程环境下能够确保数据一致性。此外,JVM还提供了大量的线程安全的库包,这些特性使得开发者可以灵活控制...

    02-VIP-JVM内存模型深度剖析(1)1

    总结来说,理解JVM内存模型和参数设置对于优化Java应用程序性能至关重要。正确配置JVM参数可以防止内存溢出,降低垃圾回收频率,提升系统响应速度。同时,逃逸分析等优化技术也是提高程序执行效率的有效手段。在实际...

    jvm内存模型.doc

    jvm内存模型

    JVM内存模型(通俗易懂)

    JVM内存模型则是理解Java程序性能优化的关键,因为它规定了程序中的数据如何在内存中分配和访问。本文将深入浅出地探讨JVM内存模型,帮助你快速掌握这一核心概念。 首先,我们要知道JVM内存模型主要分为以下几个...

    JVM内存模型以及垃圾收集策略解析

    面向对象不仅提高了代码的维护性、复用性和扩展性,还充分利用了JVM内存模型的特性。 至于Java垃圾收集器,它是自动管理内存的关键,减少了手动内存管理可能导致的错误,如C++中的内存泄漏。Java的垃圾收集策略始于...

Global site tag (gtag.js) - Google Analytics