茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!

愿你在未来的日子,保持热爱,奔赴山海!

每日三道面试题,成就更好自我

昨天既然你有讲到字符串常量池是吧,那这样吧

1. 你可以讲下JVM的运行时数据区或者说内存结构吗?

我们可以分为线程私有和线程共享的两种情况

线程私有:程序计数器,本地方法栈,虚拟机栈

线程共享:堆和方法区

  • 程序计数器:它占用了很小的一块内存空间,记录的是我们当前线程的一个执行的行数。因为线程它可能不断的切换,如何保证到当前线程时,它执行到哪里呢,就是靠程序计数器来实现的。该内 存区域是唯一一个 Java 虚拟机规范没有规定任何 OOM 情况的区域。

  • 虚拟机栈:当jvm执行方法时,会在此区域创建栈帧入栈,它存储方法的各种信息比如局部变量表,操作数栈,动态连接,方法放回地址这些信息。

  • 本地方法栈:它也虚拟机栈类似,但是它主要为native方法服务,例如java需要使用c语言的接口服务时。

  • 堆: 也叫 Java 堆或者是 GC 堆,它是一个线程共享的内存区域,也是 JVM 中占用内存最大的一块区域,几乎所有对象都储存在这里分配内存,也是垃圾回收期主要的管理区域。

  • 方法区:存储一些被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码等数据。

不错不错,JVM都有了解,那再问你一点吧。

2. 类加载过程

系统加载Class类型文件的主要步骤有加载-->连接--> 初始化,连接又可以分为验证-->准备-->解析

  • 加载:根据类的全限定名来获取类的二进制字节流,在内存中生成一个代表该类的Class对象
  • 验证:主要验证检查class文件的正确性,比如文件格式,元数据,字节码,符号引用的验证。
  • 准备:主要就是为类变量分配内存并设置类变量初始的一个阶段。
  • 解析:虚拟机将常量池内的符号引用替换成直接引用的一个过程。
  • 初始化:它是类加载的最后一步,就是真正执行类中定义的Java程序代码的过程。

可以,那问你最后一道:

3. 而其中类加载器是什么,那有哪些呢?

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。而类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。

主要有一下四种类加载器:

  • 启动类加载器(BootstrapClassLoader)用来加载java核心类库,无法被java程序直接引用。
  • 扩展类加载器(ExtensionClassLoader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 应用程序类加载器(ApplicationClassLoader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。
  • 用户自定义类加载器,我们可以自行去通过继承 java.lang.ClassLoader类的方式实现。

而对于一个类加载的过程中,如果一个类加载器收到类加载的请求的时候,它首先不会自己去加载这个类,而是把这个请求委派给自己的父类加载器去完成,一直到顶层的启动类加载器时,只有当父加载无法完成这一加载请求时,就会往下一层一层的尝试去加载类。这种模式就是双亲委派模式,这中模式的好处可以使类有了层次划分,也保障安全。

小伙子不错嘛!今天就到这里,期待你明天的到来,希望能让我继续保持惊喜!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!也可以微信搜索太子爷哪吒公众号私聊我,感谢各位大佬!

每日三道面试题,通往自由的道路4——JVM篇的更多相关文章

  1. 每日三道面试题,通往自由的道路6——JVM

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们继续聊聊JVM的话题吧! 1. 那你知 ...

  2. 每日三道面试题,通往自由的道路5——JVM

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然我们聊到了JVM,那我们继续这一个话题 ...

  3. 每日三道面试题,通往自由的道路10——JMM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们还是继续聊聊多线程的一些其他话题吧! ...

  4. 每日三道面试题,通往自由的道路13——锁+Volatile

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 我们既然聊到了并发多线程的问题,怎么能少得了锁 ...

  5. 每日三道面试题,通往自由的道路14——MySQL

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天我们是不是聊到了锁,而你提到了MySQL? ...

  6. 每日微软面试题——day 6(打印所有对称子串)

    每日微软面试题——day 6(打印所有对称子串) 分类: 2.数据结构与算法2011-08-14 14:27 9595人阅读 评论(15) 收藏 举报 面试微软string测试systemdistan ...

  7. 基于JDK1.8的JVM 内存结构【JVM篇三】

    目录 1.内存结构还是运行时数据区? 2.运行时数据区 3.线程共享:Java堆.方法区 4.线程私有:程序计数器.Java 虚拟机栈.本地方法栈 5.JVM 内存结构总结 在我的上一篇文章别翻了,这 ...

  8. 面试总结——JVM篇

    前言:该篇主要对Java虚拟机相关的题目进行介绍. JVM篇 基本上在面试的时候,都会或多或少的涉及JVM,主要看面试官的侧重点,笔者在面试过程中,是通过volatile问题,引导了JVM相关问题上的 ...

  9. 三道JS试题(遍历、创建对象、URL解析)

    最近在网上看到了三道不错的JS试题,还是很基础(一直认为学好前端基本功很重要...),现在记录如下: 原帖地址:http://www.w3cfuns.com/forum.php?mod=viewthr ...

随机推荐

  1. Java 并发编程(一) → LockSupport 详解

    开心一刻 今天突然收到花呗推送的消息,说下个月 9 号需要还款多少钱 我就纳了闷了,我很长时间没用花呗了,怎么会欠花呗钱? 后面我一想,儿子这几天玩了我手机,是不是他偷摸用了我的花呗 于是我找到儿子问 ...

  2. eth-trunk

    ------------恢复内容开始------------ 1.eth-trunk 是什么 *链路 聚合技术 2.做什么用的 *作为一种链路捆绑技术,可以把多个独立物理接口绑定在一起,作为一个大带宽 ...

  3. docker 的常见命令行解析

    1.查看本地镜像 sudo docker images 2.查看本地容器 sudo docker ps 3.根据Dockerfile制作镜像命令 sudo docker build -t Myimag ...

  4. VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置

    VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置~~ 想必很多人和我一样,想用vscode编程c++,easyx库不支持MinGW,一般人都是直接使用vs2019安装e ...

  5. Scanner, BufferedReader, InputStreamReader 与ACM模式输入

    Scanner, BufferedReader, InputStreamReader 与ACM模式输入html { -webkit-print-color-adjust: exact } * { bo ...

  6. [bug] flink on yarn 启动失败

    参考 https://www.cnblogs.com/huangguoming/p/11732663.html

  7. XRDP freerdp

    服务器上 freerdp 桌面上有XRDP

  8. shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...

  9. Linux服务之nginx服务篇二(搭建)

    一.简易搭建安装步骤 0.检查环境 1.配置yum源 使用yum list nginx 检查yum源中是否有nginx安装包 #官方网络源需要安装epel-* #或使用251的adv源(老师的yum源 ...

  10. STM32定时器配置

    void TIM1_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDe ...