Java100道面试题

news2025/1/8 13:43:06

1.JVM内存结构

1. 方法区(Method Area)

方法区是JVM内存结构的一部分,用于存放类的相关信息,包括:

  • 类的结构(字段、方法、常量池等)。
  • 字段和方法的描述,如名称、类型、访问修饰符等。
  • 静态变量。
  • Java虚拟机在运行时加载的类的信息。

方法区通常在堆区的外部,与堆区是分开的。因为主要存放的是类的信息和静态数据,所以这一部分数据的生命周期与类本身相同。

2. 堆(Heap)

堆是JVM中用于动态分配内存的区域,是对象和数组的存储区。堆内存是JVM运行过程中最大的内存区域,所有对象实例和数组都是在这个区域中分配的。堆区又可以分为几个部分:

  • 新生代(Young Generation):用于存放新创建的对象,年轻代又可以分为三个部分:Eden空间和两个Survivor空间。新创建的对象首先在Eden区分配,经过垃圾回收后存活下来的对象会被移动到Survivor区。
  • 老年代(Old Generation):用于存放长期存活的对象。经过多次垃圾回收,仍然存活的对象会被转移到老年代。
  • 持久代(PermGen)/元空间(Metaspace):在旧版本的JVM中,方法区使用持久代来存储类元信息。在Java 8及其之后的版本中,持久代被元空间替代,主要用于存储类的元数据,不再属于Java虚拟机的堆内存,而是使用本地内存。
3. 虚拟机栈(VM Stack)

虚拟机栈用于存储局部变量、操作数栈、动态链接等信息。每个线程都有自己的虚拟机栈。栈是先进后出(LIFO)的结构,栈中的每一个栈帧(Stack Frame)对应一个方法的调用。在方法调用时,相关的局部变量、参数值以及方法返回地址等都会被推入栈中,而在方法返回时,栈帧会被弹出。

4. 本地方法栈(Native Method Stack)

本地方法栈用于支持JVM调用本地(Native)方法,类似于虚拟机栈。它存储的是本地方法的栈帧。不同的JVM实现可能会有所不同,但其功能主要是协助执行 Java 与其他语言(如C、C++)交互的本地方法。

5. 程序计数器(Program Counter Register)

程序计数器是一个较小的内存区域,保存着当前线程所执行的字节码的地址。它是线程私有的,每个线程都有一个程序计数器,以便在多线程环境中跟踪每个线程的执行点。可以理解为一个指针,指向当前正在执行的指令。

2.垃圾回收机制(GC)

垃圾回收算法

垃圾回收算法有多种,常见的有:

  • 标记-清除(Mark-and-Sweep)

    • 该算法分为两个阶段。第一阶段“标记”会遍历所有可达对象并标记它们,第二阶段“清除”会删除没有被标记的对象。尽管这个方法简单有效,但它可能导致内存碎片。
  • 复制(Copying)

    • 该算法将内存分为两个空间(通常称为“From”和“To”区域),在进行垃圾回收时复制所有活跃对象到另一个区域。复制后,原来的区域会被清空。该方法避免了内存碎片,但需要更多内存。
  • 标记-整理(Mark-and-Compact)

    • 该算法与标记-清除结合。首先,它会标记所有可达对象,然后将它们移动到一端,以消除内存碎片,并清理未使用的内存。
  • 分代收集(Generational Collection)

    • 根据对象的生命周期将内存分为若干代(通常为年轻代和老年代)。新创建的对象通常会在年轻代中变化较快,因此通过频繁回收年轻代来提高效率。而老年代中的对象较少变化,因此不需要频繁检查和回收。

JVM的垃圾回收机制:GC,是Java提供的对于内存自动回收的机制。

GC(Garbage Collection)是Java虚拟机(JVM)中的一项重要功能,用于自动管理堆内存中不再使用的对象,释放其占用的内存空间。GC通过标记和回收无效对象来实现内存的回收和释放,以避免内存泄漏和溢出。

        下面是GC的主要工作原理和过程:

        1、对象的标记:GC首先标记出所有活动对象,即仍然被引用或可达的对象。它从一组根对象开始,逐步遍历对象图,将可达的对象标记为活动对象,未标记的对象则被认为是无效的。

        2、垃圾回收:在标记完成后,GC会对未标记的对象进行回收。具体的回收算法可以是不同的,常见的算法包括标记-复制算法、三色标记算法等。

        3、内存压缩和整理:某些垃圾回收算法在回收完对象后,可能会产生内存碎片。为了优化内存使用,GC可能会进行内存压缩和整理操作,使得分配的对象在内存中连续存放,减少内存碎片的影响。

        GC的优点是可以自动管理内存,减少了手动内存管理的复杂性,避免了内存泄漏和溢出的问题。但是,GC也会带来一定的性能开销。因此,在开发Java应用程序时,需要合理配置GC的参数和调整垃圾回收策略,以平衡性能和内存的使用。
 

3.JVM调优的方法?

1. 内存管理调优
  • 堆内存大小设置:可以通过 (初始堆大小)和 (最大堆大小)参数来设置堆内存的大小。例如:。根据应用程序的需求来调整堆的大小。-Xms-Xmx-Xms512m -Xmx2048m

  • 选择合适的垃圾回收器:不同的垃圾回收器适用于不同的场景,例如:

    • G1垃圾回收器():适合大堆内存和低延迟的应用。-XX:+UseG1GC
    • Parallel垃圾回收器():适合高吞吐量的应用。-XX:+UseParallelGC
    • CMS垃圾回收器():适合需要最小停顿的应用。-XX:+UseConcMarkSweepGC
    • ZGC和Shenandoah:适合需要极低延迟的应用,但需要JVM版本支持。
  • 调整新生代和老年代的比例:可以通过 或 参数来调整新生代与老年代的比例,以优化对象的存活率和垃圾回收频率。-XX:NewRatio-XX:SurvivorRatio

2. 垃圾回收调优
  • 影响GC频率和停顿时间的参数

    • -XX:MaxGCPauseMillis:设置最大GC停顿时间。GC会尝试满足这个时间限制。
    • -XX:GCTimeRatio:调整应用可用时间与GC时间的比例。
  • 监控和分析:使用JVM提供的工具(如JVisualVM、JConsole、GC日志)来监控和分析垃圾回收的情况,识别GC问题。

3. JIT编译优化
  • 开启Tiered Compilation:使用,可以提高启动性能。-XX:+TieredCompilation

  • 调整JIT编译行为:通过设置编译阈值,以控制何时将方法编译为机器代码。-XX:CompileThreshold

4. 线程调优
  • 线程栈大小:可以用参数设置每个线程的栈大小。例如:。适当调整以减少栈溢出和内存使用。-Xss-Xss1m

  • 线程池管理:如果应用使用线程池,确保合理配置线程数,避免因过多线程上下文切换引起的性能问题。

5. 其他优化选项
  • 类加载与内存优化

    • 使用 可保持对象引用的压缩,有助于减少堆内存的使用。-XX:+UseCompressedOops
  • 禁用或调整assertions:在生产环境中,可以禁用不必要的断言以提高性能:。-da

6. 性能监控与分析
  • 使用JVM监控工具:如Java Mission Control(JMC)和Flight Recorder来分析应用性能,查找瓶颈。

  • Profiling:使用工具(如YourKit、VisualVM等)进行代码剖析,找到性能开销较大的热点代码。

7. 配置文件与启动参数
  • 合理配置启动参数:根据具体的应用场景和服务器配置调整JVM的启动参数,比如开启JIT、选择合适的GC、调整堆内存大小等。

4.堆和栈的区别?

1. 结构和用途:
  • 栈(Stack)

    • 栈是一种先进后出(LIFO, Last In First Out)的数据结构。
    • 用于存储局部变量、函数参数和函数调用信息等。在函数调用时,函数的局部变量会压入栈中,函数返回时会将这些变量从栈中弹出。
    • 每个线程都有自己的栈,用于跟踪函数调用和局部变量。
  • 堆(Heap)

    • 堆是一种基于动态存储分配的内存区域,没有特定的结构(可以认为是自由存储区)。
    • 用于存储动态分配的对象和数据,如使用 关键字在C++中分配的对象,或在Java中创建的对象。new
    • 堆内存可以由程序员直接管理,程序员需要手动申请和释放内存,或者由垃圾回收机制(如Java、C#)自动管理。
2. 存储管理:
    • 存储在栈内存中的数据管理简单,入栈和出栈操作的时间复杂度都是O(1)。
    • 由于栈的大小是固定的(通常由操作系统限定),栈溢出(Stack Overflow)可能导致程序崩溃。
    • 堆内存的大小通常只受到系统内存的限制,算法的复杂性和速度依赖于内存分配和回收的实现。
    • 堆内存分配需要更多的时间,且容易出现内存泄漏或内存碎片问题。
3. 生命周期:
    • 数据的生命周期由函数调用决定。函数结束后,栈上的数据会自动释放。
    • 数据的生命周期由程序员控制,只有在不再需要对象时,才能显式地释放空间。如果没有释放,则会造成内存泄漏。
4. 访问速度:
    • 由于其结构简单,内存访问速度较快,通常会比堆更快。
    • 由于堆内存的管理要复杂得多,非顺序访问可能导致较慢的访问速度。

5.JVM使用命令

jvm 的一些命令_jvm命令-CSDN博客

jinfo 

描述:输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm 命令行标记等。

jstat

jstat -gcutil <pid> <interval>

查看java进程的gc情况

以百分比显示每个区域的内存使用情况;

参数interval表示每多少毫秒刷新一次

6.class.forName和Classload的区别

1.相同点
两者都可以对类进行加载。
对于任意一个类/对象,我们都能够通过反射能够调用这个类的所有属性方法。

2.不同点
抽象类ClassLoader中实现的方法loadClass,loadClass只是加载,不会解析更不会初始化所反射的类。常用于做懒加载,提高加载速度,使用的时候再通过.newInstance()真正去初始化类。 

7.谈谈JDK1.8特性有哪些

Lambda表达式 类似于ES6中的箭头函数
接口的默认方法和静态方法
新增方法引用格式
新增Stream类
新的日期API,Datetime,更方便对日期的操作
引入Optional,在SpringData中使用较多,然后再通过get获取值,主要用于防止NPE。
支持Base64
注解相关的改变
支持并行(parallel)数组
对并发类(Concurrency)的扩展。
JavaFX。

JDK1.8常用新特性_jdk1.8的新特性-CSDN博客

8.反射获取类中的所有方法和获取类中的所有属性

9.懒汉和饿汉模式的区别?口述两种模式。 

在饿汉式单例模式中,“饿” 体现的是一种急切的状态。就好像一个很饿的人,在看到食物(这里类比于单例对象)的时候,会迫不及待地先把食物拿到手(创建单例对象)。在这个模式下,单例对象在类加载阶段就被创建出来,而不是等到真正需要使用这个对象的时候才去创建。这种方式比较急切,所以被称为 “饿汉模式”。

在懒汉模式下,实例在第一次使用时才进行创建,因此称为“懒汉”,在需要被用的时候被创建,突出一个字“懒”

10.如何保证单例模式在多线程中的线程安全

私有构造函数:通过将构造函数设置为私有,我们禁止了外部类直接实例化Singleton类。这确保了只能通过getInstance()方法来获取实例。

volatile关键字:volatile关键字确保了instance变量的可见性。当一个线程修改了一个volatile变量的值时,其他线程能够立即看到这个变化。这样可以避免线程之间的缓存不一致问题。

双重检查锁定(Double-Checked Locking):为了减少同步开销,我们在第一次检查instance是否为空后,才进入同步块。这是因为大多数情况下,实例已经被创建,不需要进入同步块。只有在第一次创建实例时才会需要同步。

同步块:在同步块内部,我们再次检查instance是否为空,以确保只有一个线程能够创建实例。这是为了防止多个线程同时通过了第一个空检查并尝试创建多个实例。

11.spring运用了什么设计模式?讲一下哪些部分运用到了这些设计模式

12.说说你都知道哪些设计模式?最常用的有哪些?总共有几种设计模式?

13.redis可以储存哪几种数据类型?你的项目里都用redis存储哪些数据

14.redis有哪些常用操作?(命令)

15.redis缓存和数据库怎么保持一致?

16.redis可以持久化么?如何持久化?

17.redis分布式锁怎么使用?

18.redis缓存数据丢失怎么使用?

19.redis如果崩溃了如何快速恢复?

20.redis是如何部署的?是单个部署还是集群部署?为什么这么做?

21.什么是缓存穿透、缓存击穿、缓存雪崩?如何解决?

22.List和set和map的区别?

23.arrarylist,linkedlist;arraylist内部扩容机制是怎样的?

24.hashmap扩容机制,HashMap的底层原理

25.hashmap的底层用什么储存的?线程是否安全?

26.final和finally和finalize的区别

27.String、StringgBuilder、StringBuffer的区别

28.重写equals已经能比较两个对象了,为什么还要重写hashcode方法

29.基本数据和包装数据类型的区别?

30.社么是多态?举个例子

31.抽象类和接口的区别

32.java中的几种基本类型,各占用多少字节?

33.运行时异常有哪些?

34.对面向对象的理解?面向对象有的特征有哪些?
35.HTTP报文有哪几部分组成?Get/Post有什么区别

36.转发(forward)和重定向(redirect)的区别

37.什么是AOP?什么是IOC/

38.AOP用到什么设计模式

39.SpringBean的生命周期

40.SpringIOC是怎么实现了依赖注入,有几种依赖注入方式?

41.SpringMVC的执行流程

42.SpringMVC与springboot的区别?

43.SpringMVC的事物有过哪几种?怎么处理的?

44.SpringBoot在初始化以前执行一个方法,应该怎么做?初始化以后在执行一个方法应该怎么做,有哪几种方法去做

45.在项目中会经常用到哪些注解?讲出十个

46.@Autowired注入和自己new一个对象有什么区别?

47.myBaties防sql注入的操作

48.Mybaties都要用到哪些标签

49.#和$的区别

50.Mybaties如何实现循环?

51.@Component,@Controller,@Repository,@Service有何区别?

52.SpringBoot中的注解?SpringBoot的核心注解是什么?

53.springBoot要发布一个接口需要几个注解?

54.SpringBoot的运行原理/启动流程?

55.SpringBoot项目启动类上有什么注解?除了常用的还有什么注解?

56.SpringBoot配置文件怎么配?

57.SpringBoot怎么整合MyBatis

58.SpringBoot项目启动时配置文件加载顺序

59.事物的隔离级别

60.事物的七种传播方式

61.过滤器和拦截器的区别?

62.Spring运用了什么设计模式?讲一下哪些部分用到了这些设计模式

63.去重SQL语句怎么写

64.MYSQL大批量数据如何导入

65.mysql如何做大数据量分页

66.mysql索引类型

67.怎么避免索引失效

68.了解过MySQL数据库储存引擎么?

69.讲讲mysql最左匹配原则

70.笛卡尔积是什么

71.脏读、幻读、不可重复读

72.数据库的优化方案?一个SQL语句如何让他搜索变快?你们遇到的数据量最大的表是什么样,有多少条数据。

73.慢日志怎么使用?MYSQL怎么发现动作速度慢的SQL语句?

74.分库分表是怎么做的?数据库分表分库后怎么保证其一致性?

75.MySQL表为何产生死锁?如何避免死锁?

76.oracle与mysql的区别?mysql分页和oracle分页的区别?

77.Mysql默认的事务隔离级别?

78.Mysql的索引的数据结构?

79.Mysql中count()和count(1)区别

80.Sql看执行计划?

81.创建线程的方式及其区别

82.mysq1锁的粒度?并发编程锁到行还是表?(介绍页级、表级、行级)

83.什么是线程和进程?它们之间的区别是什么?

84.请解释一下线程的几种状态以及状态之间的转换关系

85.什么是线程上下文切换?

86.项目中是否用到过多线程?怎么用的?

87.Sleep()和wait()区别?Start()和run()区别?wait,sleep, notify的区别?

88.线程安全指的是什么?如何保障线程安全

89.线程锁有几种方式?使用的关键字?

90.什么是乐观锁和悲观锁?

91.synchronized和]ock的区别。Synchronize关键字修饰方法和修饰代码块的区别

92.如何保证单例模式在多线程中的线程安全性

93.线程池的常见类型石那些?

94.线程池中线程的停止?

95.线程池中的线程数多少合适?

96.线程池一般是自动创建的还是手动?为什么?

97.ReentrantLock和synchronized的别是什么

98.什么是死锁?如何避免死锁?

99.Java 中线程间通信有哪些方式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Python游戏编程入门》注-第9章8

2 游戏信息的显示 在游戏窗口的上部会显示游戏分数、游戏关卡、剩余砖块数以及剩余小球数等信息,如图12所示。 图12 游戏信息显示 使用如图13所示的代码实现以上功能。 图13 显示游戏信息的代码 其中,print_text()函数MyLibrary.

idea插件之 translation翻译插件

文章目录 1. translation翻译插件2. 效果图3. 延伸&#xff08;默认自动配置微软翻译&#xff09; 1. translation翻译插件 Settings 》Plugins 》Translation PS&#xff1a;安装后需要重启idea。 2. 效果图 右键选择插件&#xff0c;或者ctrlshifty 直接翻译代码。 3. 延伸…

Infineon PSoC 4 CapSense ModusToolbox IDE - 系统生态篇

本文档说明了 ModusToolbox 软体环境的 4 个层面&#xff0c;该环境为 CapSense 设备和生态系统提供支援。本文是 Infineon PSoC 4 CapSense ModusToolbox IDE-系统介绍的延伸篇 (Infineon PSoC 4 CapSense ModusToolbox IDE -系统介绍篇 - 大大通(简体站))。 什么是ModusToolb…

PyCharm+RobotFramework框架实现UDS自动化测试——(一)python-can 库的安装与环境配置

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 文章目录 1. 概述2.安装 python-can 库—基于pycharm在对应的工程下3. 在任意盘中安装环境4. 导入 can 模块语法5. 配置 CAN 接口6.CANoe设备连接语法 1. 概述 本专栏主…

springCloud实战

一、Feign的实战 1、使用 1.1步骤 ①引入feign依赖 ②在启动类上加上EnableFeignClients注解&#xff0c;开启Feign客户端 ③编写FeignClient接口 1.2开启feign调用日志 只需在yml配置文件中开启配置即可 feign:client:default:loggerLevel: FULL #feign接口被调用时的…

DINO-X环境搭建推理测试

引子 开放世界检测&#xff0c;前文也写OV-DINO&#xff08;感兴趣的童鞋&#xff0c;请移步OV-DINO开放词检测环境安装与推理-CSDN博客&#xff09;。这不&#xff0c;DINO系列又更新了。OK&#xff0c;那就让我们开始吧。 一、模型介绍 IDEA 开发了一个通用物体提示来支持无…

List ---- 模拟实现LIST功能的发现

目录 listlist概念 list 中的迭代器list迭代器知识const迭代器写法list访问自定义类型 附录代码 list list概念 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素…

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值&#xff0c;并显示在 LCD1602 上&#xff1b; 2. 按键修改阈值&#xff0c;并显示在 LCD1602 上&#xff1b; 3. 烟雾值超过阈值时&#xff0c;蜂鸣器长响&#xff0c;风扇打开&#xff1b;烟雾值小于阈值时&#xff0c;蜂鸣器不响…

VUE3配置后端地址,实现前后端分离及开发、正式环境分离

新建.env.development及.env.production .env.development 指定开发环境地址.env.production 指定生产环境地址 格式如下 VITE_APP_BASE_APIhttp://localhost:8070只需要在对应文件写入对应的后端地址即可 修改env.d.ts /// <reference types"vite/client" /…

win32汇编环境,在窗口程序中画五边形与六边形

;运行效果 ;win32汇编环境,在窗口程序中画五边形与六边形 ;展示五边形与六边形的画法 ;将代码复制进radasm软件里,直接编译可运行.重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>…

Java Web开发进阶——Spring Boot基础

Spring Boot是基于Spring框架的新一代开发框架&#xff0c;旨在通过自动化配置和简化的开发方式提升生产效率。它将复杂的配置抽象化&#xff0c;让开发者专注于业务逻辑实现&#xff0c;而无需关注繁琐的基础配置。 1. Spring Boot简介与优势 Spring Boot 是 Spring 家族中的…

【Linux】文件系统命令

目录 文件系统命令 Linux文件系统 文件操作相关命令 文件系统命令 磁盘文件系统&#xff1a;指本地主机中实际可以访问到的文件系统&#xff0c;包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有&#xff1a;autofs、coda、Ext&#xff08;Extended File…

关于变电站及线路接线情况展示的一些想法

以前总项目的时候总习惯于给变电站画个轮廓和接线点&#xff0c;要不就是给变电站3D建模。费时、费力效果还不一定好!其实&#xff0c;像上图一样线路搭配高清影像效果是不是会更好&#xff1f;尤其变电站区域可以使用航飞0.2米左右的数据&#xff0c;基本上站内设备都能看清了…

【OceanBase】使用 Superset 连接 OceanBase 数据库并进行数据可视化分析

文章目录 前言一、前提条件二、操作步骤2.1 准备云主机实例2.2 安装docker-compose2.3 使用docker-compose安装Superset2.3.1 克隆 Superset 的 GitHub 存储库2.3.2 通过 Docker Compose 启动 Superset 2.4 开通 OB Cloud 云数据库2.5 获取连接串2.6 使用 Superset 连接 OceanB…

开源平台Kubernetes的优势是什么?

Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于希腊语&#xff0c;意…

“大数据+职业本科”:VR虚拟仿真实训室的发展前景

在新时代背景下&#xff0c;随着科技的飞速进步和产业结构的不断升级&#xff0c;职业教育正迎来前所未有的变革。“大数据职业本科”的新型教育模式&#xff0c;结合VR&#xff08;虚拟现实&#xff09;技术的广泛应用&#xff0c;为实训教学开辟了崭新的道路&#xff0c;尤其…

flask实现国外大学生志愿者管理服务系统【英文】

完整源码项目包获取→点击文章末尾名片&#xff01;

lambda用法及其原理

目录 lambda形式lambda用法1.sort降序2.swap3.捕捉列表 习题解题 lambda形式 [capture-list](parameters)->return type{function boby}[capture-list]&#xff1a;[捕捉列表]用于捕捉函数外的参数&#xff0c;可以为空&#xff0c;但不能省略&#xff1b;(parameters) &am…

Street Surf 的学习

数据结构和组织 定义了一个 scenebank 的 数据结构。 这篇文章定义了两种 采样 方式&#xff1a; JointFramePixelDataset 【任意帧中选择任意的 Pixel】PixelDataset [从固定的帧中选择任意的Pixel]ImagePatchDataset [基于image patch 的采样方式&#xff0c;可以用于 mono…

IP查询于访问控制保护你我安全

IP地址查询 查询方法&#xff1a; 命令行工具&#xff1a; ①在Windows系统中&#xff0c;我们可以使用命令提示符&#xff08;WINR&#xff09;查询IP地址&#xff0c;在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息&#xff1b; ②在Linux系统中&…