• 在JVM 中进程与线程关系、介绍线程:程序计数器、本地方法栈、虚拟机栈


    首先,我们要了解进程和线程的基本概念

    进程

    process

    一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间一个进程可以有多个线程,比如在Windows系统中,一个运行的*.exe应用程序就是一个进程。

    在这里插入图片描述

    线程

    thread

    进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程多个线程可共享数据。

    相同点

    线程具有许多传统进程所具有的特征,故又称为轻型进程Light—Weight Process进程元;而把传统的进程称为重型进程Heavy—Weight Process,它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程

    不同点

    与进程不同的是同类的多个线程共享进程的方法区资源,但每个线程有自己的程序计数器虚拟机栈本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程

    Java中的多线程

    Java 程序是多线程程序,Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等多个其他同时运行。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main函数所在的线程就是这个进程中的一个线程,也称主线程。多线程同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程.

    在JVM 中进程与线程关系

    自己理解下,自己画的图,将就看了
    在这里插入图片描述
    一个进程中可以有多个线程,在进程中多个线程共享堆和方法区 (方法区在JDK1.8 之后属于元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈 和 本地方法栈

    堆和方法区

    堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象(所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器JIT编译后的代码等数据

    程序计数器的作用

    1. 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
    2. 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了

    程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。

    特别:如果执行的是 native方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址

    Native

    简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。 在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的,native是有实现体的,只不过这些实现体是非java的。标识符native可以与所有其它的java标识符连用,但是abstract抽象方法是没有实体的,所以除外。

    本地方法栈

    1. 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。
    2. 不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈

    虚拟机栈

    每个 Java方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在Java虚拟机栈中入栈和出栈的过程。

    为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。

  • 相关阅读:
    python读写查询mysql数据库
    关于ES5内置函数Object的新方法--Object.create()
    【无标题】
    YOLO V3详解
    STM8应用笔记6.3.8位定时器应用之三
    Flask 学习-22.可插拨视图MethodView类
    变量和函数提升(js的问题)
    GFS 分布式文件系统
    python实现截图识别文字(已打包成exe程序)
    【MySql】mysql之进阶查询语句
  • 原文地址:https://blog.csdn.net/qq_37432174/article/details/127931994