jvm基础

 

jvm 中两个线程:

  1、守护线程:jvm自己使用的线程,比如垃圾回收(GC)就是一个守护线程

  2、普通线程:一般的java程序线程,只要JVM中有普通线程在执行,那么JVM就不会停止

 

结束生命周期

在如下几种情况下,Java虚拟机将结束生命周期

1、执行了System.exit()方法

2、程序正常执行结束

3、程序在执行过程中遇到了异常或错误而终止进程

4、由于操作系统出现错误而导致Java虚拟机进程终止

 

JDK和JRE的区别

  JDK是面向开发人员使用的SDK,它提供了java的开发环境和运行环境,JDK中包含JRE

  JRE是java的运行环境,是面向所有java程序的使用者,包括开发者

 

JVM的结构体系

 

方法区:

  用于存储JVM加载完成的类型信息、常量、静态变量、即时编译器编译后的代码缓存,方法区和 Java 堆区一样,都是线程共享的内存区域。

  

  在JDK8以前,使用永久代的方式来实现方法区

GC(垃圾回收机制)

https://zhuanlan.zhihu.com/p/25539690

 

JAVA堆(JVM堆,JAVA heap)(像string,integer,byte,shortdeng包装类型)都是存放于堆中的

堆区负责存放对象实例,当java创建一个类的实例对象或者数组时,都会在堆中为新的对象分配内存。

 

  虚拟机只有一个堆,程序中所有的线程都共享它。

  堆占用的内存空间是最多的。存取方式为管道类型,先进先出,

  在程序运行中,可以动态的分配堆的内存大小

 

虚拟机栈(JVM栈,VM Stack)

 只保存基础数据类型和对象的引用,注意只是对象的引用而不是对象本身,对象是保存在堆区中

 

栈内创建的基本类型数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。而在栈内创建的引用类型实例,则还是由JVM GC管理。

当一个线程创建运行的时候,与之对应的栈就创建了,每个栈中的数据都是私有的,其他线程不能访问。

每个线程都会建立一个栈,每个栈又包含了若干个栈帧,每个栈帧对应着每个方法的每次调用,栈帧包含了三个部分:

局部变量区(方法内基本类型变量、对象实例的引用)

操作数栈区(存放方法执行过程中产生的中间结果)

运行环境区(动态连接、正确的方法返回相关信息、异常捕捉)

虚拟机栈在深度溢出或扩展失败的时候,会分别抛出StackOverflowError 和 OutOfMemoryError 异常。

 

本地方法栈(Native Method Stack)

栈内的数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。

 

每一个线程都包含一个栈区,每个栈内的中的数据都是私有的,其他栈不能访问

 

程序计数器

在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

 

JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。

程序计数器仅占很小的一块内存空间

 

当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址。如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空(Underfined)。

 

JVM执行引擎

 

posted @ 2023-05-04 13:40  xingmeng1  阅读(25)  评论(0编辑  收藏  举报