本文转自51CTO:http://developer.51cto.com/art/201002/184385.htm。
一直以来想搞清楚java虚拟机的内部机制,可惜都没有找到系统的资料来学习,对这块知识的认识也是很模糊,偶然看到51CTO上篇文章,惊喜,果断分享。
垃圾收集器策略从20世纪60年代就已经流行起来了,相比于其他编程语言,Java语言是目前使用最多的依赖于垃圾收集器的语言。
JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Java中的JVM内存模型及垃圾收集的具体策略进行综合的分析。
一 JVM内存模型
1.1 Java栈
Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放。StackOverflowError:如果在线程执行的过程中,栈空间不够用,那么JVM就会抛出此异常,这种情况一般是死递归造成的。
1.2 堆
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等。
1.2.1 Generation
JVM堆一般又可以分为以下三部分:
◆ Perm
Perm代主要保存class,method,filed对象,这部门的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。
◆ Tenured
Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间。
◆ Young
Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,其中Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Young区间变满的时候,minor GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。
1.2.2 Sizing the Generations
JVM提供了相应的参数来对内存大小进行配置。正如上面描述,JVM中堆被分为了3个大的区间,同时JVM也提供了一些选项对Young,Tenured的大小进行控制。
◆ Total Heap
-Xms :指定了JVM初始启动以后初始化内存
-Xmx:指定JVM堆得最大内存,在JVM启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全部使用,JVM会根据-Xms参数来调节真正用于JVM的内存
-Xmx -Xms之差就是三个Virtual空间的大小
◆ Young Generation
-XX:NewRatio=8意味着tenured 和 young的比值8:1,这样eden+2*survivor=1/9
堆内存
-XX:SurvivorRatio=32意味着eden和一个survivor的比值是32:1,这样一个Survivor就占Young区的1/34.
-Xmn 参数设置了年轻代的大小
◆ Perm Generation
-XX:PermSize=16M -XX:MaxPermSize=64M
Thread Stack
-XX:Xss=128K
1.3 堆栈分离的好处
呵呵,其它的先不说了,就来说说面向对象的设计吧,当然除了面向对象的设计带来的维护性,复用性和扩展性方面的好处外,我们看看面向对象如何巧妙的利用了堆栈分离。如果从JAVA内存模型的角度去理解面向对象的设计,我们就会发现对象它完美的表示了堆和栈,对象的数据放在堆中,而我们编写的那些方法一般都是运行在栈中,因此面向对象的设计是一种非常完美的设计方式,它完美的统一了数据存储和运行。
分享到:
相关推荐
**JVM内存模型及垃圾收集策略解析** Java虚拟机(JVM)是Java程序运行的基础,它为Java程序提供了一个跨平台的运行环境。在深入理解JVM内存模型与垃圾收集策略之前,我们首先需要知道JVM的主要组成部分:类装载器、...
总的来说,理解和掌握JVM内存模型及垃圾收集策略对于优化Java应用程序的性能至关重要。开发者需要根据应用特点调整内存参数,选择合适的垃圾收集策略,以避免内存溢出、提高系统效率并确保程序的稳定运行。
Java虚拟机(JVM)内存模型...理解JVM内存模型和垃圾回收机制对于优化Java应用性能、避免内存泄漏和有效利用资源至关重要。开发者应根据实际需求选择合适的垃圾回收器,并关注内存分配策略,以实现高效稳定的程序运行。
### JVM内存模型详解 #### 一、概述 Java虚拟机(JVM)是Java程序运行的基础环境,它提供了一套完整的内存管理和执行机制。本文旨在深入探讨JVM内存模型的关键组成部分及其工作原理。 #### 二、类加载器...
JVM内存模型则是理解Java程序性能优化的关键,因为它规定了程序中的数据如何在内存中分配和访问。本文将深入浅出地探讨JVM内存模型,帮助你快速掌握这一核心概念。 首先,我们要知道JVM内存模型主要分为以下几个...
3. **JVM内存模型**: JVM内存主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。重点理解对象创建、内存分配以及栈帧的工作方式...
Java JVM(Java虚拟机)内存分配与调优是Java...通过理解JVM内存模型,选择合适的垃圾收集器和设置合理的内存参数,可以有效提升Java应用的性能和稳定性。在实践中,不断学习和试验,才能找到最适合应用的内存配置。
1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。每个区域都有特定的用途: - **方法区**:存储...
了解JVM内存模型后,我们来看看JVM的工作原理。当Java程序启动时,JVM会进行加载、验证、准备、解析和初始化五个阶段: 1. **加载**:JVM找到并读取.class文件,将其转换为内部数据结构。 2. **验证**:确保字节码...
2. JVM内存模型 - JVM规范定义了不同的内存区域,包括程序计数器、Java虚拟机栈、本地方法栈、堆和方法区(在Java 8之后变为元空间)。 - Java虚拟机栈:每个线程都有一个独立的栈,用于存储方法调用的状态,包括...
总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1 GC的深入见解,有助于Java开发者更好地理解和控制JVM的内存管理,提升应用程序的稳定性和效率。通过学习这些知识,开发者可以解决实际开发中...
2. JVM内存模型:JVM内存分为五个区域:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。程序计数器记录当前线程执行的字节码指令地址;虚拟机栈和本地方法栈分别服务于Java方法和本地(Native)方法;Java堆是...
### JVM内存模型详解 #### 1. 方法区 方法区主要存储类的信息、常量、静态变量等数据。这些数据通常在类加载时创建,并且在整个JVM生命周期中保持不变。对于HotSpot虚拟机而言,这部分区域被称为“永久代”(Perm...
《JVM内存模型深度探索——基于JDK源码解析》 在Java开发中,深入理解JVM(Java Virtual Machine)内存模型是至关重要的。本文将从JDK源码的角度出发,详细探讨JVM的内存结构、类加载机制以及对象创建与内存分配...
2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...
二、JVM内存模型 1. 堆(Heap):所有对象都在堆中分配内存,是线程共享的区域,分为新生代和老年代。 2. 新生代(Young Generation):新生代进一步划分为Eden区和两个Survivor区(From空间和To空间)。大部分对象...
【JDK 1.8 的 JVM 内存模型】 JVM(Java Virtual ...了解JVM内存模型和垃圾收集算法是Java开发者的基本功,对于实习生来说,掌握这些知识不仅能帮助应对面试,也能在实际开发中更好地理解和优化程序的内存使用。
JVM还提供了如CMS和G1等更复杂的垃圾收集器,CMS适用于响应时间敏感的应用,G1则试图平衡吞吐量和响应时间,两者都采用并发收集。 面试中常见的问题包括GC收集器的对比,如CMS收集器在内存不足时可能导致Full GC,...
本文将深入探讨JVM的核心原理、内存结构、优化策略以及垃圾回收机制。 首先,JVM的内存结构是理解其工作方式的关键。在JVM中,内存主要分为五个区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8之后...
Java内存模型,也称为JVM内存结构,主要包括堆内存、栈内存、方法区、程序计数器和本地方法栈五个部分。理解这些区域的工作原理对于进行性能调优至关重要。 - **堆内存**:存储所有类实例和数组,是所有线程共享...