JVM底层原理

Java中JVM,JRE和JDK的区别

 

 JVM:java虚拟机,负责把.class 二进制文件翻译成不同系统上的机器操作指令。

 JRE:包含了JVM和一些类库,如果不对代码进行编译只是运行,那么只需要JRE就行了。

 JDK:包含了JRE和一些开发工具,如javac命令可以对java代码进行编译

 Java为什么能跨平台运行

 

因为它有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机上进行的,每个系统平台都是有自己的虚拟机(JVM),所以JAVA语言能跨平台。
1, java代码不是直接运行在CPU上,而是运行在java虚机(简称JVM)上的。
2,java是先把java文件编译成二进制字节码的class文件,jvm就解释执行class文件。
3,就是因为java是运行在jvm上的,所以它的代码就能不经修改,就能在不同平台的jvm上运行(在UNIX用UNIX的jvm,在linux上用linux的jvm,在windows上用windows的jvm)
假如用windows移植到UNIX,只需把java文件是UNIX的jvm上编译成class文件,然后用jvm运行就可以了

 

 

JVM内存结构

 

 

 JVM 将内存划分为 5个部分,分别为线程共享的  和 方法区,以及线程私有的 程序计数器虚拟机栈 和 本地方法栈

  1.方法区(Method Area)

方法区同 Java 堆一样是被所有线程共享的区间,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。更具体的说,静态变量+常量+类信息(版本、方法、字段等)+运行时常量池存在方法区中。常量池是方法区的一部分。

:JDK1.7以及之前使用的是老年代的方式,JDK1.8 使用元空间 MetaSpace 替代方法区,元空间并不在 JVM中,而是使用本地内存。元空间两个参数:

MetaSpaceSize:初始化元空间大小,控制发生GC阈值
MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存

 

常量池:常量池中存储编译器生成的各种字面量和符号引用。字面量就是Java中常量的意思。比如文本字符串,final修饰的常量等。方法引用则包括类和接口的全限定名,方法名和描述符,字段名和描述符等。

常量池的有点:避免了频繁和创建和销毁对象而影响系统的性能,实现了对象的共享

举个栗子:

 

posted @ 2020-06-08 14:39  fancz  阅读(646)  评论(0)    收藏  举报