JVM底层实现与总结
一、类加载器
1.BootstrapClassLoader(启动类加载器)
它主要负责加载%JAVA_HOME%/jre/lib
,-Xbootclasspath
参数指定的路径以及%JAVA_HOME%/jre/classes
中的类。
2.ExtensionClassLoader (扩展类加载器)
ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext
,此路径下的所有classes目录以及java.ext.dirs
系统变量指定的路径中类库。
3.AppClassLoader
AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。
他们之间为父子类关系,双亲委托机制是父及子去递归调用加载器,沙箱安全机制使用户无法替换JDK本身的类。
此外可以用户自定义加载类,定义自已的类加载器分为两步:1、继承java.lang.ClassLoader2、重写父类的findClass方法。
classloader的作用是将字节码文件读取到内存,是JVM的入口
二、执行引擎(Execution Engine)
执行引擎的作用是解释命令,提交给操作系统执行
三、本地方法栈(线程私有)
通过执行native方法,通过本地方法接口调用本地方法库
四、程序计数器(线程私有)
可看做是指针,指向方法区的字节码(即下条指令的地址),内存很小
五、虚拟机栈(线程私有)
生命周期与线程一致。8种基本类型变量,对象的引用变量,实例方法都是在函数的栈内存分配,主要保存三种数据:
1.本地变量:输入输出参数、方法内变量
2.栈操作 :出栈、入栈等操作
3.栈帧数据:类文件、方法等
六、方法区(线程共享)
用于储存静态变量、常量、类信息(构造函数/接口定义)、运行时常量池。
虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。
七、堆(线程共享)
一个JVM对应着一个堆,用于存放对象实例。可以通过参数-Xms
和-Xmx
来控制。默认1/64和1/4。用来储存实例对象。
最新文章
- Jquery 下实现 图片大图预览效果
- linux /etc/profile和/etc/bashrc
- Correlation Filter in Visual Tracking系列二:Fast Visual Tracking via Dense Spatio-Temporal Context Learning 论文笔记
- 用sql从一张表更新数据到另外一张表(多表数据迁移)
- 【原创】MYSQL++源码剖析——前言与目录
- Mobiles Wall – 致力于分享最优质的手机壁纸
- js之数组,对象,类数组对象
- oracel数据库基本知识和基本查询方法
- winform之excel导入和导出
- sql 自定义函数--十进制转二进制
- XML格式以及相关libxml库学习
- ubuntu 13.10 install wireshark
- 环境搭建之allure的安装配置,及简单使用
- yumiot的发展历程。
- JMeter 中_time 函数的使用(时间戳、当前时间)
- linux shell脚本之-变量极速入门与进阶(2)
- redis分布式工具类 ----RedisShardedPoolUtil
- assert用法
- winform/timer控件/权限设置/三级联动
- tf tensor 输出