Java进阶常见面试题整理

JVM 虚拟机

JVM加载类机制

  • JVM类加载分为五个阶段:加载->验证->准备->解析->初始化 (->使用->卸载)。
  • JVM提供了3种类加载器:启动类加载器、扩展类加载器和应用类加载器。
  • 双亲委派机制核心:保障类的唯一性和安全性。
  • 打破双亲委派机制:自定义加载器继承ClassLoader类,重写loadclass方法和findclass方法。
  • 双亲委派类加载机制的类加载流程:

    

JVM中一次完整的GC流程是怎样的

  • 当创建一个新对象时,就需要为该对象申请内存空间。
  • 首先会判断Eden区是否有内存空间,如果此时有内存空间,则直接将新对象保存在Eden区
  • 但是如果此时Eden区的内存空间不足,那么会自动执行一个Minor GC操作,清理之后会继续判断Eden区的内存空间是否充足,如果内存空间充足,则在Eden区进行新对象的空间分配。
  • 如果执行了Minor GC之后发现Eden区的内存依然不足,那么这个时候会进行Survivor区判断,如果Survivor区有剩余空间,则将Eden区的部分活跃对象保存在Survivor区。随后继续判断Eden区的内存空间是否充足,如果充足,则在Eden区进行新对象的空间分配。
  • 如果此时Survivor区也已经没有内存空间了,则继续判断老年区,如果此时老年区空间充足,则将存活区中的活跃对象保存到老年代,而后Survivor区就会存现有空余空间,随后Eden区将活跃对象保存在Survivor区之中,而后在Eden区进行新对象的空间分配。
  • 如果这个时候老年代也满了,那么这个时候将产生Major GC(Full GC),进行老年代的内存清理。
  • 如果老年代执行了Full GC之后发现依然无法进行对象的保存,就会产生OOM异常“OutOfMemoryError”。

什么时候触发Full GC

  • 老年代空间不足(碎片,或者分配不足)。
  • 在执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足(concurrent mode failure)。
  • minor GC后晋升到老年代的平均大小大于老年代的空间。
  • 主动触发Full GC(System.gc() || jmap -histo:live [pid]) 来避免碎片问题。

JVM内存泄漏

  • 产生原因:持有对象的强引用,且没有及时释放,进而造成内存单元一直被占用。
  • 解决:提高程序的健壮型,因为内存泄露是纯代码层面的问题。
  • 和内存溢出的联系:1.内存泄露会最终会导致内存溢出。2.内存泄露可以通过完善代码来避免,内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。

当出现内存溢出,怎么排错

  • 产生原因:JVM内存过小、程序不严密,产生过多的垃圾。
  • 首先控制台查看错误日志。
  • 然后使用jdk自带的jvisualvm工具查看系统的堆栈日志。
  • 定位出内存溢出的空间:堆,栈还是永久代(jdk8以后不会出现永久代的内存溢出)。
  • 如果是堆内存溢出,看是否创建了超大的对象。
  • 如果是栈内存溢出,看是否创建了超大的对象,或者产生了死循环。

Tomcat

Tomcat性能调优

  • Tomcat调优主要从四个方面考虑:1.吞吐量、2.Responsetime、3.Cpuload、4.MemoryUsage。
  • JVM调优

MySQL中存储引擎

  • MyISAM存储引擎:MyISAM基于ISAM存储引擎的扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
  • InnoDB存储引擎:InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。
  • 区别:
  • 一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。
  • 二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

三个范式是什么

  • 第一范式:字段是最小的的单元不可再分。
  • 第二范式:满足第一范式,表中的字段必须完全依赖于全部主键而非部分主键。
  • 第三范式:满足第二范式,非主键外的所有字段必须互不依赖。

简单说一说drop、delete与truncate的区别

  • Delete用来删除表的全部或者一部分数据行,执
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java开发常见面试题是面试中经常会被问到的问题。这些问题通常涵盖Java语言的基础知识、面向对象编程、集合框架、多线程、异常处理、IO操作、数据库等方面。以下是一些可能被问到的Java开发常见面试题的例子: 1. 什么是Java虚拟机(JVM)?它的作用是什么? 2. 什么是面向对象编程(OOP)?Java中的类和对象有什么区别? 3. Java中的集合框架有哪些?分别介绍一下它们的特点和用途。 4. 什么是多线程?Java中如何创建和管理线程?如何实现线程间的通信? 5. 什么是异常处理?Java中的异常分类是什么?如何处理异常? 6. Java中的IO操作有哪些?分别介绍一下它们的特点和用途。 7. 如何连接和操作数据库?介绍一下JDBC的基本用法。 8. 什么是Java的反射机制?如何使用反射实现动态加载类和调用方法? 9. 什么是Java的注解(Annotation)?如何自定义注解? 10. 什么是Java的设计模式?列举一些常见的设计模式及其应用场景。 以上只是一些常见Java开发面试题的例子,面试时可能还会有其他问题涉及到更深入的知识。建议在面试前充分准备,熟悉Java语言的基础知识和常用的开发技术,以便能够给出清晰且准确的答案。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java面试题大全带答案 110道(持续更新)](https://blog.csdn.net/u012889902/article/details/121614968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值