- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
java架构师笔试题(附答案)
一、Java核心基础与JVM
1.简述JVM内存区域划分及各区域的作用,说明哪些区域可能抛出OOM异常。
JVM内存区域分为线程共享区和线程私有区。线程共享区包括堆(Heap)和方法区(MethodArea,JDK8后为元空间Metaspace);线程私有区包括虚拟机栈(VMStack)、本地方法栈(NativeMethodStack)和程序计数器(ProgramCounterRegister)。
-堆:存储对象实例和数组,是GC的主要区域。当对象不断创建且无法被回收时,可能抛出`OutOfMemoryError:Javaheapspace`。
-方法区/元空间:存储类信息、常量、静态变量、即时编译器编译后的代码等。JDK7前常量池在永久代,可能因大量动态生成类(如反射、CGLIB)导致`OutOfMemoryError:PermGenspace`;JDK8后元空间使用本地内存,可能因元数据过多抛出`OutOfMemoryError:Metaspace`。
-虚拟机栈:存储栈帧(局部变量表、操作数栈、动态链接、方法出口等)。每个方法调用对应一个栈帧入栈。若线程请求的栈深度超过虚拟机允许值,抛出`StackOverflowError`;若栈扩展失败(如动态扩展场景),抛出`OutOfMemoryError`(实际中较少见)。
-本地方法栈:与虚拟机栈类似,为本地方法服务,可能抛出`StackOverflowError`或`OutOfMemoryError`。
-程序计数器:记录当前线程执行的字节码行号,是唯一不会抛出OOM的区域。
2.对比G1与ZGC收集器的核心差异,说明各自适用场景。
G1(Garbage-First)和ZGC均为低延迟垃圾收集器,但设计目标和实现机制不同:
-G1:基于分代收集,将堆划分为多个大小相等的Region(通常2MB~32MB),跟踪各Region的回收价值(回收所得空间与时间的比值),优先回收价值高的Region(“Garbage-First”)。支持并发标记,通过RememberedSet(RSet)解决跨Region引用问题。最大停顿时间可通过`-XX:MaxGCPauseMillis`参数设定(默认200ms),适用于大内存(数GB~数十GB)、需要可控停顿的场景(如传统企业级应用)。
-ZGC:基于Region和颜色指针(ColoredPointers)、读屏障(LoadBarrier)技术,堆被划分为小型(2MB)、中型(32MB)、大型(N2MB)Region。颜色指针将对象地址与标记信息(Marked0/Marked1/Remapped)存储在64位指针的高位,避免额外的标记表;读屏障在访问对象时动态修正指针,实现并发整理。ZGC的停顿时间仅与Root集大小相关(通常不超过10ms),支持TB级堆内存(实验支持8TB+),适用于超大型内存、极低延迟要求的场景(如大数据、实时交易系统)。
3.类加载机制中,双亲委派模型的核心逻辑是什么?列举至少2种破坏该模型的场景。
双亲委派模型的核心逻辑是:类加载器收到类加载请求时,先委托给父类加载器尝试加载,父类加载器再继续向上委托,直到启动类加载器(BootstrapClassLoader);若父类加载器无法加载(如有哪些信誉好的足球投注网站范围中无该类),则由当前类加载器自己加载。该机制保证了类的唯一性(如`java.lang.Object`仅由启动类加载器加载),避免多版本冲突。
破坏双亲委派的场景:
-JNDI服务:Java标准库(如`javax.naming.spi`)需要调用第三方厂商实现的类(如数据库驱动),但启动类加载器无法加载第三方类,因此通过线程上下文类加载器(ThreadContextClassLoader)反向委托子类加载器加载。
-OSGi(动态模块化):模块可自定义类加载器,允许同一个类的不同版本共存(如BundleA使用`com.example.util:1.0`,BundleB使用`com.example.util:2.0`),通过自定义加载策略打破双亲委派的层级限制。
-热部署/热加载:如JRebel通过自定义类加载器替换已加载的类,需绕过父类加载器直接加载新版本类。
二、设计模式与代码设计
4.手写线程安全的单例模式(要求懒加载、高性能),并说明双重检查锁定(Double-CheckedLocking)中`volatile`的作用。
线程安全的懒汉式单例模式(双重检查锁定)实现:
```java
publicclassSingleton{
有哪些信誉好的足球投注网站
文档评论(0)