模型
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
分享到:
相关推荐
NULL 博文链接:https://576512181-qq-com.iteye.com/blog/1472422
jdk1.8 已经做过简单优化和配置
一、Weblogic服务程序设置: 1、设置JDK内存: 2、设置线程数: 3、Weblogic数据库连接池连接数设置: 4、Weblogic的服务设置[配置\优化]:
4.3 配置、优化Apache 5 4.3.1 配置web容器信息的文件 5 4.3.2 新建uriworkermap.properties文件 5 4.3.3 JK-connector的安装 5 4.3.4 修改Apache的配置文件 6 4.3.5 配置多路处理模块 6 4.4 配置、优化Tomcat 7 ...
RHEL7.0下的TOMCAT安装、配置及优化 一、安装前准备 3 二、JDK安装 2.1、建立tomcat用户 2.2、将JDK安装文件上传到服务器 2.3、安装JDK 2.4、配置JDK环境变量 2.5、测试是否正确安装 三、Tomcat安装及配置 ...
server 启用jdk 的 server 版; -Xms java虚拟机初始化时的最小内存; -Xmx java虚拟机可使用的最大内存; -XX: PermSize 内存永久保留区域 -XX:MaxPermSize 内存最大永久保留区域 服务器参数配置 现公司...
这使得Linux成为了一种非常适合企业级应用的操作系统,可以根据企业的特定需求进行定制和优化。 安全性:Linux操作系统在安全性方面表现出色,具有强大的访问控制和安全机制。这使得Linux成为了一种非常适合用于...
自己整合的tomcat7,这个是稳定版本,内置jdk,完全免安装,免环境变量配置,相关的性能参数已经优化好,可以直接用于服务器部署
CentOS7服务器环境配置教程包含: 1、Mysql5.6:安装、配置、配置优化 2、jdk1.7:安装及环境变量设置 3、Tomcat7:安装,测试
本文档用来指导在CentOS 7 环境下,如何一步一步安装和配置JDK 1.8\Tomcat 8.5、Nginx2,并完成安全配置。 本文档适用于企业IT 人员操作,经过多次更新和验证,最后可以形成一个企业级的、完整、安全、Tomcat和Nginx...
将多个文件统一分布管理
jdk1.7的安装设置 5.Tomcat7的安装设置、优化、启动 6.安装及设置MySQL5.6 环境检查、安装MySQL、 初始化MySQL及设置密码、允许远程登陆、设置开机自启动、修改uft-8配置文件位置、mysql启动和停止操作、关闭防火墙...
构建项目时,ProGuard将自动应用你的配置和规则,以确保生成的APK文件是混淆和优化过的。 这份ZIP文件旨在帮助你轻松地加强你的应用程序安全性和性能。如果你是一个关心应用程序质量的开发者,这个资源将为你提供所...
1、前端优化:活动开始前生成静态商品页面推送缓存和CDN,静态文件(JS/CSS)请求推送至文件服务器和CDN。 2、网络优化:如果是全国用户,最好是BGP多线机房,减少网络延迟。 3、应用服务优化:Nginx最佳配置、Tomcat...
8. jdk 安装与配置 9. redis 安装与配置 10. 花生壳安装与配置 11. podman 安装与配置 12. nginx 安装与配置 13. Samba服务安装与配置 (nfs-server) 14. 建立交换分区 15. gitlab-runner 安装与配置 16.网卡管理 17....
包括Tomcat内存参数的管理设置、JDK、虚拟目录、连接数相关设置
Java运行环境以流行的JDK1.8、Tomcat8.5、MySQL8.0组合为例,进行入门级讲解软件安装、配置优化等。 Linux下安装Java运行环境及优化(视频课):https://edu.csdn.net/course/detail/20806 本课程提供资料: 1)...
tomcat优化 1、jdk opts 2、nio配置 3、线程池优化 4、jvm优化 5、jsvc启动
Java安装和配置配置JDK环境变量添加内容#Java环境变量#根据需求配置JVM优化参数保存退出。
本书将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。 本书共11章。第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器。...