Java面试题中高级进阶(JVM篇Java内存)

news/2025/1/15 17:23:03/文章来源:https://www.cnblogs.com/xswz/p/18519048

前言

本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Java内存结构?说说对象分配规则?描述一下JVM加载class文件的原理机制?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘

*** 12万字的java面试题整理 ***

Java内存结构

方法区和堆是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。

  • Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内
    存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
  • 方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  • 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。
  • JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
  • 本地方法栈(Native Method Stacks),本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

说说对象分配规则

  • 对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。
  • 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
  • 动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
  • 空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

描述一下JVM加载class文件的原理机制?

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。
加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。
最后JVM对类进行初始化,包括:
1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
2)如果类中存在初始化语句,就依次执行这些初始化语句。 类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。
从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。
类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明

  • Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
  • Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
  • System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824887.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222409 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1 本周学习内容 1.1.1 后门工具使用 * Netcat: 用于端口探测、局域网通信、文件传输,以及正向和反向连接的测试。 * Meterpreter: 作为Metasploit框架中的载荷模块,常用于溢出攻击成功后的控制会话,提供持久化的控制通道。 * Veil-Evasion: Linux平台上的免杀工…

VMwareWorkstation pro 17安装Win11(亲测好用)

1、安装包我用夸克网盘分享了「Win11_23H2_China_GGK_Chinese_Simplified_x64v2.iso」,点击链接即可保存。打开「夸克APP」: 链接:https://pan.quark.cn/s/817ccfc90f29 提取码:pPn1 2、安装教程(基于WMware workstation pro 17) 1) 打开WMware Workstation,点击创…

论文速读记录 - 202410

秋意浓,看几篇论文解解乏吧~坚持看论文不容易啊,十月也是多事之秋。看的论文有点少,也有点散,还是要专注一些具体的方向,梳理脉络,整理方案,才是看论文找解决方案的正确思路。 以后的每篇论文解读的后面,会附带一点个人看法/评论,如有冒犯还请见谅。 目录:LATE CHUNK…

现场可编程逻辑门阵列(FPGA)可应用的领域有哪些

现场可编程逻辑门阵列(FPGA)是一种能够根据需求现场编程的集成电路,能提供灵活的硬件解决方案。FPGA可应用的领域有信号处理、通信系统、工业自动化、医疗设备、军事与航空、金融计算、图像处理和视频分析等。其中,在信号处理方面,FPGA可以执行复杂的并行计算,用于滤波和…

NOIP2023 做题笔记

NOIP将近,由于我实力太菜,所以只能写写真题提升自己了。 P9868 [NOIP2023] 词典 简单字符串题,注意到可以换无限次,所以直接处理出每个字符串中最小的字符数和最大字符数就行了。#include<bits/stdc++.h> #define mxn 3010 using namespace std; char s[mxn][mxn]; i…

Windows 多次制作母盘,备份文件变大的问题

公司产品基于Win11 23H2镜像版本制作母盘,我们发现随着版本迭代,基于上一版本母盘生成新母盘备份,母盘文件会越来越大。 此处说明下镜像与母盘文件的区别, 1. 镜像是指操作系统的压缩文件,常见格式是ISO、WIM、ESD,用于安装,有灵活的安装部署选项。 2. 母盘文件是指在某…

怎么利用hadoop搭建自己的云计算

我们为了能够更加方便来识别主机,我们使用主机名而不是使用IP地址,以免多处配置带来更多的麻烦。把hd-master、hd-node1、hd-node2三台虚拟机服务器中的主机名(hostname)分别更改为master、node1、node2。一、怎么利用hadoop搭建自己的云计算 (1) 我们为了能够更加方便来识…

28 计算机网络

两台机器连接就构成的网络 计算机近距离构成的网络叫做局域网,lan;一根电缆连接几台电脑,相互之间通过电缆传输信息。最著名是以太网技术。 一台上传,其余都可以在电缆里收到。为了避免接受无意义信息,每台电脑前加一个

Phonegap和Titanium用作移动开发,各有哪些优缺点

Phonegap和Titanium都是流行的移动开发框架,各自具有独特的优缺点。1、Phonegap:优点包括易学习、跨平台兼容、社区支持丰富;缺点有性能限制、原生功能限制。2、Titanium:优点涵盖了原生体验、强大的性能、大量的自定义选项;缺点则是学习曲线较陡、社区支持有限。例如,Ph…

DBeaver如何插入一行新数据或者复制一行新数据,真方便

前言 我们在使用DBeaver时,经常是需要操作数据库表的,比如新加一行数据等。DBeaver给我们提供了快速的操作方法,今天就来介绍下。 如何插入新数据 首先,我们选中要插入数据的那个位置,就是要选中一行数据。然后,我们点击下面的这两个按钮,其中一个按钮是新增一行,一个按…

二叉树的递归遍历

二叉树的递归遍历(前、中、后序)二叉树的递归遍历 题目链接: 前序遍历: LeetCode 144 中序遍历: LeetCode 94 后序遍历: LeetCode 145 描述 给你二叉树的根节点 root ,返回它节点值的 前序 、 中序 、 后序 遍历。示例1:前序遍历输入:root = [1,null,2,3] 输出:[1,2,3]示…

靈機 AI 解夢:傳統周公解夢的現代升級

# 靈機AI解夢:傳統周公解夢的現代升級在人類文化的長河中,夢一直是一個充滿神秘色彩的領域。人們對夢的解讀和探索從未停止,從古老的周公解夢到現代的各種解夢理論和方法,都反映了人類對潛意識世界的好奇與渴望。靈機AI解夢平台的出現,為解夢領域帶來了新的活力和可能,與…