Java虚拟机知识 总结 记录
总结了自己这两天掌握的一些JVM相关的知识。方便自己复习。
jvm全称是Java Virtual Machine(java虚拟机)。它之所以被称之为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象计算机。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出是,这个虚拟机实例也就随之消亡。如果在同一个计算机上同时运行三个程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。
我们在写Java代码的时候通常是生成一个.java文件,之后通过javac来对.java文件进行编译,编译成功生成一个.class文件(字节码文件),然后通过java file 来执行java程序。
而执行这个程序,我们就需要java虚拟机来帮我们。
JVM主要包括以下几下部分:
1)Class Loader 类加载器
所有的class文件必须被加载后才能在JVM中执行。它是一个层级的结构,分为以下几种结构:
1.bootstrap class loader :用来加载Java的一些基本的API
2.extension class loader :用来加载Java的扩展库,Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java 类
3.system class loader : 它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
4.user defined class loader : 用来加载一些用户自己实现的类
类加载器在工作的时候采用的是向上委派的模式,即当classloader有类需要加载的时候,如果这个类没有被装载过,则调用父classloader去装载,一层一层向上委派直到找到bootstrap class loader,如果仍然不能装载,则跑出ClassNotFoundException异常。
2)Runtime Data Areas 运行数据区
运行数据区主要分为: Java 栈,PC register,本地方法栈,堆,方法区,常量池六个部分,前面三个部分是每个线程都具有的,而后面三个部分是所有线程所共有的。
1.Java 栈 : 用来为被执行每个方法创建一个栈帧(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。
2.堆(heap):所有线程共享这个堆。所有的类对象实例和数组都分配在堆上。Jvm堆在Jvm启动的时候被创建。Jvm提供一个垃圾收集者来管理堆。堆上的对象不需要程序员显式地销毁(gc管理)。
3.本地方法栈 : 本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。任何本地方法接口都 会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只 是简单地动态链接并直接调用指定的本地方法。
4.PC register : JVM支持多线程,每个线程都有自己的pc寄存器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native的,这个计数器值则为空(Undefined)。
5.方法区:它用于存储已被虚拟机加载的类信息,常量,静态变量,即使编译器编译后的代码等数据。
6.常量池:运行时常量池是方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方 法区的运行时常量池。
具体的可以看看这篇博客(http://boy00fly.iteye.com/blog/1096637)写的很详细.
最新文章
- asp.net mvc3登录验证
- linux 命令之grep
- Thrift架构~windows下安装和Hello World及编码引起的错误
- CSS选择器以及优先级与匹配原理
- [BS-10] 统一设置app所有页面的“返回”按钮样式
- DotNetBar v12.7.0.2 Fully Cracked
- 逐行返回http响应的内容
- java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包。
- poj 1852 Ants_贪心
- 优化SQLServer数据库加快查询速度
- 使用SQLServer2005插入一条数据时返回当前插入数据的ID
- 日常踩坑 searter
- 手机微博(weibo.cn)模拟登录及页面解析
- 警惕挂着开源的招牌到处坑蒙拐骗的垃圾项目,比如iBase4J
- Linux 安装 jdk8
- Hexo使用细节及各种问题
- 【原创】自己动手写一个能操作redis的客户端
- 程序员的数学 三册数学,概率统计、线性代数pdf
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
- python content list(1--4)