2024年JVM面试题系列:new String(“abc“)创建了几个对象,mysql面试题索引

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

  • 算法与编程

  • 数据库部分

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 方法执行后,有两种方式退出该方法:正常调用完成,执行返回指令。异常调用完成,遇到未捕获异常,不会有方法返回值给调用者。

本地方法栈

本地方法栈与虚拟机栈所发挥的作用是相似的,当线程调用Java方法时,会创建一个栈帧并压入虚拟机栈;而调用本地方法时,虚拟机会保持栈不变,不会压入新的栈帧,虚拟机只是简单的动态链接并直接调用指定的本地方法,使用的是某种本地方法栈。比如某个虚拟机实现的本地方法接口是使用C连接模型,那么它的本地方法栈就是C栈。

本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,它可以做任何他想做的事情,本地方法不受虚拟机控制。

程序计数器

每一个运行的线程都会有它的程序计数器(PC寄存器),与线程的生命周期一样。执行某个方法时,PC寄存器的内容总是下一条将被执行的地址,这个地址可以是一个本地指针,也可以是在方法字节码中相对于该方法起始指令的偏移量。如果该线程正在执行一个本地方法,那么此时PC寄存器的值是 undefined。

程序计数器是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。多线程环境下,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。

代码在JVM内存中的体现


当我们通过Object o=new Object()创建一个对象时,在JVM中会分配一块内存用来存储该对象的信息,实现原理如下图所示。

图片

在main方法中,创建了一个局部变量o,当main方法运行时,首先会把main方法压入到栈帧中,接着执行该方法的Object o =new Object()创建对象。

  1. 在局部变量表中创建一个局部变量o

  2. 在堆内存中分配一块内存地址,用来存储object对象。

  3. 变量o指向堆内存中的内存地址。

我们再来看一个例子,声明一个Person对象,在该对象中存在一个常量name、以及一个成员变量age,当运行该类中的main方法时,此时JVM内存中的运行情况如下。

图片

在这个例子中,看到了常量池的出现,看来,还有必要了解一下常量池的知识

JVM中的常量池


在JVM中,常量池主要分为:Class文件常量池运行时常量池,当然还有全局字符串常量池,以及基本类型包装类对象常量池

常量池主要存放两大类常量:字面量和符号引用。

  • 字面量:字面量主要是文本字符串、final 常量值、类名和方法名的常量等。

  • 符号引用:符号引用对java动态连接起着非常重要的作用。主要的符号引用有:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。

Class文件常量池

class文件是一组以8位字节为单位的二进制数据流,在java代码的编译期间,我们编写的.java文件就被编译为.class文件格式的二进制数据存放在磁盘中,其中就包括class文件常量池

为了更好的说明,我们通过下面这段代码为例进行讲解。

class ConstantExample{

private int value = 1;

public String s = “abc”;

public final static int f = 0x101;

public void setValue(int v){

final int temp = 3;

this.value = temp + v;

}

public int getValue(){

return value;

}

}

这段代码被编译后,通过javap -v命令查看编译后的字节码。

从下面这个字节码信息中可以看到,执行这个命令之后我们得到了该class文件的版本号、常量池、已经编译后的字节码指令(处于篇幅原因这里省略),下面我们会对照这个class文件来讲解:

example/target/classes/HelloExample.class

Last modified 2021-10-25; size 734 bytes

MD5 checksum fd06c1426f4fdef12aa109ee7f010a45

Compiled from “HelloExample.java”

public class HelloExample

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #6.#32 // java/lang/Object.“”😦)V

#2 = Fieldref #5.#33 // HelloExample.value:I

#3 = String #34 // abc

#4 = Fieldref #5.#35 // HelloExample.s:Ljava/lang/String;

#5 = Class #36 // HelloExample

#6 = Class #37 // java/lang/Object

#7 = Utf8 value

#8 = Utf8 I

#9 = Utf8 s

#10 = Utf8 Ljava/lang/String;

#11 = Utf8 f

#12 = Utf8 ConstantValue

#13 = Integer 257

#14 = Utf8

#15 = Utf8 ()V

#16 = Utf8 Code

#17 = Utf8 LineNumberTable

#18 = Utf8 LocalVariableTable

#19 = Utf8 this

#20 = Utf8 LHelloExample;

#21 = Utf8 getValue

#22 = Utf8 ()I

#23 = Utf8 setValue

#24 = Utf8 (I)V

#25 = Utf8 MethodParameters

#26 = Utf8 main

#27 = Utf8 ([Ljava/lang/String;)V

#28 = Utf8 args

#29 = Utf8 [Ljava/lang/String;

#30 = Utf8 SourceFile

#31 = Utf8 HelloExample.java

#32 = NameAndType #14:#15 // “”😦)V

#33 = NameAndType #7:#8 // value:I

#34 = Utf8 abc

#35 = NameAndType #9:#10 // s:Ljava/lang/String;

#36 = Utf8 HelloExample

#37 = Utf8 java/lang/Object

字面量

字面量接近于java语言层面的常量概念,主要包括:

  • 文本字符串,也就是我们经常声明的:public String s = "abc";中的"abc"

#3 = String #34 // abc

  • 用final修饰的成员变量,包括静态变量实例变量局部变量

#11 = Utf8 f

#12 = Utf8 ConstantValue

#13 = Integer 257

这里需要说明的一点,上面说的存在于常量池的字面量,指的是数据的,也就是abc0x101(257),通过上面对常量池的观察可知这两个字面量是确实存在于常量池的。而对于基本类型数据(甚至是方法中的局部变量),也就是上面的private int value = 1;常量池中只保留了他的的字段描述符I字段的名称value,他们的字面量不会存在于常量池:

符号引用

符号引用主要涉及编译原理方面的概念,包括下面三类常量:

  • 类和接口全限定名,也就是Ljava/lang/String;这样,将类名中原来的".“替换为”/"得到的,主要用于在运行时解析得到类的直接引用.

#5 = Class #36 // HelloExample

#6 = Class #37 // java/lang/Object

  • 字段名称描述符,字段也就是类或者接口中声明的变量,包括类级别变量(static)实例级的变量

#2 = Fieldref #5.#33 // HelloExample.value:I

#7 = Utf8 value

#8 = Utf8 I

运行时常量

运行时常量池是方法区的一部分,所以也是全局共享的。我们知道,jvm在执行某个类的时候,必须经过加载、连接(验证,准备,解析)、初始化,在第一步的加载阶段,虚拟机需要完成下面3件事情:

  • 通过一个类的**“全限定名”来获取此类的二进制字节流**

最后

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

开源分享:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】

程序员代码面试指南 IT名企算法与数据结构题目最优解

这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!

image.png

《TCP-IP协议组(第4版)》

本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。

本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。

image.png

Java开发手册(嵩山版)

这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**

image.png

MySQL 8从入门到精通

本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。

image.png

Spring5高级编程(第5版)

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

image.png

JAVA核心知识点+1000道 互联网Java工程师面试题

image.png

image.png

企业IT架构转型之道 阿里巴巴中台战略思想与架构实战

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

image.png

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

**

[外链图片转存中…(img-ZTAwTo46-1715001418498)]

[外链图片转存中…(img-nXlbUkIY-1715001418499)]

企业IT架构转型之道 阿里巴巴中台战略思想与架构实战

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

[外链图片转存中…(img-2u46o8hx-1715001418499)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值