JVM原理分析笔记

标签: jvm 原理 分析 | 发表时间:2014-02-16 01:49 | 作者:mengqingyu
出处:http://www.iteye.com
一.Javac
1.Javac编译器的作用
将符合Java语言规范的源代码转化成符合Java虚拟机规范的Java字节码。

2.编译器主要的几个处理阶段
词法分析、语法分析、语义分析和代码生成,基于访问者模式来遍历语法树的过程。

二.ClassLoader
将Class加载到JVM中,审查每个类应该由谁加载,将Class字节码重新解析成JVM统一要求的对象格式。

1.ClassLoader等级加载机制
(1)Bootstrap ClassLoader,主要加载JVM自身工作需要的类,这个ClassLoader完全是JVM自己控制的,没有更高一级的父加载器,也没有子加载器。
(2)ExtClassLoader,它服务的特定目标在System.getProperty("java.ext.dirs")目录下。
(3)AppClassLoader,它的父类是ExtClassLoader。所有在System.getProperty("java.class.path")目录下的类都可以被这个类加载器加载。
扩展类加载器,通常是继承URLClassLoader类或是其他子类,它的父加载器都是AppClassLoader,因为不管调用哪个父类构造器,创建的对象都必须最终调用getSystemClassLoader()作为父加载器获得AppClassLoader。

2.加载class文件
(1)找到.class文件并把这个文件包含的字节码加载到内存中,通过ClassLoader类findClass()方法来实现。
(2)又可分为三个步骤,分别是字节码验证、Class类数据结构分析及相应的内存分配和最后的符号表的链接。
(3)类中静态属性和初始化赋值,以及静态块的执行等。

3.显示加载一个类的方式
(1)通过类Class中的forName()方法。
(2)通过类ClassLoader中的loadClass()方法。
(3)通过类ClassLoader中的findSystemClass()。

4.什么情况下实现自己的ClassLoader
(1)在自定义路径下查找自定义的class类文件。
(2)保证通过网络传输的类的安全性,可以将类经过加密后再传输,在加载到JVM之前需要对类的字节码再解密。
(3)如果我们可以检查已经加载的class文件是否被修改,如果修改了,可以重新加载这个类,从而实现类的热部署。

三.JVM
1.体系结构
(1)类加载器,在JVM启动时或者在类运行时将需要的class加载到JVM中。
(2)执行引擎,任务是负责执行class文件中包含的字节码指令,相当于实际机器上的CPU。
(3)内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者PC指针的记录器等。
(4)本地方法调用,调用C或C++实现的本地方法代码返回结果。

2.类加载器
每一个被JVM装载的类型都有一个对应的java.lang.Class类的实例来表示该类型。

3.执行引擎
执行引擎是JVM的核心部分,执行引擎的作用就是解析JVM字节码指令,得到执行结果。执行引擎具体采取什么方式由JVM的实现厂家自己去实现。
(1)直接解释执行。
(2)采用JIT技术,将字节码转成本地代码去执行。如JVM在执行程序时会记录某个方法的执行次数,如果次数到一个阀值就会编译这个方法为本地代码。
(3)基于栈的架构,实现JVM跨平台,更好地优化代码和指令的紧凑性。如SUN的hotspot是基于栈的执行引擎。
(4)基于寄存器的架构,性能较好,但无法跨平台,因为在没有或者很少的寄存器的机器上也要同样能正确地执行Java代码。如Google的Android平台上的Dalvik VM就是基于特定芯片(ARM)设计的基于寄存器的架构。

4.内存管理
(1)PC寄存器,用于保存当前正常执行的程序的内存地址。
(2)本地方法栈,为JVM运行Native方法准备的空间,很多Native方法都是用C语言实现的,所有它通常又叫C栈。
(3)Java栈,当创建一个线程时,JVM就会为这个线程创建一个对应的Java栈,这个Java栈中又会含有多个栈帧,一个栈帧对应一个方法和方法内的变量,返回值等信息。
(4)Java堆,存储Java对象的地方,它是JVM管理Java对象的核心存储区域,被所有Java线程所共享。
(5)方法区,用于存储类结构信息,包括:常量池、域、方法数据、方法体、构造函数、实力初始化、接口初始化都存储在这个区域。属于Java堆中的永久区。
(6)常量池,包括:编译期的数字常量、方法或者域的引用。属于方法区的一部分。

5.内存分配策略
(1)静态内存分配
(2)栈内存分配
(3)堆内存分配

6.内存回收策略
(1)静态内存分配和回收,Java被编译时就已经能够确定需要的内存空间,当程序被加载时系统把内存一次性分配给它。如局部变量包括数据原生类型(long等占用8个字节)和对象的引用(Object对象类型引用会占用4个字节空间)。
(2)动态内存分配和回收,Java中对象的内存空间是动态分配的,所谓的动态分配就是在程序执行时才知道要分配的存储空间大小。
(3)基于分代的垃圾收集方式,把对象按照寿命长短来分组,分为年轻代和年老代,新创建的对象被分在年轻代,如果对象经过几次回收后仍然存活,那么再把这个对象划分到年老代。年老代的收集品读不像年轻代那么频繁。

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [jvm 原理 分析] 推荐:

JVM原理分析笔记

- - Java - 编程语言 - ITeye博客
1.Javac编译器的作用. 将符合Java语言规范的源代码转化成符合Java虚拟机规范的Java字节码. 2.编译器主要的几个处理阶段. 词法分析、语法分析、语义分析和代码生成,基于访问者模式来遍历语法树的过程. 二.ClassLoader. 将Class加载到JVM中,审查每个类应该由谁加载,将Class字节码重新解析成JVM统一要求的对象格式.

JVM工作原理介绍

- - 开源软件 - ITeye博客
一、          JVM 的生命周期. 1.       JVM实例对应了一个独立运行的java程序它是进程级别. 启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点.

java中JVM的原理

- - CSDN博客编程语言推荐文章
一、java虚拟机的生命周期:.   Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序. 程序开始执行时他才运行,程序结束时他就停止. 你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机. Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组.

jvm内存映像分析

- - ITeye博客
     jdk自带的jmap就是java内存映像工具,可以用于上生成堆转储快照:. 在eclipse中启动一个java类,打开jdk安装目录下的C:\Program Files\Java\jdk1.6.0_11\bin目录,双击jconsole.exe,显示连接窗口:.  ,单击pid为6920的选项,点连接进入,可以看到jvm运行时的多种参数,.

MAT JVM内存分析

- - 开源软件 - ITeye博客
我们使用的是 Eclipse Memory Analyzer V0.8,Sun JDK 6. 和其他插件的安装非常类似,MAT 支持两种安装方式,一种是“单机版“的,也就是说用户不必安装 Eclipse IDE 环境,MAT 作为一个独立的 Eclipse RCP 应用运行;另一种是”集成版“的,也就是说 MAT 也可以作为 Eclipse IDE 的一部分,和现有的开发平台集成.

JVM系列三:JVM参数设置、分析

- - zzm
 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择 不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率. 但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(如何选择见 GC种类及如何选择).

JVM垃圾回收(GC)原理

- kill - yiihsia[互联网后端技术]_yiihsia[互联网后端技术]
引用计数(Reference Counting). 原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数. 垃圾回收时,只用收集计数为0的对象. 此算法最致命的是无法处理循环引用的问题. 标记-清除(Mark-Sweep). 第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除.

JVM工作原理和特点

- - CSDN博客云计算推荐文章
作为一种阅读的方式了解下jvm的工作原理. JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.. 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例. 4.调用JNIEnv实例装载并处理class类. 在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间..

Linux与JVM的内存关系分析

- - 美团技术团队
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m. 从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示. 同时,由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了.

JVM 堆外内存泄漏分析(一)

- - coderbee笔记
Java 应用部署在 Kubernetes 集群里,每个容器只运行一个进程, JVM 的启动命令是打包在镜像文件里的. 常规的方式是采用 -Xmx4g -Xms2g 这样的参数来指定 JVM 堆的最大、最小尺寸,如果需要调整堆大小就需要重新打包镜像. 为了避免因为修改堆大小而重新打包,从 JDK 8u191 版本开始支持 JVM 感知容器资源限制,这样在调整 JVM 内存分配时就不需要重新打包镜像文件,采用下面的参数来使 JVM 在启动时感知到容器的资源限制,并设定堆的大小:.