
面试
王佑辉
个人笔记,多谢指正,不喜勿喷
展开
-
【多线程】线程池如何知道一个线程的任务已经完成
3.当FutureTask的run()方法被调用时,它会执行封装的任务,并在任务完成后更新其内部状态(例如,从NEW状态变为COMPLETED状态)。1.当一个任务被提交给线程池时,它会被封装成一个Runnable或Callable对象,并放入线程池的工作队列中。3.一旦所有任务都完成了,线程池中的工作线程会被终止,并且线程池会释放其占用的资源。3.任务执行完成后,工作线程会更新任务的状态,并可能将结果存储在一个与任务相关联的。2.线程池中的工作线程会从队列中取出任务并执行。原创 2024-11-11 14:06:11 · 677 阅读 · 0 评论 -
【面试】谈谈对AQS的理解
4.AQS还提供了一些模板方法,如tryAcquire、tryRelease等,这些方法允许子类在实现自定义同步器时,根据具体的同步策略进行重写。4.这些锁都是基于AQS实现的,不同的锁通过实现不同的tryAcquire和tryRelease方法来实现不同的同步策略。2.当线程请求访问共享资源时,如果资源空闲,则将线程设置为有效的工作线程,并将资源标记为已占用。3.AQS的使用也具有一定的复杂性,需要开发者对并发编程的原理和Java的线程模型有深入的理解。原创 2024-11-10 19:51:59 · 398 阅读 · 0 评论 -
【redis】延迟双删策略
2.延迟双删策略的核心思想是在更新数据库时,不仅删除一次缓存,还在短时间后再进行一次延迟删除,以避免并发问题导致的数据不一致。3.请求A更新好了数据库,写入了新数据,延迟1秒钟,再删除缓存,可将更新数据库与删除缓存这段时间内的缓存旧数据删掉。2.减少缓存更新压力:相比于每次数据库更新都立即更新缓存,延迟双删避免了频繁的缓存更新请求,降低了缓存服务器的压力。3.第一次删除缓存:在更新数据库之前,先删除对应的缓存,确保缓存中不会存在即将被更新的旧数据。4.后面的请求C获取不到缓存,重新查库中数据,构建新缓存。原创 2024-11-06 21:07:17 · 1404 阅读 · 0 评论 -
【redis】redis缓存和数据库保证一致性的方案
当数据库中的数据发生变化时,应用层需要主动删除或更新Redis中对应的缓存项。这是最常见的做法,因为它可以确保下一次读取时,缓存中的数据是最新的。1.在更新数据库时,先删除Redis缓存,然后更新数据库,最后再延迟一段时间(如几秒)再次删除Redis缓存。2.这种方法可以处理在数据库更新和Redis缓存删除之间可能发生的并发读取问题,从而确保数据的一致性。2.这可能需要实现一些额外的同步机制,以确保在从数据库上读取的数据与Redis缓存中的数据一致。2.这可以减少数据库的压力,并提高系统的响应速度。原创 2024-11-06 20:32:22 · 974 阅读 · 0 评论 -
【springboot】自动装配
1.创建配置类:定义一个配置类,并在类上添加@Configuration和@EnableConfigurationProperties注解。2.使用条件注解:在配置类中使用条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)指定自动配置的条件。3.定义配置属性类:使用@ConfigurationProperties注解创建配置属性类,并在配置类中注入该属性类。4.编写Bean:编写需要自动配置的Bean,并使用@Bean注解将其注册到容器中。原创 2024-11-04 11:26:30 · 1054 阅读 · 0 评论 -
【java】 ThreadLocal
1.内存泄漏:由于 ThreadLocal 变量是线程局部存储的,如果线程长时间存活(如线程池中的线程),而 ThreadLocal 变量又没有及时被清理(通过 remove 方法),那么可能会导致内存泄漏。1.ThreadLocal 是 Java 中提供的一个线程局部变量类,它用于为每个使用该变量的线程提供一个独立的变量副本,这样每个线程都可以独立地改变自己的副本,而不会影响其他线程的副本。4.清理线程变量:在不再需要时,通过 remove 方法清理当前线程的变量值,以避免内存泄漏。原创 2024-11-04 10:49:41 · 301 阅读 · 0 评论 -
【java】ArrayList与LinkedList的区别
因此,这些操作的时间复杂度为O(1)(在列表的头部或尾部操作时)或O(n)(在列表的中间位置操作时,因为需要遍历到该位置)。1.ArrayList:在ArrayList中进行插入和删除操作时,需要移动插入或删除点之后的所有元素来保持元素的连续性,因此这些操作的时间复杂度为O(n)。特别地,在列表的末尾添加元素时,ArrayList的性能相对较好,因为不需要移动元素。1.ArrayList中的元素是连续存储的,因此空间开销相对较小(除了元素本身外,还需要一些额外的空间来存储数组的长度和容量等信息)。原创 2024-11-04 10:41:55 · 921 阅读 · 0 评论 -
【springcloud】服务之间调用失败的重试机制
4.注意事项:在Spring Cloud的某些版本中,由于Feign整合了Ribbon,因此Feign的重试可能会受到Ribbon重试配置的影响。3.为了应对这种情况,Spring Cloud提供了一套完善的重试机制,允许开发者在服务调用失败时自动进行重试,以提高系统的容错能力和用户体验。:开发者可以通过配置文件或编程方式设置LoadBalancer的重试策略,包括最大重试次数、重试间隔等。:开发者可以通过配置Feign的重试器(Retryer)来调整重试策略,包括重试次数、重试间隔等。原创 2024-11-02 21:38:11 · 781 阅读 · 0 评论 -
【rabbitmq】什么是死信
当队列中的消息被消费者接收,但消费者通过执行reject或nack操作(并将requeue参数设置为false)拒绝消费该消息时,该消息会变成死信。:如果队列设置了最大长度,并且队列中的消息数量超过了该长度,那么超出部分的消息可能会被标记为死信(这取决于队列的配置,如是否开启死信交换器等)。1.在RabbitMQ中,死信(Dead Letter)主要指的是被消费者接收但未被成功处理,或者因其他原因无法被正常消费的消息。1.延迟消息处理:实现延迟消息投递,例如实现消息的定时投递、消息重试机制等。原创 2024-10-27 11:39:36 · 575 阅读 · 0 评论 -
【rabbitmq】RabbitMQ中的交换机有哪些类型
2.特点:使用模式匹配来路由消息,路由键和绑定键都支持通配符*(表示一个词)和#(表示一个或多个词)。2.特点:根据完全匹配的路由键(Routing Key)将消息路由到绑定的队列。4.路由规则:消息会被转发到与该交换机绑定的所有队列上,类似于子网广播。2.特点:采用广播模式,将接收到的消息分发给所有绑定到该交换机的队列。4.绑定规则:使用模式匹配的绑定键,例如*.info或#.error。3.应用场景:适用于需要广播消息的场景,例如实时消息发布。3.应用场景:适用于需要根据消息的特定属性进行路由的场景。原创 2024-10-27 10:29:19 · 647 阅读 · 0 评论 -
【jvm】堆的内部结构
2.在发生Minor GC(年轻代垃圾回收)时,存活的对象会从Eden区和当前的Survivor区(比如S0)复制到另一个Survivor区(比如S1),然后清空原来的区域。1.JVM堆的内部结构主要包括年轻代(Young Generation)和老年代(Old Generation),这种划分是基于对象的存活时间和使用特点来进行的。1.当年轻代中的对象存活时间较长,或者年轻代空间不足无法容纳新生成的对象时,这些对象会被转移到老年代中。2.Eden区是年轻代中最大的区域,用于存放大多数新生成的对象。原创 2024-10-26 23:27:02 · 661 阅读 · 0 评论 -
【jvm】什么是TLAB
2.TLAB则为每个线程分配一个私有的内存区域,使得线程在分配对象时不再需要竞争全局锁,而是在自己的TLAB中进行分配,提高了对象分配的效率。1.由于TLAB是线程私有的,因此多个线程在分配对象时不会互相干扰,减少了线程之间的竞争,提高了系统的并发性能。1.在传统的JVM内存分配方式中,多个线程在分配对象时需要竞争同一个全局的分配锁,会导致性能瓶颈。4.TLAB的主要目的是提高对象分配的性能,减少线程之间的竞争,以及降低内存分配的开销。1.线程在分配对象时,会优先在自己的TLAB中进行分配。原创 2024-10-26 22:02:52 · 779 阅读 · 0 评论 -
【jvm】所有的线程都共享堆吗
2.堆内存(Heap)是JVM管理的内存中最大的一块,用于存储对象实例和数组等动态分配的数据。3.它是Java内存管理中非常重要的一块区域,也是垃圾回收(GC)的主要工作区域。6.当对象不再被引用时,垃圾回收机制会自动回收这些无用的对象占用的内存空间。4.由于堆内存被所有线程共享,因此线程可以通过堆内存来进行交互和共享数据。8.堆内存是线程共享的,但在访问和修改共享数据时,仍需要注意线程安全问题。5.当一个对象实例被创建时,它会被分配到堆内存中。1.是的,JVM中所有的线程都共享堆内存。原创 2024-10-26 19:49:32 · 620 阅读 · 0 评论 -
【rabbitmq】rabbitmq工作模式
2.应用场景:适用于需要根据特定规则分发消息的场景,如系统打印日志,日志等级分为error、warning、info、debug,可以通过这种模式把不同的日志发送到不同的队列。2.应用场景:消息只能被单个消费者处理的场景,如用户通过接收手机验证码进行注册,点击获取验证码后,将验证码放到消息队列,然后短信服务从队列中获取到验证码,并发送给用户。2.应用场景:适用于处理消息较多的情况,如在电商平台中,有多个订单服务,用户下单时,任意一个订单服务消费用户的下单请求生成订单即可。原创 2024-10-26 14:56:26 · 755 阅读 · 0 评论 -
【面试】RabbitMQ有哪些消息模型
2.消息的发送者(Producer)将消息发送到队列中,消息的接收者(Consumer)从队列中获取消息并消费。2.消息发送者将消息发送到交换机中,并指定一个主题,消息接收者可以根据主题进行订阅,只接收他们感兴趣的消息。1.消息的发送者将消息发送到交换机(Exchange)中,交换机将消息广播给绑定到它的所有队列。1.类似于发布/订阅模型,但可以根据消息的特定主题(Topic)进行订阅。2.客户端发送请求消息到队列中,服务端消费请求消息并返回响应消息给客户端。2.每个消息可以被多个消费者接收。原创 2024-10-26 14:33:14 · 602 阅读 · 0 评论 -
【面试】rabbitmq的主要组件有哪些?
3.通过信道,客户端可以与Broker进行交互,如发送消息、接收消息、声明交换机和队列等。2.交换机有多种类型,如Direct、Fanout、Topic、Headers等。1.提供了逻辑上的隔离,每个虚拟主机都有自己独立的交换机、队列、绑定和权限机制。1.RabbitMQ支持通过插件扩展其功能,如管理界面、消息追踪、延迟队列等。1.负责接收生产者发送的消息,并根据路由规则将消息分发到一个或多个队列。1.RabbitMQ服务器本身,负责接收、存储和转发消息。2.通过绑定,交换机可以知道将消息发送到哪些队列。原创 2024-10-26 14:08:04 · 956 阅读 · 0 评论 -
【面试】jvm静态变量和局部变量对比
1.静态变量:随着类的加载而加载到JVM的方法区(静态区),当类被卸载时才会销毁。2.局部变量:存储在JVM的栈内存中,具体为栈帧中的局部变量表部分。1.在Java虚拟机(JVM)中,静态变量(类变量)和局部变量是两种不同类型的变量,它们在多个方面存在显著的区别。2.局部变量:定义在方法体内或方法参数中,属于方法或代码块。2.局部变量:每个线程的栈帧都是独立的,局部变量存储在栈帧的局部变量表中,因此不存在线程安全问题。1.静态变量:存储在JVM的方法区(静态区),这是一个所有线程共享的内存区域。原创 2024-08-26 22:40:20 · 792 阅读 · 0 评论 -
【jvm】虚拟机栈是如何运行的
栈帧是方法执行时的内存模型,包含了方法执行所需的各种信息。1.入栈:当一个方法被调用时,会创建一个新的栈帧,并将其压入当前线程的虚拟机栈顶。1.虚拟机栈是Java程序运行时环境中的一个重要组成部分,它主要负责存储线程执行方法时的局部变量、操作数栈、动态链接、方法出口等信息。4.虚拟机栈的运行原理遵循了栈数据结构的基本特性——后进先出(LIFO),确保了方法调用的正确顺序和方法局部变量的有效管理。2.JVM虚拟机栈是Java程序运行时环境中的一个关键组件,它通过栈帧的入栈和出栈过程来支持方法的调用和执行。原创 2024-08-25 18:04:08 · 624 阅读 · 0 评论 -
【jvm】jvm方法和栈帧的关系
1.栈帧的创建:每当一个方法被调用时,JVM都会为该方法的执行创建一个新的栈帧(Frame),并将其压入Java虚拟机栈中。:在一条线程中,只有目前正在执行的那个方法的栈帧是活动的,这个栈帧被称为当前栈帧。当前栈帧对应的方法就是当前方法,定义这个方法的类就是当前类。3.JVM中的方法和栈帧之间存在着紧密的关系,栈帧是支持方法执行的重要数据结构,而方法的调用和执行过程则伴随着栈帧的创建、入栈、出栈等操作。:栈帧是线程私有的数据结构,每个线程都有自己的虚拟机栈,因此每个线程在执行方法时都会创建自己的栈帧。原创 2024-08-25 17:26:56 · 485 阅读 · 0 评论 -
【面试】jvm栈默认大小
2.这个默认值反映了早期JVM版本中对于线程栈内存管理的策略,以及当时计算机硬件资源的限制。1.随着JVM的演进和计算机硬件的发展,JVM栈的默认大小增加到了1MB。2.这一变化是为了适应更复杂的应用程序需求和更大的内存资源。1.JVM栈的默认大小通常是256KB。原创 2024-08-24 20:29:54 · 432 阅读 · 0 评论 -
【jvm】哪些内存结构与线程一一对应(线程私有)
1.线程私有意味着每个线程都拥有该内存结构的一个独立实例,这些实例之间互不干扰,保证线程之间的数据隔离和并发执行的安全性。3.虚拟机栈中存储的是栈帧(Stack Frame),每个栈帧对应着一次Java方法调用。2.本地方法栈也是线程私有的,用于执行Native方法(即使用非Java语言编写的方法)。1.它是线程私有的,可以看作是当前线程所执行的字节码的行号指示器。3.程序计数器是线程私有的,它的生命周期与线程的生命周期一致。2.它是线程私有的,生命周期与线程一致。(如果当前线程执行的是Java方法)或。原创 2024-08-19 21:33:00 · 549 阅读 · 0 评论 -
【面试】tomcat类加载机制
1.tomcat的类加载机制是违反了双亲委派原则的,对于一些未加载的非基础类,各个web应用自己的类加载器(WebAppClassLoader)会优先查看自己的仓库加载,加载不到时再交给CommonClassLoader走双亲委派。2.这些类对于所有的Web应用程序都是可见的,但与Common类加载器加载的类不同,Shared类加载器加载的类更侧重于Web应用之间的共享资源。:由于每个Web应用都有自己的类加载器,Tomcat在加载类时不会搜索其他Web应用包含的Jar包,从而提高了类加载的性能。原创 2024-08-19 17:23:00 · 1105 阅读 · 0 评论 -
【jvm】类加载分几步
这通常意味着从文件系统、网络或其他来源读取类的.class文件或其他格式的二进制表示。3.原创 2024-08-04 21:34:14 · 798 阅读 · 0 评论 -
【面试】基本数据类型的包装类缓存
(I)Ljava/lang/Integer 方法的描述符,该方法接受一个int类型的参数(由(I)表示)并返回一个java.lang.Integer类型的对象(由 (I)Ljava/lang/Integer;执行此指令时,JVM会从操作数栈顶部弹出一个int值(在这个例子中是10),将其作为参数调用java.lang.Integer.valueOf方法,并将返回的Integer对象推送到操作数栈的顶部。使用Boolean.TRUE和Boolean.FALSE时,得到的是缓存中的对象实例。原创 2024-06-23 20:15:35 · 632 阅读 · 0 评论 -
【面试】什么是字节码指令
1.字节码指令是JVM能够理解和执行的基本指令。2.它由一个字节长度的操作码(Opcode)以及跟随其后的零至多个代表操作所需参数的操作数(Operands)构成。原创 2024-06-10 20:36:26 · 483 阅读 · 0 评论 -
【面试】哪些类型对应有Class的对象?
1.虽然类型变量和泛型类型在运行时会被擦除(type erasure),但它们在某些上下文中(如反射API)仍然有与之关联的 Class 对象或 Type 对象(后者是 Class 的超接口,用于表示更广泛的类型,包括泛型类型)。虽然基本类型本身没有直接的 Class 对象,但你可以使用它们的包装类来获取与它们相关的 Class 对象,或者使用 .TYPE 字段(对于包装类提供的静态字段)来获取与基本类型对应的 Class 对象。1.与类类似,每个定义的接口也有一个与之关联的 Class 对象。原创 2024-06-09 13:37:59 · 405 阅读 · 0 评论 -
【java】JVM前端编译器的局限性
1.前端编译器的主要功能是将Java源代码(.java)文件编译成字节码文件(.class文件),以供加载器进行类型加载。4.AOT编译器的使用也有一些限制,如需要为每个不同硬件和操作系统编译对应的发行包,且降低了Java链接过程的动态性。3.不直接涉及将字节码转换为可在硬件上直接运行的机器码过程,这是由JIT编译器在运行期间负责的。1.前端编译器的主要任务是将符合Java语法规范的Java代码转换为符合JVM规范的字节码文件。1.前端编译器在编译时是静态的,即它根据源代码的内容生成固定的字节码文件。原创 2024-06-09 11:17:19 · 463 阅读 · 0 评论 -
【面试】Java的前端编译器和后端编译器
4.在Java的编译过程中,前端编译器和后端编译器协同工作,共同将Java源代码转换为可执行的机器码。1.代码优化:在生成目标代码之前,对代码进行一系列的优化操作,以提高程序的执行效率和性能。1.在Java的编译过程中,编译器通常被划分为前端编译器和后端编译器,各自负责不同的任务。2.前端编译器主要负责源代码的词法分析、语法分析和语义检查,确保代码的语法正确性和准确性。3.语义检查:在语法分析的基础上,进行更深层次的检查,如类型检查、变量声明检查等。3.输出的目标代码是机器码,可以直接在硬件上执行。原创 2024-06-01 11:07:42 · 674 阅读 · 0 评论 -
【面试】生成class文件的编译器有哪些?
4.对于特定的开发环境和需求,可以考虑使用IDE自带的编译器(Eclipse编译器和Intelli IDEA编译器),以获得更多的特定功能和集成开发环境的优势。3.选择编译器时,一般建议使用官方发布的Oracle JDK或OpenJDK中的默认编译器(javac)进行Java编译。2.IntelliJ IDEA编译器同样可以将Java源代码编译为字节码文件,并提供了强大的代码分析和智能重构功能。2.这些编译器都能够将Java源代码编译为可在JVM上执行的字节码文件,是实现Java跨平台特性的关键。原创 2024-06-01 09:27:24 · 418 阅读 · 0 评论 -
【面试】class文件里面是什么?
2.用于描述类的方法,包括方法名、参数类型、返回类型、访问修饰符以及方法的字节码。class 文件是 Java 平台无关性的关键,因为它们包含了可以在任何支持 JVM 的硬件和操作系统上运行的字节码。1. .class 文件是 Java 编译器编译 Java 源代码文件(.java 文件)后生成的字节码文件。2.这是一个固定值(0xCAFEBABE),用于确定文件是否是一个有效的 Java 类文件。1.这些索引指向常量池中的条目,分别表示类的全限定名、父类的全限定名以及该类实现的接口列表。原创 2024-05-30 21:58:31 · 430 阅读 · 0 评论 -
【面试】字节码文件是跨平台的吗?
2.字节码文件是Java源代码经过Java编译器(javac)编译后生成的中间代码文件,这些包含了Java虚拟机(JVM)指令,而不是特定于某个硬件平台或操作系统的机器码。6.只要安装了相应版本的JVM,就可以在任何支持JVM的操作系统上运行Java字节码文件,而无需重新编译源代码。3.由于JVM是跨平台的,它能够在任何支持JVM的操作系统上执行字节码文件。5.这就是Java语言“一次编写,到处运行”的跨平台特性的基础。1.字节码文件(.class文件)是跨平台的。原创 2024-05-30 21:30:27 · 382 阅读 · 0 评论 -
【面试】什么是Java虚拟机
2.JVM是Java平台无关性的关键,它允许Java程序在任何支持JVM的硬件和操作系统上运行,从而实现“一次编写,到处运行”(Write Once, Run Anywhere)的跨平台特性。3.Java虚拟机是Java程序运行的核心环境,它负责加载、执行和管理Java程序,并提供了跨平台、内存管理、类加载、执行引擎、线程管理、安全性和性能调优等功能。1.Java虚拟机(Java Virtual Machine,简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境。原创 2024-05-30 21:02:10 · 434 阅读 · 0 评论 -
【面试】介绍一下HotSpot虚拟机
2.HotSpot虚拟机占据绝对的市场地位,从jdk1.3到现如今jdk14都是Oracle JDK和OpenJDK中默认的虚拟机。2.该虚拟机来源于Strongtalk虚拟机,而Strongtalk虚拟机中的技术又来源于为支持Self语言设计的Self虚拟机。1.HotSpot虚拟机是一款由Oracle JDK和OpenJDK广泛使用的Java虚拟机(JVM)。(JIT)技术,将常用的部分代码编译为本地(原生)代码,从而提高Java程序的执行性能。等特点,成为了Java领域广泛使用的虚拟机之一。原创 2024-05-30 20:49:04 · 878 阅读 · 0 评论 -
【面试】Java虚拟机的生命周期
可以使用-X系列的JVM参数来配置JVM的内存大小、垃圾回收策略等。3.在JVM终止时,也可以通过设置System.exit()的参数来返回一个状态码,以指示程序是正常退出还是由于某种错误而退出。(Garbage Collection)来自动管理内存,释放不再使用的对象占用的空间。2.如果应用程序请求了外部资源(如文件、数据库连接等),JVM会协调这些资源的访问。5.在终止前,JVM会执行一些清理工作,如关闭打开的文件、数据库连接等。1.Java虚拟机(JVM)的生命周期通常指的是JVM实例从。原创 2024-05-29 22:16:21 · 883 阅读 · 0 评论 -
【面试】谈谈常见的Java虚拟机有哪些
2.特点:GraalVM是一个高性能的运行时环境,支持多种语言,包括Java、JavaScript、Ruby、Python、R等。2.特点:也采用了即时编译技术,通过将字节码编译为本地机器码来提高程序的执行性能。2.特点:Exact VM是一个编译器和解释器混合执行的Java虚拟机,曾在Solaris平台上发布,但后来被其他虚拟机所取代。(Just-In-Time Compilation, JIT)的技术,将字节码实时编译为本地机器码,从而提高程序的执行效率。1.开发商:Oracle公司。原创 2024-05-29 21:19:43 · 606 阅读 · 0 评论 -
【面试】谈谈你对jvm的认识
1.JVM(Java Virtual Machine)是运行所有Java程序的抽象计算机,是Java语言的运行环境。2.它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(字节码),可以在多种平台上不加修改地运行。3.JVM包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。原创 2024-05-29 21:06:25 · 733 阅读 · 0 评论 -
【面试】什么是Java堆内存溢出?
1.数据库连接、文件句柄等外部资源没有及时关闭,这些资源将会被JVM的垃圾回收器视为有效对象而无法回收,引发内存泄露。3.如果大量使用这样的集合类,并且没有及时清理其中的对象,这些对象将一直存在于堆内存中,导致内存泄露。1.应用程序中创建了大量对象,并且这些对象在短时间内无法被垃圾回收器回收,导致堆内存空间耗尽。2.由于长生命周期的对象持有短生命周期对象的引用,导致短生命周期对象无法被垃圾回收器回收。4.调整JVM的堆内存设置,根据应用程序的需求分配足够的内存空间。原创 2024-05-28 21:52:05 · 999 阅读 · 0 评论 -
【面试】JDK和JVM是什么关系?
3.JDK包含了JRE(Java Runtime Environment),即Java运行环境,以及编译Java源代码的编译器(javac)和其他工具(如javadoc、jdb等)。4.开发人员在开发java应用程序时,需要安装jdk,因为它包含了编写和编译java程序所需的所有内容。4.只要系统安装了JVM,就可以运行Java程序,而无需考虑该程序是在哪种操作系统或硬件平台上编写的。的,因为它将字节码转换成机器码的工作是在运行时动态完成的,而不是在编译时。,JVM的目标是提供一个跨平台的。原创 2024-05-28 21:26:30 · 783 阅读 · 0 评论 -
【面试】Oracle JDK和Open JDK什么关系?
1.Oracle JDK包含了闭源组件,并根据二进制代码许可协议获得许可。在没有商业许可的情况下,2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业或生产用途。1.Oracle JDK包含一些特定于Oracle的商业特性或优化,这些特性可能不包含在Open JDK中。1.Oracle JDK是由Oracle公司基于Open JDK源代码开发的商业版本。2.Open JDK是完全开源的,采用了GPL协议,意味着可以自由使用和修改。Oracle JDK统一和稳定。原创 2024-05-28 20:57:30 · 622 阅读 · 0 评论 -
【面试】虚拟机栈面试题
1. 如果只有一个线程才可以操作此数据,则是线程安全的2. 如果有多个线程操作此数据,则此数据是共享数据。不考虑同步机制的话,会存在线程安全问题。3. 在方法里定义的变量,且变量的生命周期仅限于该方法,则该变量是线程安全的4. 如果变量是作为参数传到方法里的,或者方法中定义的变量作为返回值,给到其它方法调用,这两种情况是线程不安全的。原创 2023-11-04 16:32:08 · 309 阅读 · 0 评论