Java:JVM虚拟机的入门知识

电子说

1.3w人已加入

描述

Java开发现在面试越来越难了,进大厂必备的JVM、多线程高并发这都是最基础的知识了,今天我们一起来学习Java虚拟机入门。

运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,主要有这么几个区域,并且对每个区域进行介绍。

JVM

程序计数器

程序计数器(Program Counter Register)它是一块较小的内存空间,它是记录当前线程所执行到的字节码的行号。因为由于Java虚拟机的多线程是通过线程轮流切换、以及分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。为了让线程切换后能够恢复到正常的执行位置,所以每一条线程都有一个独立的程序计数器,这样线程之间计数器互不影响。

JVM

Java虚拟机栈

和程序计数器一样是线程私有,它的生命周期是与线程相同的。Java虚拟机是Java执行方法的内存模型,在每个方法执行时都会同步创建一个栈帧(Stack Frame),主要是用来存储:局部变量表、操作数栈、动态链接、方法出口等信息。

本地方法栈

本地方法栈就是为虚拟机使用到的本地(Native) 方法服务的。

Java堆(Heap)

Java堆是虚拟机所管理的内存中最大的一块,是所有线程共享的一块区域,唯一的目的就是存放对象实例,并且是“几乎”所有的对象的实例都是在“Java堆”分配内存的。

同时Java堆也是垃圾收集器管理的内存区域,也称之为“GC堆”。由于现在基本采用分代回收垃圾器算法,所以Java堆又可以分为:新生代、老年代。

法区

方法区也是线程共享的内存区域,主要存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

很多Java程序员都习惯在 HotSpot虚拟机上开发、部署程序,很多人都更愿意把方法区称呼为“永久代“。到了 JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替了。注意:这区域的内存回收目标主要是针对常量池的回收和对类型的卸载。

补充

运行时常量池:它是方法区的一部分,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。对于初学者想深入JVM虚拟机原理,国内非常不错的深入理解Java虚拟机第三版这本,值得Java程序员看的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分