JAVA学习【10】JVM基础知识整理
来源:互联网 发布:mac无法识别u盘启动盘 编辑:程序博客网 时间:2024/06/08 08:30
JVM是面试必考内容,需特别注意。
JVM(Java Virtual Machine)是在本地计算机平台上利用程序模拟的一种虚拟机,是Java语言能够跨平台运行的根本,可以认为JVM是一个本地进程,用于运行.class文件。
每个Java程序都是一个独立的JVM实例,都有独立的堆空间,同一Java程序的多个线程共享同一个堆空间。
JAVA程序运行过程
由上可知,JVM主要是将.class文件解释成操作系统可以运行的机器码。
JVM的基本结构
类装载器:根据类名装载.class文件到Runtime Data Area的Method Area
执行引擎:执行字节码。Class文件被加载后 , 会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操作系统。
本地接口:调用本地接口的。他的作用是调用不同语言的接口给JAVA用。
运行时数据区:JVM虚拟机模拟的内存,包括
(1)堆(Heap):存储类的对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
(2)栈(Stack):存放当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。
(3)方法区域(Method Area):存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。反射类Class获得的信息都来源于方法区域。
(4)程序计数寄存器(Program Counter Register):存储每个线程下一步将执行的JVM指令。
(5)本地方法栈(Native Method Stack):支持native方法的执行。
其中,所有线程共享使用堆(Heap)和 方法区域(Method Area),每个线程独立拥有栈(Stack)、程序计数寄存器(Program Counter Register)和本地方法栈(Native Method Stack)。
关于String存储的运行时常量池(Run-time Constant Pool)通常认为位于堆(Heap)中,有时也认为位于方法区域(Method Area)中,因为可以认为方法区域(Method Area)也位于堆(Heap)中,即
JVM的运行过程
JVM是如何将.class文件解释成机器码的了?
1) 装载.class文件(包括加载类、链接、初始化)可以参考图文http://sishuok.com/forum/blogPost/list/355.html
2) 管理并分配内存执行程序
3) 执行垃圾收集
可以参考http://www.open-open.com/lib/view/open1408453806147.html
JVM的垃圾回收
JVM中会在以下情况触发回收:对象没有被引用 , 作用域发生未捕捉异常 , 程序正常执行完毕 , 程序执行了System.exit() , 程序发生意外终止
垃圾回收器GC(Garbage Collection)对对象生命周期分析后,将内存中不再被使用的对象进行回收。GC把对象分为年青代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation),对不同生命周期的对象使用不同的算法进行回收。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
年青代(Young Generation):所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。
年老代(Old Generation):在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代(Permanent Generation):用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响。
常见垃圾回收策略:
(1)引用计数回收机制
引用计数是标识Heap中对象状态最明显的一种方法,引用计数的方法简单来说就是对每一个对象都提供一个关联的引用计数,以此来标识该对象是否被使用,当这个计数为零时,说明这个对象已经不再被使用了。
缺点:并且引用计数无法解决循环引用的问题,因此JVM并没有采用引用计数。
(2)根搜索算法回收机制(JVM采用的垃圾回收策略)
具体可以参考http://www.open-open.com/lib/view/open1437834571349.html
以上只是JVM基础知识整理
- JAVA学习【10】JVM基础知识整理
- java基础知识学习整理
- JAVA基础知识整理(六) ---JVM
- Java基础知识整理一(JRE、JVM、基…
- 2017最新Java基础知识面试笔试整理--jvm基础篇
- JAVA学习笔记整理一(基础知识)
- JVM学习笔记-基础知识
- java jvm基础知识
- 深度学习基础知识整理-
- 机器学习基础知识整理
- Java基础知识资料整理
- Java基础知识资料整理
- java 基础知识整理归纳
- Java基础知识整理
- java基础<基础知识整理>
- 整理 java SE基础知识
- Java基础知识大整理
- 初识JAVA基础知识整理
- 移动web页面支持弹性滚动的3个方案
- HDOJ 1058Humble Numbers
- redhat6 yum
- 关于JAVA中URL传递中文参数,取值是乱码的解决办法
- Leetcode:205. Isomorphic Strings(JAVA)
- JAVA学习【10】JVM基础知识整理
- Android Studio导出Jar包
- 转载一篇写的不错的java ClassLoader工作机制的文章
- emma中文显示乱码问题解决
- 什么是通用项目周期?它有什么样的特点?对其它项目有什么启示?
- 【版本发布】JEECG 3.6.2 移动能力版发布,快速开发平台
- ubuntu 各种软件安装和使用
- 快速排序 约瑟夫问题 顺序查找 二分查找
- gdb debug指令介绍