zoukankan      html  css  js  c++  java
  • JVM组成结构以及各部分的功能详解

    前言

    MySQL文章接近尾声,之后我们还会陆续发一些文章,比如MVCC等等文章,接下来的阶段,我们准备进入JVMredis等知识点的学习,这个是中高级程序员面试必问知识点,跟着老哥的文章,学好JVM高薪走起!!!

    jre、jdk、jvm之间的关系

    JDK是Java程序员常用的开发包、目的就是用来编译和调试Java程序的。

    JRE是指Java运行环境,也就是我们的写好的程序必须在JRE才能够运行。

    JVM是Java Virtual Machine(Java虚拟机)的缩写,是指负责将字节码解释成为特定的机器码进行运行,值得注意的是在运行过程中,Java源程序需要通过编译器编译为.class文件,否则JVM不认识。

    jvm组成结构

    我们先来研究一下jvm的组成结构都有哪些

    jvm结构图

    类加载子系统

    负责从文件系统或是网络中加载class信息,加载的信息存放在一个称之为方法区的内存空间

    方法区

    用于存放类的信息、常量信息、常量池信息、包括字符串字面量和数字常量。我们常用的反射就是从这个方法区里读取的类信息

    Java堆(下篇文章重点讲解)

    堆空间是jvm启动的时候创建的一块内存区域,几乎所有的对象实例都放在这个空间里(可以理解成new 出来的那些对象)。

    这个区域被划分为新生代和老年的,之后重点讲解,我们常说的GC垃圾回收机制,就是主要回收堆空间的垃圾数据。

    堆空间里的数据,是被所有线程共享的,所以会存在线程安全的问题。所以那些锁就是为了解决堆空间数据线程安全的问题而生的。

    直接内存

    直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但这部分也是被频繁的读写使用,也可能会导致OutOfMemoryError异常的出现。

    Java的NIO中的allocateDirect方法是可以直接使用直接内存的,能显著的提高读写的速度。

    Java栈

    就是我们常说的堆栈两兄弟之一的栈,所有线程共享堆空间里的数据,但是栈空间是每个线程独有的,互相直接不能访问。

    栈空间是线程创建的时候所创建的一份内存空间,栈里主要保存一些局部变量、方法参数、Java方法调用,返回值等信息。

    本地方法栈

    本地方法栈和Java栈不同之处在于,可以直接调用Java本地方法,即JDK中用native修饰的方法。

    垃圾收集系统(之后重点讲解)

    GC垃圾回收,是一个非常重要的知识点,保证我们程序能够有足够的内存空间运行,回收掉内存中已经无效的数据,大家就可以理解成我们日常中活中的垃圾回收。

    回收算法一般有标记清除算法、复制算法、标记整理算法等等,之后的文章,我们会详解讲解每一种算法。

    PC寄存器

    它是每个线程私有的空间,JVM会为每个线程创建单独的PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC寄存器会执行当前正在被执行的指令,如果是本地方法,则PC寄存器值为undefined,寄存器存放如当前环境指针、程序计数器、操作栈指针、计算的变量指针等信息。

    执行引擎

    是jvm非常核心的组件,它负责执行jvm的字节码,一般先会编译成机器码后执行。

    结语

    今天我们主要介绍一下jvm的组成结构,我们先宏观的看看jvm,之后在深入详细讲解每个点,什么是堆,什么是GC垃圾回收等等知识,敬请期待。

    IT 老哥

    一个在大厂做高级Java开发的程序猿

  • 相关阅读:
    activemq 异步和同步接收
    简单的activemq的封装和使用
    activemq 一个不错的ppt
    activemq 的小实验
    activemq api的封装
    观察者设计模式例子
    【转载】自定义类加载器例子
    京东拍拍网 笔试 搞java的去考C++ 苦逼
    java中用equals比较两个内容相同的字符数组
    云端飘 String s=new String("abc")创建了几个对象?
  • 原文地址:https://www.cnblogs.com/itlaoge/p/14219593.html
Copyright © 2011-2022 走看看