JVM的内存结构学习总结

前言

以前对JVM一直一知半解,经过一段时间的学习之后,感觉自己总算是初步理解了JVM,在此理一下思路并进行一个学习总结

JVM内存结构
首先,先把JVM运行时的数据区分线程共享部分和线程独占部分。
线程共享部分,即所有线程都可访问到数据的部分。由方法区构成
线程独占部分,即每个线程拥有的独立数据空间,其他线程无法访问。由虚拟机栈本地方法栈程序计数器构成。

为了方便记忆,可以把JVM的运行流程和各个内存区域的功能串起来

1.方法区
首先JVM做的第一件事,就是把你编写的Java代码编译成为.class文件,然后放入内存(方法区)中。
而在这个情况下,JVM也会使用类加载器来加载进程所需要的类。
所以方法区保存了编译后的代码、已被加载的类的信息。

而同时之前说了,方法区的数据是线程共享的,所以需要各个线程访问的静态变量、常量等也理应放在方法区中。
为此,方法区里专门准备了一个常量池用于保存常量。避免常量导致频繁GC影响到程序性能。

2.堆
运行程序时就会创建、保存、销毁对象。那么创建的对象数据,静态的放置在方法区中,而动态声明的对象及其属性则需要一个地方来进行创建、保存、销毁的流程;

而这个地方就是堆。

堆里面放置了各种对象,堆也是JVM里面最大的一块内存区域,也是GC—垃圾回收的主要区域。

堆也分年轻代老年代,那么为什么要这么分呢?

这得从GC的一些原理说起。

顾名思义,新创建的对象会加入年轻代,而当新对象越来越多,把年轻代占满了的时候,就需要进行GC了;此时进行的GC是MinorGC,仅对年轻代进行GC操作。经过多次GC之后还未被清除的对象则会进入老年代。当老年代满了之后再进行FullGC,对年轻代和老年代一起进行清理。

在GC的时候可能会有一个stop the world的情况,即全局停顿,停止所有线程。因为在停止了所有线程的情况下,才不会一边清理对象又一边产生新的对象——停止所有线程就会导致服务器反应变慢。

所以为了减少GC时间,就需要避免每次垃圾回收的时候,都对尽可能少的对象进行GC判定。但又要让无用的对象被GC回收。

那么分割年轻代和老年代就是最好的办法了——既可以通过MinorGC及时清理无用的对象,又可以避免GC时间太长而影响程序运行效率。

年轻代的“Eden”和"Survivor"区其实也是一样的道理,都是基于增加GC效率的想法而做此设计。

讲完了线程共享的数据区域,再来讲一下线程独占的部分

3.程序计数器

那么为什么每个线程都需要程序计数器呢?这就涉及到了CPU的调度了。

线程都是由CPU来进行运算和执行的,而一个进程可能会有多个线程,一个操作系统又会有多个进程。

那么一个操作系统同时有这么多线程在运作,CPU是如何同时操作这么多线程的呢?那是因为CPU有时间片这样一个属性,会有相应的调度算法来在不同的线程中进行调度。由于CPU运算速度很快,所以就算是单核CPU,也可以像是同时运行多个线程一样来让电脑动起来。

所以每个线程需要一个程序计数器来储存当前这个线程到底运行到哪一行代码了。这样CPU进行调度的时候就可以在程序计数器的位置继续执行代码。

那么现在既有调度标识(程序计数器),有具体需要执行的代码(方法区),又有数据的储存地(堆),还需要什么呢?

4.虚拟机栈

由于代码中有着一个又一个的方法,而方法还会套着方法。那么就需要有来控制方法执行顺序的规则,而这就是虚拟机栈。

方法的执行顺序规则其实就是:后执行的方法先执行完毕,这跟栈的结构是一样的,后进先出。所以就用虚拟机栈来控制方法的执行顺序。
虚拟机栈是由栈帧来构成的。每一个栈帧的入栈到出栈,就对应了一个方法从开始运行到运行结束。

那么栈帧是由什么构成的呢?首先有一个局部变量表用来存储局部变量。因为局部变量其实是该方法私有的,别的线程无法进行访问的,随着方法的执行完毕而销毁,一些对象其实并没有必要放入堆中,因为会增加GC压力。所以栈帧里就有了局部变量表,用以存储局部变量,以减少GC压力。

还有就是操作数栈,用以储存并进行变量计算。在方法调别的方法时,经常会出现参数的传递,这也是靠操作数栈来进行的。

5.本地方法栈

那么最后一个部分,本地方法栈的作用。

Java有一些native方法,即用非Java语言编写的,用C或C++等语言编写的,直接对操作系统进行操作的。而这些方法的执行,为了安全,JVM专门使用了本地方法栈来调用这些方法,直接与操作系统进行交互,可以说是Java最底层的方法。

以上便是我自己对于JVM内存结构的一些理解和总结。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值