JVM的内存机制介绍.doc

JVM的内存机制介绍.doc

ID:62033680

大小:363.50 KB

页数:11页

时间:2021-04-15

JVM的内存机制介绍.doc_第1页
JVM的内存机制介绍.doc_第2页
JVM的内存机制介绍.doc_第3页
JVM的内存机制介绍.doc_第4页
JVM的内存机制介绍.doc_第5页
资源描述:

《JVM的内存机制介绍.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、本文分为两个部分:ﻫ1,JVMspecifications(JVM规范) 对JVM内存的描述2,Sun的JVM的内存机制。ﻫJVM specification对JVM内存的描述首先我们来了解JVMspecification中的JVM整体架构。如下图:     主要包括两个子系统和两个组件:Classloader(类装载器)子系统,Executionengine(执行引擎) 子系统;Runtimedataarea (运行时数据区域)组件, Nativeinterface(本地接口)组件.    Classloader子系统的作用:根据给定的全限

2、定名类名(如java.lang.Object)来装载class文件的内容到Runtimedata area中的methodarea(方法区域)。Javsa程序员可以extends java.lang。ClassLoader类来写自己的Classloader。     Executionengine子系统的作用 :执行classes中的指令。任何JVMspecification实现(JDK)的核心是Execution engine,换句话说:Sun的JDK和IBM的JDK好坏主要取决于他们各自实现的Execution engine的好坏。每个运

3、行中的线程都有一个Executionengine的实例。 ﻫ     Nativeinterface组件:与nativelibraries交互,是其它编程语言交互的接口。 ﻫ     Runtimedataarea 组件:这个组件就是JVM中的内存。 下面对这个部分进行详细介绍。Runtime data area的整体架构图本文为互联网收集,请勿用作商业用途Runtimedataarea主要包括五个部分:Heap(堆),Method Area(方法区域),Java Stack(java的栈),Program Counter(程序计数器), N

4、ative methodstack(本地方法栈)。Heap和MethodArea是被所有线程的共享使用的;而Java stack,Programcounter和Nativemethodstack是以线程为粒度的,每个线程独自拥有。ﻫHeap Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据

5、)的同步问题。(这里可能出现的异常java.lang.OutOfMemoryError:Javaheapspace)ﻫMethodarea在Java虚拟机中,被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中.紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区.该类型中的类(静态)变量同样也存储在方法区中。与Heap一样,method area是多线程共享的,因此要考虑多线程访问的同步问题.比如,假设同时两个线程都

6、企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。(这里可能出现的异常java.lang.OutOfMemoryError:PermGenfull)ﻫJavastackﻫ      Javastack以帧为单位保存线程的运行状态.虚拟机只会直接对Java stack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到javastack中(压栈);当一个方法调用返回时,从javastack弹出一个帧(出栈).栈的大小是有一定的限制,这

7、个可能出现StackOverFlow问题。 下面的程序可以说明这个问题。本文为互联网收集,请勿用作商业用途publicclass TestStackOverFlow {ﻩpublicstatic voidmain(String[]args) {ﻩRecursiver=newRecursive();ﻩr.doit(10000);ﻩﻩ//Exceptioninthread”main”java.lang.StackOverflowError}}classRecursive{ﻩpublicint doit(intt){ﻩif (t<=1) {ﻩﻩre

8、turn1;ﻩﻩ}ﻩreturn t +doit(t — 1);ﻩ}} ﻫProgramcounter 每个运行中的Java程序,每一个线程都有它自己的PC寄存器,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。