jvm系列之一:jvm结构

前言:

好久没有写博客了, 去年10月份离职了,接着家里出了一些事情。所以在11月12进入了一家大数据公司,可惜还是做web端开发,没机会学习大数据,但是工作了5天,就被派到上海来出差了,还是长期出差····到现在还没有说过什么时候能回京。算了,天天在酒店住着,也是挺自由,只是公司派我一个人,有点孤单,哈哈 ~~ 最近又有很大的危机感, 老听说裁员的事情,所以还是好好学习,天天向上,时刻准备着找工作,好了言归正传

介绍:

jvm 是面试几乎80%以上 的可能性会被问到的。 基本都会问问jvm结构 或者 jvm 中用到的垃圾回收算法,垃圾回收器,以及jvm怎么优化之类的。 接下来几篇博客,就简单的介绍一下这些问题,这里首先讲解一下JVM的结构。

JVM 简单结构

简单找了一张图,直观的看一下JVM的大体结构(这里只是大体结构,没有很细,后续的几篇博客,会针对比较重要的做详细讲解)
jvm结构图
接下来,我们就对上图中的各个模块做个简单的介绍

类加载子系统

1、类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。但第二次实例化一个类时,就从对应Class类newInstance(),不用每次都读取.class文件。 实例化类以后会存到方法区中,方法区中除了存类信息以外,还会存储数字常量和字符串常量等信息。

方法区

方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。虽然java虚拟机规范吧方法区描述为堆的一个逻辑部分,但是他有一个别名叫做non-Heap(非堆),目的应该是与java堆区分开来。

java堆

java堆被所有线程共享的一块内存区域,在虚拟机启动的时候创建,此内存区域的唯一目的就是存放对象实例。几乎所有的对象实例都在这里分配内存。Java虚拟机规范描述:所有对象实例以及数组都要在堆上分配。(但是随着JIT编译器的发展与逃逸分析的组件成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了)。更细致一点的划分, java堆可以分为:新生代,老年代,永久代。新生代又可以划分为:eden空间,from survivor空间,to survivor空间,这些在接下来的篇章介绍。<另外:在堆内存中会有一份“永久代”内存,有逐渐取消的趋势,永久代的信息也会存到方法区,这个如果有兴趣,可以自己查查>

java栈

与程序计数器一样,java虚拟机栈也是线程私有的,他的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。主要存储:基本数据类型(boolean、 byte、char、short、int、float、long、double),对象引用(根据不用虚拟机的实现,他可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他榆次对象相关的位置),returnAddress类型(指向了一条字节码指令的地址)

直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中农定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可以使用native 函数库直接分配堆外内存,然后通脱一个存储在Java堆中的DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据

本地方法栈

本地方法栈与虚拟机栈发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现他。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样。本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常

垃圾回收系统

垃圾回收系统是java虚拟机的重要组成部分,垃圾回收器可以对方法区,java堆和直接内存进行回收,其中,java堆是垃圾收集器的工作重点,因为java语言垃圾回收都是隐式的,都是垃圾回收系统在后头默默工作

pc寄存器(程序计数器)

这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。

------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.

博客参考;尚学堂视频 & 深入理解jvm虚拟机第三版

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值