?

目录

为初学者而著!

1. 什么是JVM?

2. JRE/JDK/JVM是什么关系?

3. JVM原理

4. JVM执行程序的过程

5. JVM的生命周期

6. JVM的体系结构

7. JVM运行时数据区

8. JVM垃圾回收

关注我,带你了解更多知识


 

为初学者而著!

Java基础是初学者的起点,是帮助你从小白入门到精通必学基础课程!

?

B站最新录制Java300集>>>   适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。

配套学习:?>>?" data-widget="csdnlink">2022年Java300集最新录制课程上线了>>>? 

1. 什么是JVM?

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

 

2. JRE/JDK/JVM是什么关系?

JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。

JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

 

3. JVM原理

JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。

?

java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

4. JVM执行程序的过程

(1)加载.class文件

(2)管理并分配内存

(3)执行垃圾收集

JRE(java运行时环境)由JVM构造的java程序的运行环,也是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机。操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境:1) 创建JVM装载环境和配置 2) 装载JVM.dll 3) 初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4) 调用JNIEnv实例装载并处理class类。

5. JVM的生命周期

(1)JVM实例对应了一个独立运行的java程序它是进程级别

a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void

main(String[] args)函数的class都可以作为JVM实例运行的起点

b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以表明自己创建的线程是守护线程

c) 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出

(2)JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的

6. JVM的体系结构

?

类装载器(ClassLoader)(用来装载.class文件)

执行引擎(执行字节码,或者执行本地方法)

运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)

7. JVM运行时数据区

?

第一块:PC寄存器

PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。

第二块:JVM栈

JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。

第三块:堆(Heap)

它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

?

(1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的

(2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配

(3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

(4) 所有新创建的Object 都将会存储在新生代Yong Generation中。如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。新的Object总是创建在Eden Space。

第四块:方法区域(Method Area)

(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。

(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

第五块:运行时常量池(Runtime Constant Pool)

存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。

第六块:本地方法堆栈(Native Method Stacks)

JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

 

8. JVM垃圾回收

GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

(1)对新生代的对象的收集称为minor GC;

(2)对旧生代的对象的收集称为Full GC;

(3)程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

(3)弱引用:在GC时一定会被GC回收

(4)虚引用:由于虚引用只是用来得知对象是否被GC

>>" data-widget="csdnlink">Java300集2020版教程>>>

>>" data-widget="csdnlink">Java300集2022版最新教程>>>

想要Java资料或者,学习路线图的同学,可以在评论区给我说哦~~~

?

?

标签智能推荐:

Java零基础自学教程,从入门到精通

,深入Java虚拟机,深度剖析源码,以代码实战贯穿始终,以项目驱动教学,将独特的PDT教学法展现的淋漓尽致。Java学习资料了解更多...课程目录:一、Java基础概述001-Java零基础-安装EditPlus002-Java零基础-计算机概述003-Java零基础-Java软件工程师概述004-Java零基础-常用DOS命令005-Java零基础-显示文件扩展名006-Java零基础-计算机语

javase2021最强学习线路没有之一

omparable内部类详解Java的内存管理与垃圾回收Java面向对象编程_OOP基础深入讲解Java面向对象编程重基础深入讲解_OOP面向对象Java基础干货分享/JavaSE/面向对象编程/OOP程序设计【大力推荐】OOP面向对象Java基础干货分享【大力推荐】OOP面向对象Java基础干货分享/JavaSE/面向对象编程/OOP程序设计_哔哩哔哩_bilibilijava面向对象编程_ja

Python和Java哪个编程语言更好学一些?

有很多想要学习编程语言的学员,会纠结Python和Java两者应该学什么? Python编程语言和Java编程语言还是有区别的,可以根据自己的需求进行学习。首先在选择学习Java还是Python之前,得先弄明白自己学习编程语言的目的是什么,因为Python编程语言和Java编程语言的入门学习难度是不一样的,Java是一门资深的编程语言,而且Java的普及率还是很高的,Java有着丰富的第

适合Java零基础小白学习的Java零基础视频教程

基础JDK13讲解的虽然视频是专门为小白量身打造,但是教程在每一个知识点上进行了很大的延伸,深度完胜三年工作经验的程序员。课程目录第一章:Java开发环境搭建001-Java零基础-安装EditPlus002-Java零基础-计算机概述003-Java零基础-Java软件工程师概述004-Java零基础-常用DOS命令005-Java零基础-显示文件扩展名006-Java零基础-计算机语言发展史0

2020年最全面的计算机专业基础课程和Java项目【附带源码和课件】[转]

机从入门到精通【全203集】翁恺-java从基础到进阶全152集java核心技术-进阶-华东师范大学(适合有一定java基础)java核心技术-基础-华东师范大学(适合有一定java基础)网易JAVA高级课程1-高性能编程【附课件和源代码】网易JAVA高级课程23-容器化技术【附课件和源代码】网易JAVA高级课程2-中间件【附课件和源代码】图解Java的23种设计模式【时间较长-附课件和源代码】J

Java资深程序员写给Java初学者的几条建议

程序。这将教会你如何将所学的java概念放在一起解决...Java培训:零基础如何进阶?Java是一种对初学者很友好的编程语言,而且前(钱)途光明,现在java人才也很紧缺,越来越多的人转行学java。有的自学,自学真的是一条非常艰辛...什么是Java?如何学习分阶段学习Java是一种很好的策略。首先,学习语言的核心要素。这个在java培训学习中能很快掌握,基础入门的知识在培...零基础自学JA

java入门

java入门从入门到放弃,哈哈1.java的三大版本javaSE:java标准版(javastandardedition),适合开发桌面应用,控制台应用javaME:java迷你版(javamicroedition),适合开发手机小家电等嵌入式开发javaEE:java企业版(javaenterpriseedition),适合web开发,服务器开发2.JDKJREJVMJDK:(javadevel

Java体系学习书籍推荐

ava基础和进阶疯狂Java讲义Java核心基础卷1/2Java编程思想Java8实战jls11EffectiveJava --(编写代码过程中的一些最佳实践,注意事项。现在已经出第二版了,增加了lambada的内容)JAVA网络编程第4版 --(BIOsocket编程,现在基本不用了)Java性能优化权威指南Java并发编程Java多线程编程核心技术Java多线程编程实战指南

第一章 Java语言概述

.0,版本号也称为18.93.Java语言的特点Java语言是简单易学的Java语言是强制面对对象的Java语言是分布式的Java语言是健壮的Java语言是安全的Java语言是体系结构中立的Java语言是解释型的Java语言是性能略高的Java语言是原生支持多线程的4.Java语言运行机制及运行过程4.1Java语言的特点特点一:面向对象两个基本概念:类和对象三个特性:封装、继承、多态特点二:健壮