SuperJava|JVM与类加载器

SuperJava 专栏收录该内容
12 篇文章 0 订阅

@[FAT-Remcal|Coding诗酒醉年华]

关于软件与硬件交互的技术知识,能够解释清楚的文章似乎极少,这篇文章同样不能满足各位的需求,仅仅作为学习过程的一个记录,并且我感觉很多程序员对JVM的认识程度大致都在这个水平,似乎遇到了瓶颈。

此文不打算论述太多文字,而主要用图示代替文字,读者可自行会意。

JMV操作内存工作逻辑结构示意

注意两个隐含的关键信息:进程,线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

基本概念补充

1 随着历史发展,JVM产生了很多种,我们平时讲的JVM一般是讲的 HotSpot VM,Sun公司产品,但是他也是1997年收购的Longview Technologies公司的产品;

2 栈的全称叫做“方法栈”,所以局部变量在此栈中,方法中定义的变量叫做局部变量,这样就理解了;

3 注意区分指令和控制流的概念;

4 计数器的概念,与线程绑定的,专门记录当前CPU时间片线程执行的位置;

5 空栈意味着线程结束,空间销毁;

6 方法不占用内存,堆里的数据占用内存;

7 本地(native)方法栈的方法,不是Java实现的,而是c/c++实现的,native直接操作计算机内存,绕过了JVM;

8 JVM方法区又叫做静态数据区、静态方法区;

9 方法区通常被划分在堆内存中,但是它的别名叫做Non-Heap,所以这只是为了方便理解而进行的逻辑划分,从硬件物理结构上来看二者看不出区别;

10 栈帧是栈的最小空间单位,一个方法对应一个栈帧,所以方法重复使用很多栈帧(比如递归方法);
在这里插入图片描述

11 main方法程序第一行时是创建栈帧空间,做准备工作,此时还没有放入任何数据;

12 只把类信息(类信息都是静态的)放入元空间(Metaspace),元空间取缔了JVM内存永久区。

类加载器

在这里插入图片描述
在这里插入图片描述

JMV经常困扰程序员的问题

1 虚拟机是一个软件吗?一个能转换字节码为机器语言的软件?
答:是的,具体的体现形式就是一个软件,在JRE文件夹中可以找到一个.jar程序。

2 Java虚拟机内存和计算机内存是一回事吗?结合硬件来看,虚拟机是如何与计算机内存和CPU进行交互的?
答:基本是一回事,Java虚拟机内存就是在计算机内存中架设的,但是我们一般说“Java虚拟机内存”是站在逻辑概念的角度来说,而计算机内存则偏向于结合硬件。Java程序不是直接访问操作计算机内存,是通过JVM间接操作计算机内存,中间控制一下,降低直接操控带来的风险,但是C语言和C++是直接操作计算机内存的。

3 JVM只有在运行期才会启动吗?在编译期间类加载器做了什么?
答:虚拟机都是运行期启动,编译期和它没关系,编译器生成了.class文件准备给JVM在运行期使用。

4 虚拟机启动后,就开始把自己需要的内存空间按照自己需要的方式在计算机内存上部署了吗?
答:不是一开始规划部署好了一整块空间,是随着程序指令执行而动态进行空间部署的,但是一个项目对应一个进程(多个线程),一个进程中内存空间是相对独立的。

5 堆栈内存的容量上限是多少?
答:即计算机物理内存容量,在虚拟机启动时监控一下内存使用状况即可。

6 堆的最小单位是什么?
答:栈的最小空间单位是栈帧,堆的最小存储单位是对象,当加载.class文件到内存中,对应生成Class类的对象。


(完)

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值