JVM入门
# jvm 体系结构
# jvm内存分布(运行时数据区)
# 程序计数器(线程隔离)
每个线程都有,记录着线程下一刻运行到哪里。如果执行的是方法,这里记录的是虚拟机字节码指令的地址。当执行的是Native方法的时候为空(Undefined)。
# 虚拟机栈(线程隔离)
每一个线程都会有一个栈帧,想像一下就是一个竹桶,调用方法会创建一个栈帧,压入栈里,调用完成会弹出栈。栈帧里面更多指的是对局部变量表的描述,里面包括基础变量,操作数栈,对象引用和returnAddress类型(指向了一条字节码指令的地址)
# 本地方法栈(线程隔离)
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
# 堆(线程共享)
jvm最大的一块内存区域,存放java对象实例和数组,java堆也是垃圾收集器管理的内存区域,从垃圾收集的角度来说,可以分为新生代,老年代,新生代还可以分Eden(8/10)、From Survivor(1/10) 、To Survivor(1/10)。
# 方法区(线程共享)
它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
# 运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分。用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
这里说明下jit即时编译, 即时编译会把热点代码直接翻译成机器代码存到代码缓存区,提高程序的执行效率。而方法区会在常量池中创建方法符号引用来链接到机器码,之后使用热点代码时,先从方法区找到方法符号引用,再根据方法符号引用找到真实的机器代码地址,总之,在JIT编译过程中,生成的本地机器代码会被存储在方法区的代码缓存区中
# java从编码到执行
# 什么是编译性语言?
程序在执行之前需要有一个专门的编译过程,把程序编译成机器可以理解的文件,这样运行时机器不需要重新翻译这个程序文件,直接使用编译后的程序文件。
特点:执行效率高,依赖编译器,跨平台性差。
有哪些编译型语言:
C/C++、Pascal/Object Pascal(Delphi)、Golang
2
# 什么是解释型语言
程序不需要编译,程序只有在运行的时候才会被翻译成机器语言,每次执行都会被翻译一次,所以执行效率比较低。
特点:执行效率低,依赖解释器,跨平台性高
有哪些解释型语言:Java、C#、PHP、JavaScript、VBScript、
Perl、Python、Ruby、MATLAB 等等
2
# java是编译型语言还是解释型语言?
答:两者都是,Java文件需要被编译成.class文件,字节码解释器负责解释.class文件为机器能理解的语言