Java高频面试之JVM篇

说一下 Jvm 的主要组成部分?及其作用?

  1. 类加载器
  2. 执行器
  3. 运行时数据区域
  4. 本地接口

image.png

谈谈对运行时数据区的理解?

堆和栈的区别是什么?

堆中存什么?栈中存什么?

堆总存对象,栈中存局部变量,引用

为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?

  1. 从软件设计的角度来看,栈代表了处理逻辑,而堆代表了数据,这样分离使得处理逻辑更为清晰。这种隔离、模块化的思想在软件设计的方方面面都有体现。

  2. 堆与栈的分离,使得堆中的内容可以被多个栈共享。这种共享有很多好处,一方面提供了一种有效的数据交互方式(如内存共享),另一方面,节省了内存空间。

  3. 栈因为运行时的需要(如保存系统运行的上下文),需要进行地址段的划分。由于栈只能向上增长,因此会限制住栈存储内容的能力。而堆不同,堆的大小可以根据需要动态增长。因此,堆与栈的分离,使得动态增长成为可能,相应栈中只需要记录堆中的一个地址即可。

4.堆和栈的完美结合就是面向对象的一个实例。其实,面向对象的程序与以前结构化的程序在执行上没有任何区别,但是面向对象的引入使得对待问题的思考方式发生了改变,是更接近于自然的思考方式。当把对象拆开会发现,对象的属性其实就是数据,存放在堆中,而对象的方法就是处理逻辑,存放在栈中。我们编写对象的时候,其实即编写了数据结构,也编写了处理数据的逻辑。

总结:栈主要用来执行程序,堆主要用来存放对象,为栈提供数据存储服务。也正是因为堆与栈分离的思想才使得JVM的垃圾回收成为可能。

Java 中的参数传递时传值呢?还是传引用?

java中只有值传递,没有引用传递(永远都传递的是栈里面存的东西的副本,基本类型栈里存的是数字,对象栈里存的是引用的地址,传递的是引用的地址的副本)

public static void main(String[] args) throws InterruptedException {StringBuilder sb = new StringBuilder("hello");System.out.println("sb = " + sb);
}
public static void xxx(StringBuilder sb) throws InterruptedException {sb = new StringBuilder("hi");
}
sb = hello

Java 对象的大小是怎么计算的?

  1. 对象头+实例数据+对齐填充
  2. 对象头:8字节的markword+4字节的klass pointer(开启指针压缩klass pointer是4byte,不开启是8byte)
  3. 实例数据:byte/boolean 1byte,char/short 2byte,int/float 4byte long/double 8byte 引用类型4byte
  4. 对齐填充补够8字节的整数倍
  5. 数组用4byte存储数组长度
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.9</version>
</dependency>
String s = ClassLayout.parseInstance(new Object()).toPrintable();
System.out.println(s);

image.png

基本类型数组的实例数据大小等于基本类型的大小*数组的长度

long [] ls = new long[10];
for (int i = 0; i < 10; i++) {ls[i]=i;
}
String s = ClassLayout.parseInstance(ls).toPrintable();
System.out.println(s);

对象数组实例数据大小等于4*数组的长度

Object [] os = new Object[1000];
for (int i = 0; i < 1000; i++) {os[i]=new Object();
}
String s = ClassLayout.parseInstance(os).toPrintable();
System.out.println(s);

image.png

对象的访问定位的两种方式?

https://blog.csdn.net/gtjsjj/article/details/107360457

  1. 句柄

image.png

  1. 直接指针

image.png

判断垃圾可以回收的方法有哪些?

  1. 引用计数法(无法清理垃圾对象相互引用问题)
  2. 可达性算法

垃圾回收是从哪里开始的呢?

从栈开始(局部变量,静态变量)

被标记为垃圾的对象一定会被回收吗?

不一定,还需要判断要不要执行 finalize() 方法,如果有必要执行,等执行完才会回收

虽然 finalize() 方法可以拯救一个被可达性分析标记的垃圾对象不被回收,但是不推荐使用该方法,应该尽量避免使用。

谈谈对 Java 中引用的了解?

一个对象只要被强引用关联,就不会被回收

一个对象只被软应用关联,oom前会回收,如果回收之后内存足够则继续运行,如果还是内存不足,才oom

一个对象只被弱引用关联,每次都会被回收

虚引用与对象的生命周期无关,只是跟踪对象的回收情况

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。在Java语言中,将引用又分为强引用、软引用、弱引用、虚引用 4 种,这四种引用强度依次逐渐减弱。

  • 1. 强引用

在程序代码中普遍存在的,类似 Object obj = new Object() 这类引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

public class StrongReferenceExample {public static void main(String[] args) {// 创建一个强引用,引用一个字符串对象String str = new String("Hello, world!");// 打印被引用的对象 通过强引用获取对象/访问对象System.out.println(str); // 输出:Hello, world!// 置空引用str = null;// 执行垃圾回收System.gc();// 等待一段时间,以确保垃圾回收线程完成工作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 再次尝试打印被引用的对象System.out.println(str); // 输出:null}
}
  • 2. 软引用

用来描述一些还有用但并非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。

public class SoftReferenceExample {public static void main(String[] args) {// 创建一个字符串对象,并创建一个软引用String str = new String("Hello, world!");SoftReference<String> softRef = new SoftReference<>(str);// 打印软引用指向的对象 通过软引用可以获取对象 获取到对象后可以操作对象System.out.println(softRef.get()); // 输出:Hello, world!// 置空引用str = null;// 执行垃圾回收System.gc();// 等待一段时间,以确保垃圾回收线程完成工作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 再次尝试打印软引用指向的对象System.out.println(softRef.get()); // 输出:Hello, world!// 创建大量的对象,占用内存空间try {byte[] bytes = new byte[1024 * 1024 * 100]; // 创建一个100MB的字节数组} catch (OutOfMemoryError e) {e.printStackTrace();}// 再次尝试打印软引用指向的对象System.out.println(softRef.get()); // 输出:null}
}

软引用(Soft Reference)在Java中有一些常见的使用场景,特别适用于对内存敏感的缓存和高速缓存应用。以下是软引用的一些常见使用场景:

  1. 缓存:软引用可用于实现缓存,例如在内存有限的情况下,将一些常用的对象缓存起来。当内存不足时,垃圾回收器会回收软引用指向的对象,从而释放内存。这样可以有效地利用可用内存空间,并避免OutOfMemoryError的发生。
  2. 图片缓存:在需要处理大量图片的应用中,可以使用软引用来缓存图片对象。这样,在内存不足时,垃圾回收器会自动回收不再被强引用持有的图片对象,从而释放内存。
  3. 数据库查询结果缓存:当需要频繁地进行数据库查询时,可以使用软引用来缓存查询结果对象。这样,在内存不足时,可以立即回收不再被强引用持有的查询结果对象,从而释放内存。
  4. 文件或资源缓存:软引用也可以用于缓存文件或其他类型的资源对象。当资源对象不再被使用时,软引用会自动回收,释放对应的资源。

需要注意的是,软引用在内存充足的情况下,会尽量保持对被引用对象的引用,因此在高并发或内存敏感的应用中,可能需要合理地调整软引用的使用策略,避免过多的对象占用内存。

此外,软引用也可以与其他引用类型结合使用,例如结合引用队列(ReferenceQueue)来实现更灵活的资源管理和清理操作。通过监视引用队列中的软引用,可以得知哪些对象已经被垃圾回收器回收,从而进行相应的资源释放或清理操作。

  • 3. 弱引用

也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。

public class WeakReferenceExample {public static void main(String[] args) {// 创建一个字符串对象,并创建一个弱引用String str = new String("Hello, world!");WeakReference<String> weakRef = new WeakReference<>(str);// 打印弱引用指向的对象System.out.println(weakRef.get()); // 输出:Hello, world!// 置空引用str = null;// 执行垃圾回收System.gc();// 等待一段时间,以确保垃圾回收线程完成工作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 再次尝试打印弱引用指向的对象System.out.println(weakRef.get()); // 输出:null}
}
  • 4. 虚引用

也叫幽灵引用或幻影引用,是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会影响其生命周期,也无法通过虚引用来取得一个对象,也无法通过需应该操作对象。它的作用是在对象被回收时收到一个系统通知。

public class PhantomReferenceExample {public static void main(String[] args) {Object obj = new Object();ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();// 创建一个虚引用,关联到对象obj,并指定引用队列PhantomReference<Object> phantomReference = new PhantomReference<>(obj, referenceQueue);// 置空obj引用,使对象成为垃圾回收的候选obj = null;// 执行垃圾回收System.gc();try {// 等待一段时间,以确保垃圾回收线程完成工作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 检查引用队列,看虚引用是否被添加到队列中Reference<?> reference = referenceQueue.poll();if (reference != null) {// 从引用队列中获取引用并进行相应处理System.out.println("PhantomReference is enqueued.");}}
}

谈谈对内存泄漏的理解?

没有了但没有回收

  1. 可达
  2. 无用

内存泄露的根本原因是什么?

长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,

但是因为长生命周期持有它的引用而导致不能被回收,这就是 Java 中内存泄漏的发生场景。

举几个可能发生内存泄漏的情况?

  1. 长声明周期对象持有短声明周期对象,例如某些对象在集合中被添加后没有及时从集合中移除,导致它们一直被引用而无法被释放。
  2. 静态变量引用的对象
  3. 没有释放的资源
FileInputStream fis = null;
try {fis = new FileInputStream("file.txt");// 使用fis读取文件
} catch (IOException e) {// 异常处理
} finally {// 未在finally块中关闭fis,可能导致资源泄漏
}
  1. 被遗忘的缓存
Map<String, Object> cache = new HashMap<>();
// 向缓存中添加对象
cache.put("key", new Object());
// ...
// 未在合适的时机从缓存中移除不再需要的对象,可能导致内存泄漏

尽量避免内存泄漏的方法?

  1. 明确对象的生命周期:确保对象的引用在不再需要时及时释放。特别是在使用集合或缓存等数据结构时,要确保从中移除不再需要的对象。
  2. 关闭资源:对于使用了外部资源(如文件、数据库连接、网络连接等),在使用完毕后应该及时关闭这些资源,以释放相关的系统资源。通常使用try-with-resources或finally块来确保资源的正确关闭。
  3. 尽早释放对象引用:在不再需要某个对象时,尽早将其引用置为null,以便垃圾收集器可以回收该对象。这尤其适用于大对象或长时间存活的对象。
  4. 小心使用静态引用:避免过多或不必要地使用静态变量或静态集合,因为它们的生命周期通常是整个应用程序的生命周期。确保静态引用的对象在实际上不再需要时能够及时释放。
  5. 避免循环引用:当对象之间形成循环引用(例如,对象A引用对象B,对象B又引用对象A),即使这些对象不再被外部引用,它们也无法被垃圾收集器回收。通过使用弱引用(Weak Reference)或其他手段打破循环引用链,以便垃圾收集器可以正确回收对象。
  6. 合理使用缓存:当使用缓存时,需要注意缓存的对象在实际上不再需要时要及时清理。可以考虑使用弱引用缓存(Weak Reference Cache)或软引用缓存(Soft Reference Cache),以便在内存不足时能够自动回收缓存对象。
  7. 使用内存分析工具:使用Java的内存分析工具(如VisualVM、Eclipse Memory Analyzer等)来检测和分析内存泄漏问题。这些工具可以帮助发现不再使用的对象和未关闭的资源。

通过采取这些方法,可以最大程度地减少内存泄漏的发生,并确保Java应用程序的内存使用效率和性能。

常用的垃圾收集算法有哪些?

  1. 标记复制
  2. 标记清理
  3. 标记整理

为什么要采用分代收集算法?

因为不同对象的声明周期不一样

分代收集下的年轻代和老年代应该采用什么样的垃圾回收算法?

https://blog.csdn.net/weixin_42405670/article/details/120211605

  1. 年轻代标记复制(大多数对象是朝生夕死,复制成本小)
  2. 老年代 标记整理算法

什么是浮动垃圾?

本次清理清理不掉的垃圾

什么是内存碎片?如何解决?

常用的垃圾收集器有哪些?

image.png

谈谈你对 CMS 垃圾收集器的理解?

CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。是使用标记清除算法实现的,整个过程分为四步:

  1. 初始标记:记录下直接与 root 相连的对象,暂停所有的其他线程,速度很快;

  2. 并发标记:同时开启 GC 和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以 GC 线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。

  3. 重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。【这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短】;

  4. 并发清除:开启用户线程,同时 GC 线程开始对为标记的区域做清扫。

CMS 的优缺点:

主要优点:并发收集、低停顿;

主要缺点:对 CPU 资源敏感、无法处理浮动垃圾、它使用的回收算法“标记-清除”算法会导致收集结束时会有大量空间碎片产生。

image.png

谈谈你对 G1 收集器的理解?

Garbage First /ˈɡɑːbɪdʒ/

垃圾回收的瓶颈:传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是 Full GC 所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC 暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个相对较小范围内,但是这样有限制了应用本身的处理能力,同样也是不可接受的。

分代垃圾回收方式确实也考虑了实时性要求而提供了并发回收器,支持最大暂停时间的设置,但是受限于分代垃圾回收的内存划分模型,其效果也不是很理想。

G1 可谓博采众家之长,力求到达一种完美。它吸取了增量收集优点,把整个堆划分为一个一个等大小的区域(region)。内存的回收和划分都以region为单位;同时,它也吸取了 CMS 的特点,把这个垃圾回收过程分为几个阶段,分散一个垃圾回收过程;而且,G1 也认同分代垃圾回收的思想,认为不同对象的生命周期不同,可以采取不同收集方式,因此,它也支持分代的垃圾回收。为了达到对回收时间的可预计性,G1 在扫描了 region 以后,对其中的活跃对象的大小进行排序,首先会收集那些活跃对象小的 region,以便快速回收空间(要复制的活跃对象少了),因为活跃对象小,里面可以认为多数都是垃圾,所以这种方式被称为 Garbage First(G1)的垃圾回收算法,即:垃圾优先的回收。

image.png

说下你对垃圾回收策略的理解/垃圾回收时机?

  • 1. Minor / Scavenge GC

    /ˈmaɪnə®/

所有对象创建在新生代的 Eden 区,当 Eden 区满后触发新生代的 Minor GC,将 Eden 区和非空闲 Survivor 区存活的对象复制到另外一个空闲的 Survivor 区中。保证一个 Survivor 区是空的,新生代 Minor GC 就是在两个 Survivor 区之间相互复制存活对象,直到 Survivor 区满为止。

Minor/Scavenge 这种方式的 GC 是在年轻代的 Eden 区进行,不会影响到年老代。因为大部分对象都是从 Eden 区开始的,同时 Eden 区不会分配的很大,所以 Eden 区的 GC 会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使 Eden 去能尽快空闲出来。

2. Major GC

/ˈmeɪdʒə®/ 买洁儿

发生在老年代的GC ,基本上发生了一次Major GC 就会发生一次 Minor GC。并且Major GC 的速度往往会比 Minor GC 慢 10 倍。

什么时候会发生 Major GC 呢?

  1. 对于一个大对象,我们会首先在Eden 尝试创建,如果创建不了,就会触发Minor GC
  2. 随后继续尝试在Eden区存放,发现仍然放不下
  3. 尝试直接进入老年代,老年代也放不下
  4. 触发 Major GC 清理老年代的空间
  • 3. Full GC

对整个堆进行整理,包括 Young、Tenured (老年代)和 Perm(元空间)。Full GC 因为需要对整个堆进行回收,所以比 Minor GC 要慢,因此应该尽可能减少 Full GC 的次数。在对 JVM 调优的过程中,很大一部分工作就是对于 Full GC 的调节。

如下原因可能导致 Full GC:

1、 调用 System.gc(),会建议虚拟机执行 Full GC。只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。

2、 老年代空间不足,原因:老年代空间不足的常见场景为大对象直接进入老年代、长期存活的对象进入老年代等。为了避免以上原因引起的 Full GC,应当尽量不要创建过大的对象以及数组。除此之外,可以通过 -Xmn 虚拟机参数调大新生代的大小,让对象尽量在新生代被回收掉,不进入老年代。还可以通过 -XX:MaxTenuringThreshold 调大对象进入老年代的年龄,让对象在新生代多存活一段时间;

3、 空间分配担保失败:使用复制算法的 Minor GC 需要老年代的内存空间作担保,如果担保失败会执行一次 Full GC;

4、JDK 1.7 及以前的永久代空间不足。在 JDK1.7 及以前,HotSpot 虚拟机中的方法区是用永久代实现的,永久代中存放的为一些 Class 的信息、常量、静态变量等数据。当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,在未配置为采用 CMS GC 的情况下也会执行 Full GC。如果经过 Full GC 仍然回收不了,那么虚拟机会抛出 java.lang.OutOfMemoryError。为避免以上原因引起的 Full GC,可采用的方法为增大永久代空间或转为使用 CMS GC。

5、Concurrent Mode Failure 执行 CMS GC 的过程中,同时有对象要放入老年代,而此时老年代空间不足(可能是 GC 过程中浮动垃圾过多导致暂时性的空间不足),便会报 Concurrent Mode Failure 错误,并触发 Full GC。

谈谈你对内存分配的理解?

  1. 对象优先在 Eden 区分配:大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor GC。
  2. 大对象直接进入老年代:大对象是指需要连续内存空间的对象,最典型的大对象是那种很长的字符串以及数组。经常出现大对象会提前触发垃圾收集以获取足够的连续空间分配给大对象。-XX:PretenureSizeThreshold,大于此值的对象直接在老年代分配,避免在 Eden 区和 Survivor 区之间的大量内存复制。
  3. 长期存活的对象将进入老年代:为对象定义年龄计数器,对象在 Eden 出生并经过 Minor GC 依然存活,将移动到 Survivor 中,年龄就增加 1 岁,增加到一定年龄则移动到老年代中。-XX:MaxTenuringThreshold 用来定义年龄的阈值。
  4. 动态对象年龄判定:为了更好的适应不同程序的内存情况,虚拟机不是永远要求对象年龄必须达到了某个值才能进入老年代,如果 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无需达到要求的年龄。
  5. 空间分配担保

(1)在发生 Minor GC 之前,虚拟机先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果条件成立的话,那么 Minor GC 可以确认是安全的;

(2)如果不成立的话,虚拟机会查看 HandlePromotionFailure 设置值是否允许担保失败,如果允许那么就会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次 Minor GC;如果小于,或者 HandlePromotionFailure 设置不允许冒险,那么就要进行一次 Full GC。

Java虚拟机

空间分配担保?

说下你用过的 JVM 监控工具?

  1. jvisualvm:虚拟机监视和故障处理平台 /ˈvɪʒuəl/喂酒哦 vis 看 ual …的 可视化的 喂酒哦
  2. jps :查看当前 Java 进程
  3. jstat:显示虚拟机运行数据
  4. jmap:内存监控
  5. jhat:分析 heapdump 文件
  6. jstack:线程快照
  7. jinfo:虚拟机配置信息

如何利用监控工具调优?

JVM 的一些参数?

谈谈你对类文件结构的理解?有哪些部分组成?

谈谈你对类加载机制的了解?

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载 7 个阶段。其中验证、准备、解析 3 个部分统称为连接,这7个阶段发生的顺序如下图所示:

image.png

类加载各阶段的作用分别是什么?

有哪些类加载器?分别有什么作用?

类与类加载器的关系?

谈谈你对双亲委派模型的理解?工作过程?为什么要使用

怎么实现一个自定义的类加载器?需要注意什么?

怎么打破双亲委派模型?

有哪些实际场景是需要打破双亲委派模型的?

谈谈你对编译期优化和运行期优化的理解?

为何 HotSpot 虚拟机要使用解释器与编译器并存的架构?

说下你对 Java 内存模型的理解?

内存间的交互操作有哪些?需要满足什么规则?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式系列:单例模式

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;WPS二次开发QQ群:250325397&#xff09;&#xff0c;摸鱼吹牛嗨起来&#xff01…

一起学习python——基础篇(15)

今天讲一下python的网络请求方法。 如果使用python语言做接口测试&#xff0c;可以安装Requests模块。 安装步骤&#xff1a;打开编程软件&#xff0c;然后点击settings——>Project:System——>Python Interpreter——>加号——>搜索栏里面输入“Requests”——&…

Redis中的集群(一)

集群 概述 Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片(sharding)来进行数据共享&#xff0c;并提供复制和故障转移功能 节点 一个Redis集群通常由多个节点(node)组成&#xff0c;在刚开始的时候&#xff0c;每个节点都是相互独立的&#xff0c;它们都…

appium

app元素抓取在线工具 Appium Inspector by Appium Pro appium安装&#xff08;通过node.js安装&#xff09; Python3Appium安装使用教程_python_脚本之家 Node version is 18.17.1

[计算机网络] 当输入网址到网页

HTTP 首先&#xff0c;对URL进行解析&#xff0c;URL包含了Web服务器和对应的文件&#xff08;文件路径&#xff09; URL是请求服务器中的文件资源 通过Web服务器和对应文件来生产HTTP包&#xff08;超文本传输协议&#xff09; DNS 根据域名查询对应的IP地址 域名的层级 根…

代理模式:控制对象访问的智能方式

在面向对象的软件开发中&#xff0c;代理模式是一种结构型设计模式&#xff0c;它为其他对象提供一个代理或占位符以控制对这个对象的访问。代理模式在实现权限控制、延迟初始化和远程对象访问等方面非常有用。本文将详细介绍代理模式的定义、实现、应用场景以及优缺点&#xf…

奎芯科技:智能时代的芯片上游企业如何突破?

半导体IP&#xff08;Intellectual Property&#xff0c;知识产权&#xff09;&#xff0c;通常也称作IP核&#xff08;IP core&#xff09;&#xff0c;指芯片设计中预先设计、验证好的功能模块&#xff0c;主要服务于芯片设计&#xff0c;因部分通用功能模块在芯片中被反复使…

鸿蒙南向开发:【智能烟感】

样例简介 智能烟感系统通过实时监测环境中烟雾浓度&#xff0c;当烟雾浓度超标时&#xff0c;及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程配置智能烟感系统的报警阈值&#xff0c;远程接收智能烟感系统报警信息。实现对危险及时报…

智慧港口多场景解决方案(二)

港机智能化管理 港机智能化管理解决方案 [功能特点」 专门定制适合港机应用的专业摄像机高性能无线传输系统,高带宽、高抗干扰能力、高频谱利用率高移动性:支持港机移动高清视频的实时传送多业务承载能力:支持视频图像、CMS、告警数据、生产数据等业务的同时接入统一管理平台…

微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索

目录 引言&#xff1a;LLMs在强化学习中的探索能力探究 研究背景&#xff1a;LLMs的在情境中学习能力及其重要性 实验设计&#xff1a;多臂老虎机环境中的LLMs探索行为 实验结果概览&#xff1a;LLMs在探索任务中的普遍失败 成功案例分析&#xff1a;Gpt-4在特定配置下的探…

YOLOv8草莓生长状态(灰叶病缺钙需要肥料)检测系统(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;不仅可以检测图片、视频或摄像头当中出现的草莓叶子是否有灰叶病&#xff0c;还可以检测出草莓叶是否缺钙、是否需要施肥等状态。基于最新的YOLO-v8训练的草莓生长状态检测模型和完整的python代码以及草莓的训练数据&#xff0c;下载后即可运行&#x…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…

【氮化镓】缓冲层结构对GaN HEMT射频性能的影响

【Effect of different layer structures on the RF performance of GaN HEMT devices】 研究总结&#xff1a; 本研究探讨了不同缓冲层结构对氮化镓高电子迁移率晶体管&#xff08;GaN HEMT&#xff09;射频性能的影响。通过对比三种不同缓冲层结构的GaN HEMT设备&#xff0…

【YOLOv9改进[损失函数]】使用MPDIou回归损失函数帮助YOLOv9模型更优秀

本文中&#xff0c;第一部分概述了各种回归损失函数&#xff0c;当然也包括了今天的主角MPDIou。第二部分内容为在YOLOv9中使用MPDIou回归损失函数的方法。 1 回归损失函数&#xff08;Bounding Box Regression Loss&#xff09; 边界框回归损失计算的方法包括GIoU、DIoU、CI…

伦敦银实时行情看不懂?因为你不懂这些

伦敦银每天的实时行情都在变化&#xff0c;市场走势会在混沌和明朗之间反复切换&#xff0c;如果你是一名趋势交易者&#xff0c;明朗的市况才是创造利润的时候&#xff0c;所以在如市之前&#xff0c;你就要去思考&#xff0c;自己该如何度过那些持续时间可能很长的震荡行情。…

保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)

保姆级python项目离线部署服务器教程只需这一篇就够了 这篇文章主要记录我在湖南长沙国网电科院一次python项目部署,由于我主要是做Java后端开发对python确实不太了解因此记录下这次教程 环境介绍 ​ 服务器为linux的centos系统具体7还是8我不太清楚,全程为没有网络环境,所以环…

(Java)数据结构——图(第七节)Folyd实现多源最短路径

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Folyd实现原理 中心点的概念 感觉像是充当一个桥梁的作用 还是这个图 我们常在一些讲解视频中看到&#xff0c;就比如dist&#xff08;-1&#xff09;&#xff0…

volta(轻松切换管理Node.js版本)

Node.js版本管理 Volta提供了一个简单直观的命令行界面&#xff0c;可以轻松地安装、卸载、更新和切换Node.js版本。 Volta 既可以全局使用&#xff0c;也可以在项目级别使用&#xff0c;可以为每个项目单独设置node版本&#xff0c;nvm不行。 下载安装Volta 参考&#xff1a; …

为什么要“挺”鸿蒙?

鸿蒙到底是什么&#xff1f; 随着5G、物联网等技术的快速发展&#xff0c;智能终端设备的应用场景也越来越广泛。为了满足不同设备间的互联互通需求&#xff0c;华为在2019年推出了自主研发的操作系统——鸿蒙OS。值得关注的是&#xff0c;这也是首款国产操作系统。 要了解鸿…

【可视化大屏开发】18. 加餐-ECharts+百度地图API实现热力图

ECharts结合百度地图API能获得更好的使用体验。 效果展示 放大后的效果 切换卫星地图模式 实现步骤 1. 通过Python实现GPS数据模拟 2. 通过IDEA开发地图 通过Python实现GPS数据模拟 import random from math import cos, sin, radians, sqrt import jsondef generate_random…