Java经典面试题(其三)——JVM原理和调优

2023-05-16

Java经典面试题(其三)——JVM原理和调优

一、什么是JVM

  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

  从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:

![这里写图片描述](https://img-blog.csdn.net/20170916105051027?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别,对于JVM自身的物理结构,我们可以从下图鸟瞰一下:

![这里写图片描述](https://img-blog.csdn.net/20170916105116962?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

二、JAVA代码编译和执行过程

  Java代码编译是由Java源码编译器来完成,流程图如下所示:

![这里写图片描述](https://img-blog.csdn.net/20170916105132577?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:

![这里写图片描述](https://img-blog.csdn.net/20170916105150514?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  Java代码编译和执行的整个过程包含了以下三个重要的机制:

  • Java源码编译机制

  • 类加载机制

  • 类执行机制

  1. Java源码编译机制

  Java 源码编译由以下三个过程组成:

  • 分析和输入到符号表

  • 注解处理

  • 语义分析和生成class文件

  流程图如下所示:

![这里写图片描述](https://img-blog.csdn.net/20170916105851463?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  最后生成的class文件由以下部分组成:

  • 结构信息。包括class文件格式版本号及各部分的数量与大小的信息

  • 元数据。对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池

  • 方法信息。对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

  1. 类加载机制

  负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

![这里写图片描述](https://img-blog.csdn.net/20170916110146601?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

1). Bootstrap ClassLoader

  负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2). Extension ClassLoader

  负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3). App ClassLoader

  负责记载classpath中指定的jar包及目录中class

4). Custom ClassLoader

  属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

  1. 类执行机制

  JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:

![这里写图片描述](https://img-blog.csdn.net/20170916105916917?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

三、JVM内存管理和垃圾回收

  1. JVM内存组成结构

  JVM栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:

![这里写图片描述](https://img-blog.csdn.net/20170916110312414?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

1). 堆

  所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:

![这里写图片描述](https://img-blog.csdn.net/20170916110332231?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  • 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例

  • 旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象

  • 持久代(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。

![这里写图片描述](https://img-blog.csdn.net/20170916110347411?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
-Xmx:最大堆内存,如:-Xmx512m

-Xms:初始时堆内存,如:-Xms256m

-XX:MaxNewSize:最大年轻区内存

-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%

-XX:MaxPermSize:最大持久带内存

-XX:PermSize:初始时持久带内存

-XX:+PrintGCDetails。打印 GC 信息

 -XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3

 -XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10
 

2). 栈

  每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

  -xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。

3). 本地方法栈

  用于支持native方法的执行,存储了每个native方法调用的状态

4). 方法区

  存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值

  1. 垃圾回收

1). 引用计数(Reference Counting)

  比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

2). 标记-清除(Mark-Sweep)

![这里写图片描述](https://img-blog.csdn.net/20170916110459821?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

3). 复制(Copying)

![这里写图片描述](https://img-blog.csdn.net/20170916110509959?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

4). 标记-整理(Mark-Compact)

![这里写图片描述](https://img-blog.csdn.net/20170916110737722?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuMTAyMTg3MzkyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

  1. JVM分别对新生代和旧生代采用不同的垃圾回收机制
新生代的GC:

  新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和From Space或To Space之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代。

  在执行机制上JVM提供了串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并行GC(ParNew)

1). 串行GC

  在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定

2). 并行回收GC

  在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数

3). 并行GC

与旧生代的并发GC配合使用

旧生代的GC:

  旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。在执行机制上JVM提供了串行GC(Serial MSC)、并行GC(parallel MSC)和并发GC(CMS),具体算法细节还有待进一步深入研究。

以上各种GC机制是需要组合使用的,指定方式由下表所示:

指定方式新生代GC方式旧生代GC方式
-XX:+UseSerialGC串行GC串行GC
-XX:+UseParallelGC并行回收GC并行GC
-XX:+UseConeMarkSweepGC并行GC并发GC
-XX:+UseParNewGC并行GC串行GC
-XX:+UseParallelOldGC并行回收GC并行GC
-XX:+ UseConeMarkSweepGC && -XX:+UseParNewGC串行GC并发GC
不支持的组合-XX:+UseParNewGC -XX:+UseParallelOldGC && -XX:+UseParNewGC -XX:+UseSerialGC-XX:+UseParNewGC -XX:+UseParallelOldGC && -XX:+UseParNewGC -XX:+UseSerialGC

四、JVM内存调优

  首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。

  对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC一般由于以下几种情况:

  1. 旧生代空间不足

  调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象

  1. Pemanet Generation空间不足

  增大Perm Gen空间,避免太多静态对象

  统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间

  控制好新生代和旧生代的比例

  1. System.gc()被显示调用

  垃圾回收不要手动触发,尽量依靠JVM自身的机制

  1. 调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果

1). 新生代设置过小

  一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC

2). 新生代设置过大

  一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加

  一般说来新生代占整个堆1/3比较合适

3). Survivor设置过小

  导致对象从eden直接到达旧生代,降低了在新生代的存活时间

4). Survivor设置过大

  导致eden过小,增加了GC频率

  另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收

  1. 由内存管理和垃圾回收可知新生代和旧生代都有多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,JVM提供两种较为简单的GC策略的设置方式

1). 吞吐量优先

  JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。这个值可由-XX:GCTimeRatio=n来设置

2). 暂停时间优先

  JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。这个值可由-XX:MaxGCPauseRatio=n来设置

五、最后汇总一下JVM常见配置

  1. 堆设置
-Xms:初始堆大小

-Xmx:最大堆大小

-XX:NewSize=n:设置年轻代大小

-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

-XX:MaxPermSize=n:设置持久代大小
  1. 收集器设置
-XX:+UseSerialGC:设置串行收集器

-XX:+UseParallelGC:设置并行收集器

-XX:+UseParalledlOldGC:设置并行年老代收集器

-XX:+UseConcMarkSweepGC:设置并发收集器
  1. 垃圾回收统计信息
-XX:+PrintGC

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

-Xloggc:filename
  1. 并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  1. 并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

当你将名字输在自己代码下方的时候,说明这个项目是你的产品,你必须对你的产品质量负责,对自己的良心负责

六、文章来源于

http://www.cnblogs.com/zhangpan1244/p/6197832.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java经典面试题(其三)——JVM原理和调优 的相关文章

  • 层次狄利克雷过程HDP(Hierarchical Dirichlet Processes)

    HDP本质是一个聚类算法 xff0c 自动决定聚类的个数 HDP HMM也是一个聚类算法 xff0c 自动决定HMM的隐状态的个数 xff0c 以每个隐状态作为一个聚类 LDA是主题模型 xff0c 可以被用作聚类算法 HDP也是个主题模型
  • vscode离线安装插件方法

    在实际工作中 xff0c 由于大多开发环境为内网开发 xff0c 无法连接外网 xff0c 需要进行离线安装相应插件 xff0c 此文用于记录vscode离线安装插件方法 1 方法一 xff1a 到vscode官网 https market
  • AD--------简单规则的设定

    这学期打了好多块板子 xff0c 都是在大佬的帮助下弄得 xff0c 嘿嘿嘿 xff0c 以后得多多练习 AD的规则设定 xff0c 反正对于英文不好的我来说还是比较难得 xff0c 但是现在画的板子规则设定都比较简单 rules 最小间距
  • linux系统编程中的信号量--模拟生产者与消费者

    FileName producer and customer c description This app demonstrates how to use the semaphore solve the problem about the
  • MySQL数据库索引相关知识

    目录 定义重点 存储原理B TreeB 43 TreeMyISAMInnoDB主键使用自增整形主键联合索引 原则那些情况应当创建索引不适合见索引 定义 索引时帮助MySQL高效获取数据的数据结构 简单说 xff1a 排好序的快速查找数据结构
  • 解决Mac M1环境下使用Goland debug失败的问题

    问题描述 xff1a 在m1环境下 xff0c 使用GoLand工具 xff0c 项目可以正常Run xff0c 但无法Debug运行 error could not launch process can not run under Ros
  • 解决“java.sql.SQLException: Expression #1 of ORDER BY clause is not in SELECT list,references column”

    在一次跑项目的时候 xff0c 报了这个错 分析原因 xff1a 百度发现是Mysql5 7及以上版本默认将 sql mode 的 ONLY FULL GROUP BY 模式设置为打开状态 解决办法 xff1a 1 将数据库换回5 6及以下
  • Lottie动画使用及原理分析

    1 Lottie是什么 xff1f Lottie是Airbnb开源的一个动画渲染库 xff0c 支持多平台 xff0c 包括iOS Android React Native以及Flutter xff08 https github com a
  • Windows Vista 下载

    Windows Vista 下载 简介 xff1a 2005年7月22日 xff0c 微软宣布 Windows Vista 为这款新操作系统的名字 微软于2006 年11月2日完成GA版本 xff0c 向OEM和企业用户发布 2007年1月
  • ubuntu 安装VS 转

    以下文字转 在ubuntu 安装VS 人生不过一闭一睁的博客 CSDN博客 ubuntu安装vs2017 able of Contents 一 前言 二 安装过程 1 下载VS Code 2 安装过程 3 下载C 43 43 模块 4 汉化
  • SQL2000 好书 《SQL Server 2000数据库管理与开发技术大全》----求是科技 人民邮电出版社

    SQL2000 好书 SQL Server 2000数据库管理与开发技术大全 求是科技 人民邮电出版社
  • 小米 pro 笔记本拆机-加固态

    前言 小米 pro 笔记本 256G 的固态 xff0c 有点不够用 xff0c 因此想加装固态 网上一打听 xff0c 拆机加固态售后要 100 元人民币 这哪行呀 不能这么便宜小米了 xff0c 100块我都不给你 xff01 准备工作
  • android四大组件之Activity - (2)onNewIntent()的作用

    要说onNewIntent 就不得不提到Activity的四种启动模式 分别是 1 standard 标准模式 也是系统默认的模式 每次都会新建Activity放置任务栈中 2 singleTop 模式 这个模式能够确保每次使用的Activ
  • 解决谷歌无法加载扩展程序

    方法一 1 先将下载的文件 crx格式修改为 zip 2 然后解压zip格式文件 3 选择加载解压过的zip文件 即可 方法二 1 在Google Chrome浏览器的桌面快捷方式上鼠标右键 xff0c 选择属性 R xff0c 进入如下界
  • 好玩的CMD几个命令

    1 msg命令 如果是在局域网中使用msg命令可以达到恶作剧的效果 msg server 192 168 1 26 东东是个人物 xff01 server 这里输入要发送人的IP地址 后面是输出的文字 2 Nslookup 检查网站的ip地
  • MySQL数据库使用相关语句

    目录 MySQL数据库的安装位置创建命令建库查看插入 编码格式配置文件修改数据库外网权限索引 MySQL数据库的安装位置 etc my cnf mysql配置文件 usr bin 客户端程序和脚本 usr sbin mysqld 服务器 v
  • C++筛法求素数

    假定题目为输出n以内的所有素数 一般方法 最容易理解的一个方法 xff0c 从0遍历到根号n判断n是否能被整除 使用时只需要记住判断到根号n就可以了 但是时间复杂度是o xff08 n sqrt xff08 n xff09 xff09 xf
  • 七 对话框

    1 模态与非模态对话框 模态对话框创建 CTestDlg dlg dlg DoModal 非模态对话框的创建 CTestDlg pDlg 61 new CTestDlg pDlg gt Create IDD DIALOG1 this pDl
  • 如何保证缓存与数据库的一致性

    关系型数据库系统给我们带来许多惊艳的特性 xff0c 例如 xff1a ACID 但为了维护这些特性 xff0c 数据库的性能在高负载下也会下降 为了提高性能 xff0c 通常会在项目的应用层 xff08 处理业务逻辑 xff09 和存储层
  • linux自定义图标主题目录及启动路径

    启动图标 就是按windows键出现一大堆应用的快捷方式 xff08 xxxx desktop xff09 目录 xff1a usr share applications 图标文件目录 xff1a usr share icons

随机推荐

  • Centos7 yum升级内核

    1 查看当前内核版本 uname r 3 10 0 1160 25 1 el7 x86 64 uname a Linux localhost localdomain 3 10 0 1160 25 1 el7 x86 64 1 SMP Wed
  • Ubuntu上安装Git

    1 安装git span class token function apt get span span class token function install span span class token function git span
  • AE或PR2020版本驱动程序或显卡不兼容问题解决

    AE或PR2020版本驱动程序或显卡不兼容问题解决 建议系统提前备份 xff0c 防止后期出错 驱动程序不兼容 xff1a AE为例 1 点击修复 gt 跳转到浏览器界面 gt 建议驱动程序版本 xff08 27 20 100 8476 或
  • Qt调用js和js交互, QWebengine调用js

    QWebengine 调用js有两种方式 通过QWebChannel调用 写一个类然后继承QObject用于和js进行通信交互 ifndef TINTERACT OBJECT H define TINTERACT OBJECT H incl
  • LinuxMint KDE任务栏消失恢复

    桌面右击 gt 添加面板 gt 添加默认面板 就恢复了
  • 神奇的输入法——小狼毫——个性化设置

    电脑硬盘坏了 xff0c 重新换了硬盘 xff0c 自然就要把软件重新安装一遍 个人喜欢用 五笔输入法 xff0c 之前一直用的 极点五笔 xff0c 但是它一直没有更新 偶然间搜索到了 小狼毫 xff0c 用户评价都不错 xff0c 果断
  • MySQL explain字段总结

    目录 作用表组成id xff08 表的读取顺序 xff09 select type xff08 数据读取操作的操作类型 xff09 字段 type字段 possible key xff08 那些索引可以使用 xff09 key xff08
  • 查找 替换 细节

    查找内容 可以快速搜索每一处指定单词或词组 1 单击 编辑 菜单中的 查找 命令 2 在 查找内容 框内键入要查找的文字 3 选择其他所需选项 若要一次选中指定单词或词组的所有实例 xff0c 请选中 突出显示所有在该范围找到的项目 复选框
  • Anaconda和pip异常

    一 Anaconda异常 1 No module named unicodedata 正常使用时出现这个问题 xff0c 与其想着怎么解决 xff0c 不如直接重装python环境或者试试卸载并重新安装pip 卸载并重新安装pip请参考博客
  • Linux下批量替换tab到空格的转换

    将所有文件中的tab批量替换为空格 find type f exec sed i orig 39 s t g 39 43 其中 34 t 34 后面跟的是空格的数量 xff0c 我这里是4个空格 原链接 xff1a https stacko
  • fegin调用的时候数据格式转换为linkedhashmap

    在spring cloud项目开发中 xff0c 使用fegin进行远程调用 1 接口服务方返回类型为Map String Object 类型 2 接口调用方返回值类型也是Map String Object 3 通过fegin调用之后返回的
  • 在虚拟机上运行vxWorks

    Vxworks是一个嵌入式系统 xff0c 主要运行在arm ppc mips等嵌入式处理器上 xff0c 它同样可以运行在X86处理器上 风河公司开发的tornado开发环境就 包括了pentium版本 xff0c 并且发布了相应的bsp
  • 点乘和叉乘

    向量点乘 xff08 内积 xff09 和叉乘 xff08 外积 向量积 xff09 向量 向量是由n个实数组成的一个n行1列 xff08 nX1 xff09 或一个1行n列 xff08 1Xn xff09 的有序数组 xff1b 点乘 向
  • ​​Linux下ps -ef和ps aux的区别及格式详解​

    Linux下显示系统进程的命令ps xff0c 最常用的有 ps ef 和 ps aux 这两个到底有什么区别呢 xff1f 两者没太大差别 xff0c 讨论这个问题 xff0c 要追溯到Unix系统中的两种风格 xff0c System
  • Windows命令行操作

    打开 win 43 r然后输入cmd回车 命令 cd进入命令 dir显示命令
  • JDK源码之-java.lang.Object

    JDK源码之 java lang Object public final native Class lt gt getClass public native int hashCode public boolean equals Object
  • Docker安装Elasticsearch的遇到的那些坑

    1 根据百度到的一篇文章 https segmentfault com a 1190000004376504 下载其最新镜像 hangxin1940 docker elasticsearch cn v2 1 0 使用 docker run
  • APScheduler Execution of job “***“ skipped: maximum number of running instances reached (1)

    错误原因 有错误提示所说 xff0c 因为超过了最多实例个数 xff0c APScheduler的默认最大实例个数为1 xff0c 导致之后任务调用阻塞 xff0c 无法进行执行 解决办法 提高代码效率 xff0c 缩短代码运行时间 延长定
  • Spring boot + Spring Security + Thymeleaf 认证失败返回错误信息

    Spring boot 43 Spring Security 43 Thymeleaf 认证失败返回错误信息 Spring boot以其众多友谊的特性 xff0c 如零配置 微服务等 xff0c 吸引了很多的粉丝 而其与Spring Sec
  • Java经典面试题(其三)——JVM原理和调优

    Java经典面试题 xff08 其三 xff09 JVM原理和调优 一 什么是JVM JVM是Java Virtual Machine xff08 Java虚拟机 xff09 的缩写 xff0c JVM是一种用于计算设备的规范 xff0c