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。用来储存实例对象。
JVM底层实现与总结的更多相关文章
- synchronized在jvm底层是如何实现的
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- JVM底层又是如何实现synchronized的
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- JVM底层又是如何实现synchronized的【转载】
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁 ...
- JVM底层原理及调优之笔记一
JVM底层原理及调优 1.java虚拟机内存模型(JVM内存模型) 1.堆(-Xms -Xmx -Xmn) java堆,也称为GC堆,是JVM中所管理的内存中最大的一块内存区域,是线程共享的,在JVM ...
- [java] 虚拟机(JVM)底层结构详解[转]
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本语法到 ...
- 一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程
JVM之内存结构详解 JVM内存结构 java虚拟机在执行程序的过程中会将内存划分为不同的区域,具体如图1-1所示. 五个区域 JVM分为五个区域:堆.虚拟机栈.本地方法栈.方法区(元空间).程序计数 ...
- 阿里小哥带你玩转JVM:揭秘try-catch-finally在JVM底层都干了些啥?
让我们准备一个函数: 然后,反编译他的字节码: 首先我们介绍异常表:在编译生成的字节码中,每个方法都附带一个异常表. 异常表中的每一个条目代表一个异常处理器,并且由 from 指针.to 指针 ...
- 探索JVM底层奥秘ClassLoader源码分析
1.JVM基本结构: *.java--------javac编译------>*.class-----ClassLoad加载---->运行时数据区------->执行引擎,接口库-- ...
随机推荐
- 使用Visual Studio 2010 一步一步创建Powershell Module 和 Cmdlet
现在就用C#写一个超级简单的Module和Cmdlet 1. 在VS中创建一个Library的项目 文件->新建->项目->C#->Class Library 在这里给我们的C ...
- 获 Linux 支持的开源指令集 RISC-V 投身存储和 AI 领域
EETimes 消息,WD 宣布将在 RISC-V 处理器上实现标准化,并投资了一家初创公司 Esperanto Technologies —— 该公司主要采用开源指令集架构设计高级 SoC 和核心. ...
- 简明Python3教程 3.介绍
介绍 Python是少有的几种既强大又简单的编程语言.你将惊喜地发现通过使用Python即可轻松专注于解决问题而非和你所用的语言格式与结构. 下面是Python的官方介绍: Python is an ...
- CSS position财产
CSS在position位置信息要素用于表示属性. 有三个起飞值:static, absolute, relative. 假设元件不显式配置position财产,该元素默认position 值至sta ...
- Java异常处理错误
Java异常处理错误 研究发现,在编译阶段的最佳时机错误,序之前.然而,编译期间并不能找出全部的错误,余下的问题必须在执行阶段解决.这就须要错误源通过某种方式把适当的信息传给某个接收者,该接收者知道怎 ...
- Linking different libraries for Debug and Release builds in Cmake on windows?
问题叙述性说明: So I've got a library I'm compiling and I need to link different third party things in depe ...
- cocos2d-x 源代码分析 : Ref (CCObject) 源代码分析 cocos2d-x内存管理策略
从源代码版本号3.x.转载请注明 cocos2d-x 总的文件夹的源代码分析: http://blog.csdn.net/u011225840/article/details/31743129 1.R ...
- spring boot 集成mybatis连接oracle数据库
1. POM文件添加依赖 <!-- Mybatis --> <dependency> <groupId>org.mybatis.spring.boot</gr ...
- 怎样开始GO编程?
如果你想开始学习GO语法前,请先背熟下述4点: 1. 环境变量: 使用go env查看环境变量 GOARCH/GOHOSTARCH: 体系架构, amd64或386 GOOS/GOHOSTOS: 操作 ...
- 最简单的IdentityServer实现——Client
客户端控制台演示请求访问令牌,然后使用此令牌访问API 1.新建项目并添加引用 新建一个.net core的控制台程序IdentityServer.EasyDemo.Client 1 引用Iden ...