文章目录 一、什么是平台无关性 二、平台无关性的实现 我们举个小例子 三、为什么JVM不直接将源码解析成机器码去执行 一、什么是平台无关性 Java语言是一款跨平台的语言,不管是在windows还是在Linux又或者是mac os,它都可以支持并在上边运行,秉持着一次编译,随处运行(Compile Once,Run Anywhere)的原则。 Java程序可以编译成.class二进制文件,通过Cl...

问题 写测试,自定义String类,代码如下: 你仔细看报错的信息,你会感觉很疑惑,我明明在我自定义的String中写了main方法,为什么还是会报错呢?这就涉及到了双亲委派模式。 双亲委派 类加载器 再说双亲委派时,我们就得不说类加载器。类加载器并不神秘,只是我们觉着神秘了。 当JVM将Java源代码转化为字节码时,类加载器就加载和初始化字节码文件。至于它能不能运行,以及运行效果,类加载器就不关...

Class文件格式

jvm底层原理

  

2020-05-12 21:06:09

一 总体结构 class文件用C语言的结构体这样表示 二 magic和版本 所有class文件都以十六进制的咖啡宝宝开头,也就是著名的CAFEBABE,这就是magic。如: 其次是版本,如图 这个就是版本为50.0(十六进制的32就是十进制的50) 版本列表 JDK版本 编译后的版本号 十六进制表示 JDK1.5 49 0X31 JDK1.6 50 0X32 JDK1.7 51 0X33 JDK...

Java学习之从“底”学起

面试  底层  jvm  java

  

2020-08-29 14:43:38

临近秋招,许多小伙伴也开始狂刷面试题,总结面试考点,希望可以在今年这个不太一般的秋天去到心仪的公司。在这里,我来总结一下最近刷Java底层试题以及看面试视频的题型。 我的理解是,我们在回答Java方面的知识时,不仅仅是能达到“会用”,我们更要理解其原理是怎么实现的,理解了底层实现,才能决定以后在编程路上走到什么地步,所有语言大同小异,理解了设计思想,什么语言都是一样的。 文...

类加载子系统

JVM底层原理

  

2020-09-11 03:04:47

类加载子系统 类加载器与类的加载过程 类加载器ClassLoader角色 类的加载过程 类加载器与类的加载过程 类加载子系统的作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文开头有特定的文件标识。 JAVA专属字节码文件开头都是CA FE BA BE Classloade只负责class文件的加载,至于它是否可以运行,则由 ExecutionEngine决定。 加...

虚拟机栈(下)

JVM底层原理

  

2020-09-16 04:25:21

虚拟机栈(下) 栈顶缓存技术 动态链接(指向运行时常量池的方法引用) 运行时常量池 方法的调用 静态链接 动态链接 方法的绑定机制 早期绑定 晚期绑定 虚方法与非虚方法 关于invokedynamic指令 虚方法表 方法返回地址 栈帧中的一些附加信息 栈顶缓存技术 什么是栈顶缓存技术 将栈顶元素在物理CPU的寄存器中,以此降低对内存的读/写次数,提升执行引擎的执行效率。 为什么需要栈顶缓存技术 因...

🍟 逃逸分析 举例 参数设置 逃逸分析之代码优化 栈上分配 同步省略 分离对象/标量替换 逃逸分析小结 在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有种特殊情况,那就是如果经过 逃逸分析( Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成 栈上分配。这是最常见的堆外存储技术。 逃逸分析 判断是否会将堆上的对象分配到栈上去就...

方法区(下)

JVM底层原理

  

2020-09-21 03:50:32

方法区(下) 方法区使用举例 方法区的演进细节 永久代为什么要被元空间取代 String Table为什么要调整 方法区的垃圾收集 总结 方法区使用举例 详情过程见该处 方法区的演进细节 首先要明确的一个点,只有Hotspot才有永久代,BEA JRockit 、IBM、J9等都没有这个概念。 Hotspot中方法区的变化 永久代为什么要被元空间取代 1、因为永久代很难设置适合的空间大小 在某些场...

方法区(上)

JVM底层原理

  

2020-09-21 17:32:44

方法区(上) 栈、堆、方法区的交互关系 方法区的理解 元空间和永久代的区别 设置方法区大小与OOM 设置方法区大小 如何解决OOM 方法区的内部结构 存储的东西 常量池和运行时常量池 为什么需要常量池? 运行时常量池 栈、堆、方法区的交互关系 new出来的那个 new XX都是存放在堆中。 Person这个类则被存放到方法区中 person这个对象则放在栈中。 方法区的理解 方法区看作是一块独立于...

垃圾回收相关算法

JVM底层原理

  

2020-09-26 12:46:42

垃圾回收相关算法 垃圾标记阶段的算法之引用计数算法 小结 垃圾标记阶段的算法之可达性分析算法 对象的finalization机制 垃圾清除阶段算法之标记--清除算法 垃圾清除阶段算法之复制算法 垃圾标记阶段的算法之引用计数算法 在执行GC前要先判断那些是存活对象,哪些是已经死亡的对象。只有被标记为已死亡的对象,GC的时候才会把它收拾掉。 判断对象是否存活一般有两种方式:引用计数算法(Java并不使...

GC日志分析

JVM底层原理

  

2020-10-02 01:50:27

GC日志分析 打开GC日志: 一些补充说明 打开GC日志: ① ② ③ 如果想把GC日志存到文件,使用: 一些补充说明...

01-JVM底层原理

jvm底层  jvm内存模型

  

2019-11-01 03:12:18

1、JDK体系结构 JVM属于JRE的一部分 JVM屏蔽了底层系统的差异 JVM分为两个版本,Client VM和Server VM,但JDK8以后基本没有Client VM了,通过命令java -version查看 JRE是JDK的一部分 JRE包含了java程序运行时所需要的底层的类库,大部分是用C和C++语言去写的 JDK除了包含JRE以外,还包含了编译Java代码所需要的编译器、监控JVM...

CAS CAS概述和作用 CAS的全称是: Compare And Swap(比较相同再交换)。是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。 CAS的作用: CAS可以将比较和交换转换为原子操作,共享变量赋值时的原子操作。 CAS操这个原子操作直接由CPU保证。 CAS可以保证作依赖3个值:内存中的值V,旧的预估值X,要修改的新值B,如果旧的预估值X等于内存中的值V,就将新...

1.  Object 的finalize() 方法的作用是否与C++的析构函数的作用相同       1. 与C++的析构函数不同,析构函数调用时机确定,finalize() 方法是不确定的。       2. 将未被引用的对象放置于F-Queue队列。       3. 方法执行随时可能会被终止。...

类加载机制 JVM虚拟机通过类加载器将描述类的.class文件中的数据读入内存,并对数据进行验证、解析和初始化,最终形成可以被虚拟机直接使用的Class对象。 类的加载过程 整个类的生命周期如下:   加载 将.class文件中的数据加载到内存并将其放入方法区内,然后在内存中创建一个java.lang.class对象(JVM规范并未规定class对象的位置该放在哪,然而Hotspot将其...