您好,欢迎访问三七文档
JVM详解本文详细讲解了JVM(JavaVirtualMachine)的方方面面,首先由java的特性来描绘JVM的大致应用,再细细阐述了JVM的原理及内存管理机制和调优.最后讲述了与JVM密切相关的JavaGC机制.本文内容大多来自网络,但内容十分丰富,是学习JVM的好资料.后面会再针对JVM的两大职责classloader和executionengine进行讲解若有疑问ymkyve501@gmail.com目录Java相关.............................................................................................................................21.1Java定义..............................................................................................................21.2Java的开发流程..................................................................................................21.3Java运行的原理..................................................................................................31.4半编译半解释......................................................................................................41.5平台无关性..........................................................................................................5JVM内存模型...................................................................................................................52.1JVM规范..............................................................................................................62.2SunJVM...............................................................................................................92.3SUNJVM内存管理(优化)................................................................................102.4SUNJVM调优....................................................................................................132.5.JVM简单理解....................................................................................................162.5.1Java栈...................................................................................................162.5.2堆............................................................................................................162.5.3堆栈分离的好处....................................................................................192.5.4堆(heap)和栈(stack).........................................................................19JAVA垃圾收集器.............................................................................................................203.1垃圾收集简史....................................................................................................203.2常见的垃圾收集策略........................................................................................203.2.1ReferenceCounting(引用计数).......................................................203.2.2跟踪收集器............................................................................................213.3JVM的垃圾收集策略.........................................................................................253.3.1SerialCollector....................................................................................253.3.2ParallelCollector.....................................................................................253.3.3ConcurrentCollector................................................................................26Java虚拟机(JVM)参数配置说明................................................................................26Java相关1.1Java定义1.2Java的开发流程1.3Java运行的原理1.4半编译半解释1.5平台无关性JVM内存模型2.1JVM规范JVMspecification对JVM内存的描述首先我们来了解JVMspecification中的JVM整体架构。如下图:主要包括两个子系统和两个组件:Classloader(类装载器)子系统,Executionengine(执行引擎)子系统;Runtimedataarea(运行时数据区域)组件,Nativeinterface(本地接口)组件。Classloader子系统的作用:根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。Javsa程序员可以extendsjava.lang.ClassLoader类来写自己的Classloader。Executionengine子系统的作用:执行classes中的指令。任何JVMspecification实现(JDK)的核心是Executionengine,换句话说:Sun的JDK和IBM的JDK好坏主要取决于他们各自实现的Executionengine的好坏。每个运行中的线程都有一个Executionengine的实例。Nativeinterface组件:与nativelibraries交互,是其它编程语言交互的接口。Runtimedataarea组件:这个组件就是JVM中的内存。下面对这个部分进行详细介绍。Runtimedataarea的整体架构图Runtimedataarea主要包括五个部分:Heap(堆),MethodArea(方法区域),JavaStack(java的栈),ProgramCounter(程序计数器),Nativemethodstack(本地方法栈)。Heap和MethodArea是被所有线程的共享使用的;而Javastack,Programcounter和Nativemethodstack是以线程为粒度的,每个线程独自拥有。HeapJava程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。(这里可能出现的异常java.lang.OutOfMemoryError:Javaheapspace)Methodarea在Java虚拟机中,被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。与Heap一样,methodarea是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。(这里可能出现的异常java.lang.OutOfMemoryError:PermGenfull)JavastackJavastack以帧为单位保存线程的运行状态。虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到javastack中(压栈);当一个方法调用返回时,从javastack弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现StackOverFlow问题。下面的程序可以说明这个问题。publicclassTestStackOverFlow{publicstaticvoidmain(String[]args){Recursiver=newRecursive();r.doit(10000);//Exceptioninthreadmainjava.lang.StackOverflowError}}classRecursive{publicintdoit(intt){if(t=1){return1;}returnt+doit(t-1);}}Programcounter每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿“地址&rd
本文标题:JVM详解
链接地址:https://www.777doc.com/doc-3649802 .html