安徽省建设厅网站人员管理,在线画画,网站域名属于哪里管,qq空间转wordpress1. 类加载与双亲委派机制
聊一下你对类加载器的理解。
类加载器是JVM用来加载类文件到内存的组件。它负责将字节码文件解析为java.lang.Class实例#xff0c;并存储到运行时数据区的方法区中。类加载器分为Bootstrap ClassLoader、Extension ClassLoader和Application ClassLo…1. 类加载与双亲委派机制
聊一下你对类加载器的理解。
类加载器是JVM用来加载类文件到内存的组件。它负责将字节码文件解析为java.lang.Class实例并存储到运行时数据区的方法区中。类加载器分为Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader它们共同构成了类加载的层次结构。2.双亲委派机制是什么它的作用是什么
双亲委派机制是指当一个类加载器加载类时它会先将请求委派给父加载器只有当父加载器无法加载时才会尝试自己加载。它的作用是避免类的重复加载确保类的唯一性并防止用户自定义类覆盖核心类库。3.JVM中类加载器的种类有哪些
Bootstrap ClassLoader加载JVM核心类库如rt.jar由C实现。
Extension ClassLoader加载扩展类库如jre/lib/ext目录下的类。
Application ClassLoader加载应用类路径classpath中的类。
Custom ClassLoader用户自定义类加载器通过继承ClassLoader实现。
如何自定义类加载器
自定义类加载器需要继承ClassLoader类并重写findClass(String name)方法。通常还需要实现loadClass方法来实现双亲委派机制。
示例代码
java
复制
public class MyClassLoader extends ClassLoader {Overrideprotected Class? findClass(String name) throws ClassNotFoundException {byte[] classData loadClassData(name);if (classData null) {throw new ClassNotFoundException();}return defineClass(name, classData, 0, classData.length);}private byte[] loadClassData(String name) {// 加载类文件的字节码// 示例从文件系统加载try {String fileName name.replace(., File.separatorChar) .class;InputStream in new FileInputStream(fileName);ByteArrayOutputStream out new ByteArrayOutputStream();int b;while ((b in.read()) ! -1) {out.write(b);}return out.toByteArray();} catch (IOException e) {e.printStackTrace();}return null;}
}
自定义类加载器时需要注意哪些问题
确保遵循双亲委派机制避免类的重复加载。
注意线程安全问题。
确保加载的字节码符合JVM规范。
避免内存泄漏。4. JVM运行时数据区
JVM运行时数据区有哪些部分组成
堆Heap存储对象实例和数组。
方法区Method Area存储类的结构信息如常量池、字段、方法等。
Java栈Java Stack存储局部变量、操作数栈和方法调用信息。
本地方法栈Native Method Stack支持本地方法的执行。
程序计数器Program Counter Register记录当前线程执行的字节码指令地址。5.Java堆Heap的作用是什么为什么需要分代设计
作用堆是JVM管理内存的主要区域用于存储对象实例和数组。
分代设计为了提高垃圾回收效率堆被分为年轻代和老年代。年轻代存储新创建的对象老年代存储经过多次回收仍然存活的对象。分代设计可以针对不同类型的对象采用不同的回收策略提高回收效率。
方法区、元空间和持久代的关系是什么
方法区JVM规范中定义的区域用于存储类的结构信息。
持久代Permanent GenerationJDK 1.7及之前的实现方法区的物理实现。
元空间MetaspaceJDK 1.8引入的替代持久代的区域使用本地内存避免了持久代的内存溢出问题。
J6.Java栈和本地方法栈的区别是什么
Java栈用于存储Java方法的调用信息如局部变量表、操作数栈等。
本地方法栈用于支持本地方法如JNI调用的执行存储本地方法的调用信息。
程序计数器的作用是什么
程序计数器记录当前线程执行的字节码指令地址。如果当前线程正在执行Java方法则记录字节码指令的地址如果正在执行本地方法则为undefined。程序计数器是线程私有的每个线程都有自己的程序计数器。7. 栈帧结构与动态链接
栈帧的结构是怎样的
栈帧是方法调用的内存模型每个方法调用都会创建一个新的栈帧。栈帧结构包括
局部变量表存储方法参数和局部变量。
操作数栈用于存储操作数和中间结果。
动态链接将常量池中的符号引用转换为直接引用。
方法出口信息记录方法返回地址等信息。8.动态链接的作用是什么
动态链接是指在运行时将常量池中的符号引用转换为直接引用。它允许在运行时解析类、方法和字段的引用从而支持多态和动态绑定。9.如何理解局部变量表和操作数栈
局部变量表存储方法参数和局部变量每个变量占用一个槽slot。局部变量表的大小在编译时确定。
操作数栈用于存储操作数和中间结果。操作数栈的大小也在编译时确定。操作数栈支持栈操作如压栈push和弹栈pop。10. 垃圾回收机制
垃圾回收的触发条件是什么
堆内存不足当堆内存无法分配新对象时触发垃圾回收。
Eden区满在分代收集中当Eden区满时触发Minor GC。
老年代内存不足当老年代内存不足时触发Full GC。
元空间不足当元空间内存不足时也可能触发垃圾回收。11.常见的垃圾回收算法有哪些
标记-清除算法标记活动对象清除未标记的对象。缺点是会产生内存碎片。
标记-整理算法标记活动对象并将活动对象移动到内存的一端整理内存空间。
复制算法将内存分为两块每次只使用一块当一块内存用满时将活动对象复制到另一块内存中。
标记-清除算法和标记-整理算法的区别是什么
标记-清除算法标记活动对象清除未标记的对象。优点是简单缺点是会产生内存碎片。
标记-整理算法标记活动对象并将活动对象移动到内存的一端整理内存空间。优点是减少内存碎片缺点是需要移动对象可能导致性能开销。
分代收集算法的工作原理是什么
分代收集算法将堆分为年轻代和老年代。年轻代使用复制算法老年代使用标记-整理算法或标记-清除算法。年轻代的垃圾回收称为Minor GC老年代的垃圾回收称为Full GC。12.常见的垃圾收集器有哪些它们的优缺点是什么
Serial收集器单线程收集器适合单核处理器。优点是简单高效缺点是会暂停所有线程Stop-The-World。
Parallel收集器多线程收集器适合多核处理器。优点是吞吐量高缺点是会暂停所有线程。
CMS收集器并发标记-清除收集器适合低延迟场景。优点是并发执行减少停顿时间缺点是会产生内存碎片。
G1收集器分区收集器适合大堆内存。优点是分区收集减少停顿时间缺点是配置复杂。
ZGC低延迟垃圾收集器适合超大堆内存。优点是低延迟缺点是资源消耗较高。13.如何选择合适的垃圾收集器
根据应用的场景选择垃圾收集器
如果应用对延迟要求不高可以选择吞吐量优先的收集器如Parallel收集器。
如果应用对延迟要求高可以选择低延迟的收集器如CMS收集器或G1收集器。
如果堆内存较大可以选择分区收集器如G1收集器或ZGC。14.G1垃圾收集器的工作原理是什么如何调优
工作原理G1收集器将堆内存划分为多个大小相等的区域Region分为Eden区、Survivor区和老年代区。G1通过并发标记和分区收集的方式减少停顿时间。
调优
使用-XX:G1HeapRegionSize设置区域大小。
使用-XX:MaxGCPauseMillis设置最大停顿时间目标。
使用-XX:G1NewSizePercent和-XX:G1MaxNewSizePercent调整新生代大小。15.ZGC的特点是什么
低延迟ZGC的目标是将停顿时间控制在10ms以内。
高吞吐量支持大堆内存如TB级。
并发执行大部分垃圾回收工作与应用线程并发执行。
如何判断是否适用G1垃圾收集器
应用堆内存较大如大于4GB。
应用对延迟要求较高。
应用的新生代和老年代对象比例差异较大。16. JVM性能优化
JVM性能优化的常用方法有哪些
调整堆大小根据应用需求调整堆大小-Xms和-Xmx。
选择合适的垃圾收集器根据应用需求选择合适的垃圾收集器。
调整垃圾收集器参数根据应用需求调整垃圾收集器参数如-XX:MaxGCPauseMillis。
减少内存泄漏通过工具如JProfiler、VisualVM检测和修复内存泄漏。
优化代码减少不必要的对象创建和大对象分配。17.如何分析JVM的性能问题
使用JVM监控工具如VisualVM、JProfiler监控JVM的性能指标如堆内存使用情况、垃圾回收频率、线程状态等。
使用jstack、jmap、jstat等命令行工具分析线程堆栈、堆内存和垃圾回收情况。
分析GC日志了解垃圾回收的频率和停顿时间。18.JVM常用命令有哪些它们的作用是什么
jps列出当前Java进程。
jstack打印线程堆栈信息用于分析线程状态和死锁问题。
jmap生成堆转储文件用于分析内存泄漏和内存使用情况。
jstat监控垃圾回收情况如Eden区、Survivor区和老年代的使用情况。
jcmd发送命令到Java进程如触发GC、生成堆转储文件等。