模型
JVM运行时数据区域
JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途、创建和销毁时间。根据《Java虚拟机规范(第二版)》(下文称VM Spec)的规定,JVM包括下列几个运行时数据区域:
1.程序计数器(Program Counter Register):
每一个Java线程都有一个程序计数器来用于保存程序执行到当前方法的哪一个指令,对于非Native方法,这个区域记录的是正在执行的VM原语的地址,如果正在执行的是Natvie方法,这个区域则为空(undefined)。此内存区域是唯一一个在VM Spec中没有规定任何OutOfMemoryError情况的区域。
2.Java虚拟机栈(Java Virtual Machine Stacks)
与程序计数器一样,VM栈的生命周期也是与线程相同。VM栈描述的是Java方法调用的内存模型:每个方法被执行的时候,都会同时创建一个帧(Frame)用于存储本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。
经常有人把Java内存简单的区分为堆内存(Heap)和栈内存(Stack),实际中的区域远比这种观点复杂,这样划分只是说明与变量定义密切相关的内存区域是这两块。其中所指的“堆”后面会专门描述,而所指的“栈”就是VM栈中各个帧的本地变量表部分。本地变量表存放了编译期可知的各种标量类型(boolean、byte、char、short、int、float、long、double)、对象引用(不是对象本身,仅仅是一个引用指针)、方法返回地址等。其中long和double会占用2个本地变量空间(32bit),其余占用1个。本地变量表在进入方法时进行分配,
当进入一个方法时,这个方法需要在帧中分配多大的本地变量是一件完全确定的事情,在方法运行期间不改变本地变量表的大小。
在VM Spec中对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果VM栈可以动态扩展(VM Spec中允许固定长度的VM栈),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。
3.本地方法栈(Native Method Stacks)
本地方法栈与VM栈所发挥作用是类似的,只不过VM栈为虚拟机运行VM原语服务,而本地方法栈是为虚拟机使用到的Native方法服务。它的实现的语言、方式与结构并没有强制规定,甚至有的虚拟机(譬如Sun Hotspot虚拟机)直接就把本地方法栈和VM栈合二为一。和VM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。
4.Java堆(Java Heap)
对于绝大多数应用来说,Java堆是虚拟机管理最大的一块内存。Java堆是被所有线程共享的,在虚拟机启动时创建。Java堆的唯一目的就是存放对象实例,绝大部分的对象实例都在这里分配。
Java堆内还有更细致的划分:新生代、老年代,再细致一点的:eden、from survivor、to survivor,甚至更细粒度的本地线程分配缓冲(TLAB)等,无论对Java堆如何划分,目的都是为了更好的回收内存,或者更快的分配内存。
根据VM Spec的要求,Java堆可以处于物理上不连续的内存空间,它逻辑上是连续的即可,就像我们的磁盘空间一样。实现时可以选择实现成固定大小的,也可以是可扩展的,不过当前所有商业的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。如果在堆中无法分配内存,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
5.方法区(Method Area)
叫“方法区”可能认识它的人还不太多,如果叫永久代(Permanent Generation)它的粉丝也许就多了。它还有个别名叫做Non-Heap(非堆)。
方法区中存放了每个Class的结构信息,包括常量池、字段描述、方法描述等等。VM Space描述中对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存,也可以选择固定大小或者可扩展外,甚至可以选择不实现垃圾收集。相对来说,垃圾收集行为在这个区域是相对比较少发生的,但并不是某些描述那样永久代不会发生GC(至少对当前主流的商业JVM实现来说是如此),这里的GC主要是对常量池的回收和对类的卸载,虽然回收的“成绩”一般也比较差强人意,尤其是类卸载,条件相当苛刻。
6.运行时常量池(Runtime Constant Pool)
Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量表(constant_pool table),用于存放编译期已可知的常量,这部分内容将在类加载后进入方法区(永久代)存放。但是Java语言并不要求常量一定只有编译期预置入Class的常量表的内容才能进入方法区常量池,运行期间也可将新内容放入常量池(最典型的String.intern()方法)。
运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法在申请到内存时会抛出OutOfMemoryError异常。
7.本机直接内存(Direct Memory)
直接内存并不是虚拟机运行时数据区的一部分,它根本就是本机内存而不是VM直接管理的区域。但是这部分内存也会导致OutOfMemoryError异常出现。
在JDK1.4中新加入了NIO类,引入一种基于渠道与缓冲区的I/O方式,它可以通过本机Native函数库直接分配本机内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java对和本机堆中来回复制数据。
显然本机直接内存的分配不会受到Java堆大小的限制,但是即然是内存那肯定还是要受到本机物理内存(包括SWAP区或者Windows虚拟内存)的限制的,一般服务器管理员配置JVM参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),而导致动态扩展时出现OutOfMemoryError异常。
源博客地址
http://yuntai.1kapp.com/?p=528
分享到:
相关推荐
本篇文章将深入探讨如何对Tomcat和JDK进行优化配置,以提高应用性能。 首先,我们来讨论Tomcat的优化。`catalina.sh`是Tomcat的启动脚本,它包含了启动、停止和运行Tomcat的各种选项。以下是一些关键的优化策略: ...
### JDK安装及配置心得 #### 一、前言 在进行Java开发时,正确地安装与配置JDK(Java Development Kit)是至关重要的第一步。本文将详细介绍如何在Windows环境下完成JDK的安装与配置,并分享一些实用的经验技巧,...
在Linux环境下配置Tomcat和JDK,不仅能够提高系统的稳定性和安全性,还能更好地利用Linux系统的资源管理优势。 #### 二、准备工作 在正式安装配置之前,确保已经安装了Linux操作系统,并且熟悉基本的Linux命令操作...
在本文档中,我们将详细介绍如何在CentOS系统上安装和配置JDK和Tomcat环境。以下是整个安装和配置过程的步骤。 一、下载所需文件 在开始安装之前,需要下载两个必要的文件:jdk-7u25-linux-x64.rpm和apache-tomcat...
### JDK最新版本下载及JDK安装与配置 #### 一、引言 在软件开发领域,选择合适的开发工具是至关重要的第一步。...无论是初学者还是资深开发者,都应该时刻关注JDK的更新,以利用最新的特性和优化提升自己的开发能力。
2. **JDK更新**:Oracle提供了Java Update工具,方便用户检查并安装JDK的更新版本,确保系统安全性和性能优化。 以上就是JDK的安装配置过程,以及一些基本的使用和配置知识。在实际开发中,理解这些步骤有助于更好...
而JDK 14则是一个较新的版本,包含了更多的新特性,主要用作测试和开发环境,以探索和利用最新的Java语言特性和优化。 JDK 11的主要特性包括: 1. HTTP客户端API(JSR 353) 2. 嵌入式本地应用客户端(JEP 320) 3....
总结来说,JDK 1.8作为Java的一个里程碑版本,带来了许多创新特性和性能提升,而一键安装的版本更是为开发者提供了便利,尤其是对于初学者,免去手动配置环境变量的繁琐步骤,让他们能更快地投入到Java编程的学习和...
配置完成后,可以通过在命令行输入`java -version`和`javac -version`来验证JDK是否成功安装并配置。 总结来说,JDK1.8不仅带来了诸多新特性和优化,也简化了开发流程,提升了开发效率。正确配置JDK1.8环境变量是...
配置Android开发环境主要涉及安装Android Studio和配置Java开发工具包(JDK)。 在配置Android环境之前,需要确保你的计算机满足最低硬件和软件要求,以便能顺畅地运行Android Studio和模拟器。然后按照以下步骤...
在IT领域,特别是Java开发环境中,正确理解和配置JDK(Java Development Kit)是至关重要的一步。JDK作为Java编程的基础工具包,包含了编译、运行和调试Java应用程序所需的所有工具和库。对于开发者而言,深入掌握...
4. **JDK优化**:根据应用需求,调整JDK的默认配置,例如通过`-server`选项启动JVM以获得更好的性能。 ### 五、Java相关配置文件 在JDK安装目录下,有一些重要的配置文件: 1. **javaws.exe.config**:Java Web ...
#### 五、安装和配置 JDK1.8 安装并配置 JDK1.8 是确保 WAS 正常运行的关键步骤之一: 1. **解压 JDK1.8 压缩包**:使用 unzip 命令解压下载的 JDK 1.8 压缩包。 2. **使用 IMM 安装 JDK1.8**: - 使用 IMM 选择 ...
- **CATALINA_HOME**:Tomcat的主目录,方便后续配置和其他应用调用。 ##### 3. 测试Tomcat - 打开浏览器,访问`http://localhost:8080/`查看Tomcat是否正常启动。 #### 三、配置JBoss ##### 1. 安装JBoss - **...
根据提供的文件标题、描述、标签以及部分内容,我们可以深入探讨与“JDK 1.7与环境配置”相关的重要知识点。...通过对JDK 1.7的新特性和环境配置的详细介绍,希望能够帮助读者更好地理解和掌握这一版本的关键知识点。
除了基本的环境变量外,还可以进行一些高级配置来优化 Java 应用的性能和开发体验。 - **配置 JAVA_OPTS**:通过设置 JAVA_OPTS 环境变量,可以在启动 Java 应用时传递参数,例如设置 JVM 内存大小。 - **调整 JVM ...
根据提供的标题“jdk环境变量配置”以及描述“jdk环境配置详解”,本文将详细介绍如何进行JDK(Java Development Kit)环境变量的配置...同时,了解这些配置的具体含义和作用,也有助于更好地管理和优化你的开发环境。
本文档将详细介绍JDK和WebLogic的安装配置步骤,并提供每一步的图片说明。 1. 用户组及用户的创建 在安装JDK和WebLogic之前,需要创建一个专门的用户组和用户。这里我们将创建一个名为“weblogic”的用户组和用户...
Java Development Kit(JDK)是开发和运行Java...使用这些JDK版本时,确保按照官方或社区的最佳实践进行安装和配置,以获得最佳性能和稳定性。同时,持续关注Oracle的更新和公告,以便及时了解新版本的发布和已知问题。
这个版本引入了许多新的特性和优化,使得开发者能够更高效地编写和运行Java应用程序。在本文中,我们将深入探讨JDK1.8的安装过程以及如何配置环境变量,同时还会解决"Javac无效"的问题。 **一、JDK1.8的下载** ...