你需要明白的JVM相关问题

1、说说内存溢出跟内存泄漏的区别?

  1. 内存泄露:申请的内存空间没有被正确释放,导致内存被白白占用。
  2. 内存溢出:申请的内存超过了可用内存,内存不够了。可能是泄漏导致的。

2、如何判断对象仍然存活?jvm是怎么判断某个对象是不是垃圾的?

两种方式:引用计数算法、可达性分析算法

引用计数算法:

引用计数器:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;
当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
可达性分析算法:

将一系列 GC Roots 作为初始的存活对象合集(Gc Root Set),然后从该合集出发,探索所有能够被该集合引用到的对象,并将其加入到该集合中,
这个过程我们也称之为标记(mark)。最终,未被探索到的对象便是死亡的,是可以回收的。

3、GC Roots 有哪些?

「固定的GC Roots:」

  • 1.在「「虚拟机栈(栈帧的本地变量表)中所引用的对象」」,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
  • 在方法区中「类静态属性引用的对象」,譬如 Java 类的「引用静态变量」
  • 在方法区中「「常量引用的对象」」,譬如字符串常量池中的引用。
  • 在方法区栈中 「「JNI (譬如 Native 方法)引用的对象」」
  • Java 「「虚拟机内部的引用」」,如基本数据类型对应的 Class 对象,一些常驻的异常对象(空指针异常、OOM等),还有类加载器。
  • 所有「「被 Synchronized 持有的对象」」。
  • 反应 Java 虚拟机内部情况的 「「JMXBean、JVMTI 中注册的回调本地代码缓存等」」

「临时GC Roots:」

  • 「为什么会有临时的 GC Roots ?」」:目前的垃圾回收大部分都是「「分代收集和局部回收」」,如果只针对某一部分区域进行局部回收,那么就必须要考虑的「「当前区域的对象有可能正被其他区域的对象所引用」」,这时候就要将这部分关联的对象也添加到 GC Roots 中去来确保根可达算法的准确性。这种算法是利用了「「逆向思维」」,找到使用的对象,剩下的就是垃圾,也被称为"间接垃圾收集"。

4、什么时候触发Full GC?

一共有6种触发条件:

  • System.gc()等命令触发:System.gc()、jmap -dump 等命令会触发 full gc。
  • Young GC 之前检查老年代:在要进行 Young GC 的时候,发现老年代可用的连续内存空间 < 新生代历次Young GC后升入老年代的对象总和的平均大小,说明本次 Young GC 后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,那就会触发 Full GC。
  • Young GC 之后老年代空间不足:执行 Young GC 之后有一批对象需要放入老年代,此时老年代就是没有足够的内存空间存放这些对象了,此时必须立即触发一次 Full GC
  • 老年代空间不足,老年代内存使用率过高,达到一定比例,也会触发 Full GC。
  • 空间分配担保失败( Promotion Failure),新生代的 To 区放不下从 Eden 和 From 拷贝过来对象,或者新生代对象 GC 年龄到达阈值需要晋升这两种情况,老年代如果放不下的话都会触发 Full GC。
  • 方法区内存空间不足:如果方法区由永久代实现,永久代空间不足 Full GC。

5、对象什么时候会进入老年代?

一共有四种情况:

  1. 长期存活的对象将进入老年代:在对象的对象头信息中存储着对象的迭代年龄,迭代年龄会在每次 YoungGC 之后对象的移区操作中增加,每一次移区年龄加一.当这个年龄达到 15(默认)之后,这个对象将会被移入老年代。#可以通过这个参数设置这个年龄值。- XX:MaxTenuringThreshold
  2. 大对象直接进入老年代:有一些占用大量连续内存空间的对象在被加载就会直接进入老年代.这样的大对象一般是一些数组,长字符串之类的对。#HotSpot 虚拟机提供了这个参数来设置。-XX:PretenureSizeThreshold
  3. 动态对象年龄判定:HotSpot 虚拟机并不是永远要求对象的年龄必须达到- XX:MaxTenuringThreshold 才能晋升老年代,如果在 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代
  4. 空间分配担保:假如在 Young GC 之后,新生代仍然有大量对象存活,就需要老年代进行分配担保,把 Survivor 无法容纳的对象直接送入老年代。

6、CMS垃圾回收器的缺点有哪些?

优点:CMS 最主要的优点在名字上已经体现出来——并发收集、低停顿。

缺点:CMS 同样有三个明显的缺点。

  • Mark Sweep(标记-清除) 算法会导致内存碎片比较多
  • CMS 的并发能力比较依赖于 CPU 资源,并发回收时垃圾收集线程可能会抢占用户线程的资源,导致用户程序性能下降。
  • 并发清除阶段,用户线程依然在运行,会产生所谓的理“浮动垃圾”(Floating Garbage),本次垃圾收集无法处理浮动垃圾,必须到下一次垃圾收集才能处理。如果浮动垃圾太多,会触发新的垃圾回收,导致性能降低。

G1 主要解决了内存碎片过多的问题。
 

7、什么是双亲委派?为什么要这样?

双亲委派模型的工作过程:

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类
而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此
因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求时 ,子加载器才会尝试自己去完成加载。

为什么这样?

答案是为了保证应用程序的稳定有序。保证安全。

例如类 java.lang.Object,它存放在 rt.jar 之中,通过双亲委派机制,保证最终都是委派给处于模型最顶端的启动类加载器进行加载,保证 Object 的一致。反之,都由各个类加载器自行去加载的话,如果用户自己也编写了一个名为 java.lang.Object 的类,并放在程序的 ClassPath 中,那系统中就会出现多个不同的 Object 类。

8、如何打破双亲委派?什么时候有用?

如果想打破双亲委派模型则需要重写 loadClass()方法。

如何打破双亲委派模式?

  1. 继承重写(Override Inheritance):可以通过创建一个新的子类来覆盖父类的方法或属性。这种方法允许你修改或扩展原有的行为。但需要注意,这可能会导致你需要处理更多的细节,特别是对于继承链的管理和代码的复杂性。

  2. 装饰器模式(Decorator Pattern):使用装饰器模式可以在运行时动态地扩展一个对象的功能。通过添加装饰器,你可以在不修改原有对象的情况下,为其增加新的行为或修改现有行为。

  3. 事件监听(Event Listening):有些情况下,你可以通过注册事件监听器来捕获和处理对象的特定行为。这种方式通常用于需要在对象行为发生时采取一些特定动作的场景。

  4. 依赖注入(Dependency Injection):在某些情况下,通过依赖注入的方式可以替代双亲委派模式。依赖注入允许你在运行时动态地改变对象的依赖关系,从而实现定制化的行为。

什么时候有用?

打破双亲委派模式通常在以下情况下是有用的:

  • 定制化需求:当你需要根据具体的需求修改或扩展现有的功能时,打破双亲委派模式可以让你更灵活地实现这些定制化需求。

  • 不同的业务逻辑:如果不同的部分需要不同的行为或处理方式,你可能需要打破双亲委派模式以便针对不同的情况提供不同的实现。

  • 性能优化:有时候,通过打破双亲委派模式可以实现更高效或更优化的实现方式,特别是在需要处理大量数据或频繁调用的情况下。

总之,打破双亲委派模式通常是为了实现更灵活、更定制化的软件设计,以满足特定的业务需求或性能优化要求。

9、为什么内存超过32G的64位JVM开启指针压缩优化失败?

在Java虚拟机(JVM)中,指针压缩(Pointer Compression)是一种优化技术,它可以减少指针的大小,从而在一定程度上降低内存占用。指针压缩通常在32位JVM上启用,因为32位系统的寻址空间有限,指针占用的内存较大。但在64位JVM上,由于寻址空间非常广阔(2的64次方),指针的大小本身不再是内存占用的瓶颈,因此默认情况下,64位JVM是不启用指针压缩的。

然而,即使在64位JVM上,有时也可以选择手动启用指针压缩。指针压缩的启用取决于几个因素:

  1. 堆内存的大小限制:在32位JVM中,由于地址空间限制,Java堆的大小通常受到4GB的限制。在64位JVM中,由于寻址空间更大,理论上可以支持非常大的堆内存,超过32GB。

  2. 启用指针压缩的条件:在64位JVM中,如果你希望启用指针压缩,需要考虑JVM实现是否支持,并且需要确保压缩后的指针可以正确映射到有效的地址范围内。通常,指针压缩的有效性受到堆内存大小和对象的内存分配模式的影响。

  1. 默认情况下的行为

    • 64位JVM默认情况下不启用指针压缩,因为64位地址空间很大,指针大小本身不是内存占用的主要限制因素。
  2. 手动启用指针压缩

    • 在一些特殊情况下,你可以手动启用指针压缩来降低内存占用。这通常需要通过JVM启动参数来完成。
  3. 常见的启动参数

    • -XX:+UseCompressedOops:这是用于启用指针压缩的参数。Oops是Java HotSpot VM中对“ordinary object pointers”的简称。
    • -XX:+UseCompressedClassPointers:这是用于启用类指针压缩的参数。当启用该选项时,JVM会尝试将类指针进行压缩,以节省更多内存。
  4. 启用示例

    • 若要启用指针压缩,可以在JVM启动命令中添加如下参数:
      java -XX:+UseCompressedOops -XX:+UseCompressedClassPointers YourMainClass
    • 这将使JVM在运行时尝试使用压缩指针和类指针的技术来优化内存使用。

为什么呢?

我们来算一下,既然指针压缩到了4byte,也就是32bit,同样按照之前算的,用排列组合的方式可以识别2^32个对象,也就是4G个对象,刚才同样也说了,在Java中,非简单对象都是必须以8byte对齐。

因此,其能够识别的最大内存就是4G*8byte=32GB

这也是为什么很多Java服务在运行中,官方都建议单个运行实例的内存设置不要超过32GB的根本原因。典型的如Elasticsearch,很多资料都说设置JVM大小不要超过32G,但是很少有提到为什么。

10、类加载过程是什么样的?

关于JVM必备的一些知识-CSDN博客

11、jvm内存区域有哪些?分别的作用是什么?

关于JVM必备的一些知识-CSDN博客

堆内存结构:

12、jvm内存分配过程中的TLAB有什么用?

TLAB 是 Java 虚拟机(JVM)中的 "Thread-Local Allocation Buffer" 的缩写,即线程本地分配缓冲区。TLAB 是为了优化对象分配和提高程序性能而引入的概念。

在 Java 中,每当需要分配新的对象时,JVM 通常会使用堆内存来进行分配。为了减少线程竞争和提高分配效率,JVM 会为每个线程预分配一个 TLAB。每个线程都有自己的 TLAB,这样在对象分配时,线程可以直接在自己的 TLAB 上分配内存,而不需要每次都去竞争堆上的全局锁。这种设计有效地减少了多线程环境下的内存分配的竞争和同步开销,从而提高了并发程序的性能。

总结一下,TLAB 是 JVM 中的线程本地分配缓冲区,用于提高对象分配的效率和降低竞争。

13、逃逸分析跟栈上分配是什么?有什么用?

逃逸分析(Escape Analysis)和栈上分配(Stack Allocation)是 Java 虚拟机优化技术的一部分,主要用于提升程序的性能和内存利用率。

  1. 逃逸分析(Escape Analysis)

    • 定义:逃逸分析是指编译器分析对象的动态作用域,即对象的引用是否逃出了方法的作用域。如果对象的引用没有逃出方法的作用域,编译器可以安全地将其分配在栈上,而不是在堆上。逃逸分析的主要目标是识别哪些对象可以在方法栈帧上分配,从而避免频繁的堆内存分配和垃圾回收操作。
    • 用途:逃逸分析可以显著提升程序的性能,尤其是在多线程环境下。如果对象被分配在栈上,它们的访问速度更快,因为栈上分配不需要加锁或者同步操作,而且这些对象的生命周期仅限于方法执行期间,减少了垃圾收集器的压力。
  2. 栈上分配(Stack Allocation)

    • 定义:栈上分配是指将对象分配到当前线程的方法栈帧上,而不是分配到堆上。这些对象的生命周期与方法的生命周期相同,当方法返回时,它们自动被销毁,无需进行垃圾回收。
    • 用途:栈上分配可以显著减少垃圾收集器的负担,因为这些对象不需要进行垃圾回收。同时,栈上分配还可以提高程序的执行速度,因为在方法栈帧上分配对象比在堆上分配对象更快速,不需要进行复杂的内存管理操作。

综上所述,逃逸分析和栈上分配都是优化技术,通过减少对象的堆分配和垃圾回收操作来提升程序的性能和响应速度。逃逸分析用于确定对象的引用是否会逃出方法作用域,以便安全地进行栈上分配,从而达到优化的目的。

14、Java对象的内存布局有了解吗?

对象内存布局

  • 「1.对象头」: 对象头又分为 「MarkWord」 和 「Class Pointer」 两部分。
    • 「MarkWord」:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位,gc记录信息等等。
    • 「ClassPointer」:用来指向对象对应的 Class 对象(其对应的元数据对象)的内存地址。在 32 位系统占 4 字节,在 64 位系统中占 8 字节。
  • 「2.Length」:只在数组对象中存在,用来记录数组的长度,占用 4 字节
  • 「3.Instance data」: 对象实际数据,对象实际数据包括了对象的所有成员变量,其大小由各个成员变量的大小决定。(这里不包括静态成员变量,因为其是在方法区维护的)
  • 「4.Padding」:Java 对象占用空间是 8 字节对齐的,即所有 Java 对象占用 bytes 数必须是 8 的倍数,是因为当我们从磁盘中取一个数据时,不会说我想取一个字节就是一个字节,都是按照一块儿一块儿来取的,这一块大小是 8 个字节,所以为了完整,padding 的作用就是补充字节,「保证对象是 8 字节的整数倍」

15、java 中 finalize(),类似c语言中的析构函数,介绍一下?

利用这个点,可以让即将被回收的对象可以有最后的机会逃逸。不建议使用finalize()函数。

在 Java 中,finalize() 方法是一个特殊的方法,用于在对象被垃圾收集器回收之前执行一些清理操作。这个方法具体涉及到以下几个方面:

1. 作用和用途:
  • 资源释放和清理finalize() 方法允许在对象即将被垃圾收集器回收之前执行最后的资源释放和清理操作,如关闭文件、释放网络连接等。

  • 对象状态的清理:在某些情况下,对象的状态可能需要在被回收前进行特定的清理,以避免资源泄露或其他不良影响。

2. 执行时机和注意事项:
  • 非确定性finalize() 方法的执行时机不确定,这意味着不能依赖它来进行关键资源的释放或复杂的对象状态管理。垃圾收集器在决定回收对象时,可能会调用 finalize() 方法,但并不保证一定会调用,也不能确定何时调用。

  • 性能影响:由于 finalize() 方法执行的时机不确定,可能会导致垃圾收集器的性能问题。因此,官方建议尽量避免使用 finalize() 方法,而是通过显式的资源管理(如使用 try-with-resourcesfinally 块等)来确保资源的及时释放和对象状态的正确管理。

3. 示例:

以下是一个简单的示例,展示了如何在 Java 中使用 finalize() 方法来释放对象的资源:

public class ResourceExample {private File file;public ResourceExample(String filename) {this.file = new File(filename);}@Overrideprotected void finalize() throws Throwable {try {// 关闭文件等资源释放操作if (file != null && file.exists()) {file.delete(); // 示例中的资源释放操作}} finally {super.finalize();}}public static void main(String[] args) {ResourceExample example = new ResourceExample("example.txt");// 使用 example 对象example = null; // 让对象成为垃圾收集的候选对象// 在一定条件下,垃圾收集器可能会调用 example 的 finalize() 方法System.gc(); // 手动触发垃圾收集器}
}
总结:

尽管 finalize() 方法提供了在对象被垃圾收集器回收之前执行清理操作的机会,但由于其非确定性和性能问题,官方推荐避免使用它来管理重要资源或复杂对象的状态。更好的做法是利用现代 Java 提供的自动资源管理特性(如 try-with-resources)来确保资源的及时释放和程序的可靠性。

16、垃圾回收器跟垃圾回收算法了解吗?

关于JVM必备的一些知识-CSDN博客

17、JVM调优有哪些手段?有没有实际的经验例子可以讲解?

1、对于并发情况较高,新生代对象创建销毁较为频繁的应用,可以适当调整新生代老年代内存占比,适当增大新生代空间;

2、64位的jvm开启指针压缩;

3、对于CMS fullgc 偶尔影响服务接口性能的情况,可以考虑使用G1替代;

4、cms垃圾回收器,在在业务低峰期,job检测内存占比(Runtime),手动触发fullgc;避免在业务高峰期出现fullgc影响程序接口;

18、有没有jvm相关问题分析的实际经验例子讲解一下?

1、oom问题的排查定位及解决;

2、cpu资源销毁大,线程阻塞、死锁问题排查定位及修复;

资料参考


                        
链接:https://blog.csdn.net/weixin_61440595/article/details/137505233

https://zhuanlan.zhihu.com/p/651655476

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

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

相关文章

mysql数据库的主从复制

MySQL主从复制的应用场景 当只有一台MySQL服务器要负责读写时&#xff0c;对于安全性&#xff0c;高可用&#xff0c;高并发等需求就不能满足&#xff0c;因此就要建立集群&#xff0c;集群的基础就是主从复制。 原理&#xff08;过程&#xff09; MySQL支持的复制类型 基于语…

有关主流编程语言的几个问题及对比

参考&#xff1a;编程语言的历史&#xff08;https://blog.csdn.net/david_lv/article/details/104765347&#xff09; 静态与动态语言的优缺点分析 什么是强类型&#xff0c;什么是弱类型&#xff1f;哪种更好些&#xff1f;为什么? 强类型和弱类型的区别 几种常见的开发语言…

【Kubernetes学习】

K8S基础概念一 一、k8s是什么&#xff1f;二、k8s功能三、k8s组件四、k8s概念总结 一、k8s是什么&#xff1f; kubernetes&#xff0c;简称k8s&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本…

kicad第三方插件安装问题

在使用KICAD时想安装扩展内容&#xff0c;但是遇到下载失败&#xff0c;因为SSL connect error。 因为是公司网络&#xff0c;我也不是很懂&#xff0c;只能另寻他法。找到如下方法可以曲线救国。 第三方插件包目录 打开存放第三方插件存放目录&#xff0c;用于存放下载插件包…

电子电路学习笔记(3)三极管

部分内容参考链接&#xff1a; 电子电路学习笔记&#xff08;5&#xff09;——三极管_三极管 箭头-CSDN博客 模拟电子技术基础笔记&#xff08;4&#xff09;——晶体三极管_集电结的单向导电性-CSDN博客 硬件基本功-36-三极管Ib电流如何控制Ic电流_哔哩哔哩_bilibili 部分…

【面试系列】数据工程师高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

LIDAR360MLS V7.2.0 雷达点云数据处理软件功能介绍

LiDAR360MLS 是三维要素智能提取及分析软件&#xff0c;可灵活衔接市面上主流的多型号车载、背包或手持等移动测量设备采集的激光雷达点云与影像数据。软件基于高效的海量点云数据索引结构和人工智能算法&#xff0c;进行点云数据编辑、提取、分析等处理及道路要素目标的三维矢…

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

SpringBoot:集成机器学习模型进行预测和分析

引言 机器学习在现代应用程序中扮演着越来越重要的角色。通过集成机器学习模型&#xff0c;开发者可以实现智能预测和数据分析&#xff0c;从而提高应用程序的智能化水平。SpringBoot作为一个强大的框架&#xff0c;能够方便地集成机器学习模型&#xff0c;并提供灵活的部署和…

RT-Thread ENV-Windows v2.0.0安装教程

前言 前几天RT-Thread官方更新了env工具&#xff0c;开源仓库的Kconfig的写法都不大一样了&#xff1b;如果继续用原来的env工具&#xff0c;拉新代码之后很多示例都编译不了 在最新的env工具中menuconfig全面采用kconfiglib&#xff0c;升级env脚本和python版本&#xff0c;改…

Pascal 函数入门示例,及其汇编语言分析

1&#xff0c; Pascal 函数的定义格式 pascal 函数的定义语法格式: FUNCTION 函数名(形式参数表):函数类型; VAR 函数的变量说明; BEGIN 函数体; END; 2&#xff0c;Pascal 函数定义调用示例 order_self.pas 代码&#xff1a; PROGRAM example01;va…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…

操作系统精选题(二)(综合模拟题一)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 简答题 一、进程由计算和IO操作组…

Leica Cyclone 3DR2024 一款功能强大的点云建模软件下载License获取

Leica Cyclone 3DR 2024 是一款功能强大的点云建模软件&#xff0c;使用旨在为用户提供全面的点云管理、自动化的点云分析&#xff0c;结合强大的建模&#xff0c;在一个直观友好的环境中&#xff0c;专注的完成挑战&#xff0c;提高生产力&#xff0c;轻松创建并交付专业的成果…

基于PHP技术的校园论坛设计的设计与实现-计算机毕业设计源码08586

摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统&#xff0c;以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能&#xff0c;并结合社交化特点&#xff0c;增强用户之间的互动性。通过利用PHP语言及其…

STM32F103点亮LED灯和实现LED闪烁(标准库)

芯片&#xff1a;STM32F103GCT6 原理图&#xff1a; 实现&#xff1a;PC6——闪烁&#xff0c;PC7——常亮 main.c //头文件 #include "stm32f10x.h" #include "user.h"//全局变量 uint8_t g_1s_flag 0; uint8_t g_uart1_rx_done 0;uint32_t g_ms 0…

HarmonyOS--路由管理--组件导航 (Navigation)

文档中心 什么是组件导航 (Navigation) &#xff1f; 1、Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0…

论文工具使用---connected papers

如何使用connected papers 使用方法具体功能其他资源 官网地址&#xff1a;connected papers &#xff1a;一个旨在帮助科研工作者快速搜索文献的全新工具&#xff0c;可以清晰的查看文献的引文信息&#xff0c;了解文献的引用和被引用关联。 使用方法 输入论文标题后&#xf…

IP配置SSL的方式

近年SSL证书的运用群体越来越多&#xff0c;实现网站https访问已经成为了常态。 目前SSL证书广泛应用在域名服务器上&#xff0c;所以大家最熟悉的证书类型可能就是单域名SSL证书、泛域名SSL证书&#xff08;通配符SSL证书、泛解析SSL证书&#xff09;、以及方便集成化管理的多…

# Sharding-JDBC从入门到精通(3)- Sharding-JDBC 入门程序

Sharding-JDBC从入门到精通&#xff08;3&#xff09;- Sharding-JDBC 入门程序 一、Sharding-JDBC 入门程序&#xff08;水平分表&#xff09;-环境搭建 1、需求说明 使用 Sharding-JDBC 完成对订单表的水平分表&#xff0c;通过快速入门程序的开发&#xff0c;快速体验 Sh…