jvm基础知识
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:76
JVM基础知识
- 1. 常见编程语言类型
- 高级语言分类
- 2. 跨平台
- 3. 运行时(Runtime)与虚拟机(VM)
- 4. 内存管理和垃圾回收(GC)
1. 常见编程语言类型
从底向上划分为最基本的三大类:机器语言、汇编 语言、高级语言。
- 机器语言:直接给计算机执行的语言,这种语言主要是利用二进制编码进行指令发送,也就是二进制内容形式的文件
- 汇编语言:主要是以缩写英文作为标符进行编写的,介于高级语言与集器语言之间
- 高级语言:以更人性化的方式形式进行编码,代码编写完成后通过编译或解释,转换成汇编 码或机器码,之后再传递给计算机去执行。
高级语言分类
有无虚拟机
- 有虚拟机:Java,Lua,Ruby,部分JavaScript的实现等等
- 无虚拟机:C,C++,C#,Golang,以及大部分常见的编程语言
变量是不是有确定的类型
- 静态类型:Java,C,C++等等
- 动态类型:所有脚本类型的语言
是编译执行,还是解释执行
- 编译执行:C,C++,Golang,Rust,C#,Java,Scala,Clojure,Kotlin, Swift…等等
- 解释执行:JavaScript的部分实现和NodeJS,Python,Perl,Ruby…等等
语言特点
- 面向过程:C,Basic,Pascal,Fortran等等
- 面向对象:C++,Java,Ruby,Smalltalk等等
- 函数式编程:LISP、Haskell、Erlang、OCaml、Clojure、F#等等
2. 跨平台
一般来说解释型语言都是跨平台的,同一份脚本代码,可以由不同平台上 的解释器解释执行。但是对于编译型语言,存在两种级别的跨平台: 源码跨平台和二 进制跨平台。
1、典型的源码跨平台(C++):
C++里需要把一份源码,在不同平台上分别编译,生成这个平台相关的二进制可执行文件,然后才能在相应的平台上运行。 这样就需要在各个平台都有开发工具和编译器,而且在各个平台所依赖的开发库都需要是一致或兼容的。
2、典型的二进制跨平台(Java字节码):
java只要将代码编译称字节码文件,然后再不同平台安装虚拟机,就可以实现跨平台了,
- 脚本语言直接使用不同平台的解释器执行,称之为脚本跨平台,平台间的差异由不同平台上的解释器去解决。
- 编译型语言的代码跨平台,同一份代码,需要被不同平台的编译器编译成相应的二进制文件,然后再去分发和执行,不同平台间的差异由编译器去解决。
- 编译型语言的二进制跨平台,同一份代码,先编译成一份通用的二进制文件,然后分发到不同平台,由虚拟机运行时来加载和执行。
3. 运行时(Runtime)与虚拟机(VM)
Java运行时 和 JVM虚拟机 ,简单的说JRE就是Java的运行
时,包括虚拟机和相关的库等资源。
运行时提供了程序运行的基本环境,JVM在启动时需要加载所有运行时的核心库等资源,然后再加载我们的应用程序字节码,才能让应用程序字节码运行在JVM这个容器里。
4. 内存管理和垃圾回收(GC)
内存资源总是有 限而又宝贵的,只占用不释放,很快就会用完了。程序得不到可用内存就会崩溃。
内存管理就是内存的生命周期管理,包括内存的申请、压缩、回收等操作。
Java的内存管理就是GC,JVM的GC模块不仅管理内存的回收,也负责内存的分配和 压缩整理
- C/C++完全相信而且惯着程序员,让大家自行管理内存,所以可以编写很自由的 代码,但一个不小心就会造成内存泄漏等问题导致程序崩溃。
- Java/Golang完全不相信程序员,但也惯着程序员。所有的内存生命周期都由 JVM/运行时统一管理。 在绝大部分场景下,你可以非常自由的写代码,而且不 用关心内存到底是什么情况。 内存使用有问题的时候,我们可以通过JVM来信息 相关的分析诊断和调整。
- Rust语言选择既不相信程序员,也不惯着程序员。 让你在写代码的时候,必须清 楚明白的用Rust的规则管理好你的变量,好让机器能明白高效地分析和管理内 存。 但是这样会导致代码不利于人的理解,写代码很不自由,学习成本也很高。