JVM基础知识(一)

什么是JVM    

       JVM是JAVA语言的一个重要组成部分,它完成了JAVA体系中最底层的与内存,操作系统交互的工作,也是学习JAVA首先学习,也是最应该学习的部分,正是因为JVM的存在,才使得JAVA被称为平台无关性的跨平台语言,JVM全称Java Virtual Machine(Java虚拟机),所有的java程序都是基于jvm运行的,它可以将字节码文件编译成机器码执行。它将java程序和操作系统进行了隔离,jvm其实是一种规范,就像是java体系中的接口,有不同的方案可以基于这个接口来实现,像Oracle的Hotspot虚拟机(目前最流行的虚拟机,以后的jvm的知识也是基于Hotspot来说),IBM的J9虚拟机,淘宝的TaobaoVM虚拟机都是JVM的实现。

 

JVM模块概述

 

类装载子系统:将.class文件解析并加载到运行时数据区域,类加载机制,双亲委派等等就发生在这里

字节码执行引擎:顾名思义就是执行一行一行字节码的地方

运行时数据区,这块就是JVM中最重要也是面试中最常问到的部分,内存操作,GC回收都发生在这里,黄色部分为线程共享区域(线程不安全),蓝色部分为线程私有区域(线程安全)。

 

JVM 内存区域

      JVM在运行时,会将本机内存化出一块内存区域来进行虚拟化内存操作,里边会将内存按JVM规范划分出许多个数据区域,这些区域就是JVM的运行时数据区域。那么java的语言的另外一个特点,自动内存管理机制就是发生于运行时数据区域,它能够将java开发者从如何管理内存的烦恼中解放出来,不需要开发者手动创建和释放内存,而是交由jvm来做。

      在JVM 中,JVM 内存主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈等。按照与线程的关系划分,也可以分为线程私有区域和线程共享区域两大块。线程私有区域的意思就是随着单一线程的创建而创建,随着线程的结束而消亡,其他线程无法访问到私有区域的数据内容,从底层保障了线程安全性。线程共享区域就是只要JVM还在运行,这块区域就一直存在,且可以被多个线程访问到,而在本地内存中,除了jvm内存区域的其余部分,我们将之称为直接内存,原则上不归jvm管理,但是在某些情况下,jvm也是可以使用这块内存空间的。

     

       首先简要概述一下线程共享区域:Java堆内存是线程共享的一块内存区域,一般是Java虚拟机所管理的内存中最大的一块,此内存区域唯一的目的就是存放对象实例,几乎所有(注意这里不是全部,经过逃逸分析,某些对象实例可以进行栈上分配)的对象实例都在这里分配内存。同时,Java堆内存是垃圾回收器管理的主要区域,从内存回收的角度,由于现在的收集器基本都采用分代收集算法,所以Java堆内存还可以分为:新生代和老年代,再细一点的有Eden空间、From Survivor空间、To Survivor空间等。方法区原则上可以实行垃圾回收,但是效率极低,一般不执行,方法区的概念这里要着重说一下,我们在各种博客中看到所谓永久代,元数据区其实都是方法区,它们是各个版本的jdk对方法区规范的实现。

      再来说一下线程私有区域,线程私有区域就是随着一个线程的创建而创建,大小默认为1M,虚拟机栈是一种栈式结构,先进后出,可以理解为弹匣,最先按进的子弹最后一个打出,那么虚拟机栈中的“子弹”就是栈帧,是线程中存放私有数据的地方,本地方法栈就是调用C语言函数的地方,就是源码中的native方法执行的地方,程序计数器则是记录当前的执行引擎执行到字节码哪一行的地方。每一个线程的启动,jvm都会自动分配给线程一套私有模块,且随着线程结束而自动释放掉分配的这块内存区域,这块的内存的回收不需要由GC回收器来执行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值