常见JVM面试题及答案整理

2023-11-06

前言

总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。

1.什么情况下会发生栈内存溢出。

思路: 描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的demo。

我的答案:

  • 栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表又包含基本数据类型,对象引用类型
  • 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常,方法递归调用产生这种结果。
  • 如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是无法申请到足够的内存去完成扩展,或者在新建立线程的时候没有足够的内存去创建对应的虚拟机栈,那么Java虚拟机将抛出一个OutOfMemory 异常。(线程启动过多)
  • 参数 -Xss 去调整JVM栈的大小

2.详解JVM内存模型

思路: 给面试官画一下JVM内存模型图,并描述每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。

我的答案:

  • JVM内存结构

 

程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。

Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。

Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。

Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。

方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享

3.JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。

思路: 先讲一下JAVA堆,新生代的划分,再谈谈它们之间的转化,相互之间一些参数的配置(如: –XX:NewRatio,–XX:SurvivorRatio等),再解释为什么要这样划分,最好加一点自己的理解。

我的答案:

1)共享内存区划分

  • 共享内存区 = 持久带 + 堆
  • 持久带 = 方法区 + 其他
  • Java堆 = 老年代 + 新生代
  • 新生代 = Eden + S0 + S1

2)一些参数的配置

  • 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ,可以通过参数 –XX:NewRatio 配置。
  • 默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定)
  • Survivor区中的对象被复制次数为15(对应虚拟机参数 -XX:+MaxTenuringThreshold)

3)为什么要分为Eden和Survivor?为什么要设置两个Survivor区?

  • 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多,所以需要分为Eden和Survivor。
  • Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。
  • 设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)

4.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代

思路: 先描述一下Java堆内存划分,再解释Minor GC,Major GC,full GC,描述它们之间转化流程。

我的答案:

  • Java堆 = 老年代 + 新生代
  • 新生代 = Eden + S0 + S1
  • 当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到 Survivor区。
  • 大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态
  • 如果对象在Eden出生,并经过第一次Minor GC后仍然存活,并且被Survivor容纳的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过一定限制(15),则被晋升到老年态。即长期存活的对象进入老年态
  • 老年代满了而无法容纳更多的对象,Minor GC 之后通常就会进行Full GC,Full GC 清理整个内存堆 – 包括年轻代和年老代
  • Major GC 发生在老年代的GC清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上

5.你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

思路: 一定要记住典型的垃圾收集器,尤其cms和G1,它们的原理与区别,涉及的垃圾回收算法。

我的答案:

1)几种垃圾收集器:

  • Serial收集器: 单线程的收集器,收集垃圾时,必须stop the world,使用复制算法。
  • ParNew收集器: Serial收集器的多线程版本,也需要stop the world,复制算法。
  • Parallel Scavenge收集器: 新生代收集器,复制算法的收集器,并发的多线程收集器,目标是达到一个可控的吞吐量。如果虚拟机总共运行100分钟,其中垃圾花掉1分钟,吞吐量就是99%。
  • Serial Old收集器: 是Serial收集器的老年代版本,单线程收集器,使用标记整理算法。
  • Parallel Old收集器: 是Parallel Scavenge收集器的老年代版本,使用多线程,标记-整理算法。
  • CMS(Concurrent Mark Sweep) 收集器: 是一种以获得最短回收停顿时间为目标的收集器,标记清除算法,运作过程:初始标记,并发标记,重新标记,并发清除,收集结束会产生大量空间碎片。
  • G1收集器: 标记整理算法实现,运作流程主要包括以下:初始标记,并发标记,最终标记,筛选标记。不会产生空间碎片,可以精确地控制停顿。

2)CMS收集器和G1收集器的区别:

  • CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用;
  • G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用;
  • CMS收集器以最小的停顿时间为目标的收集器;
  • G1收集器可预测垃圾回收的停顿时间
  • CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
  • G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。

6.JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存。

思路: 先画出Java内存模型图,结合例子volatile ,说明什么是重排序,内存屏障,最好能给面试官写以下demo说明。

我的答案:

1)Java内存模型图:

 

Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

2)指令重排序。

在这里,先看一段代码

public class PossibleReordering {
static int x = 0, y = 0;
static int a = 0, b = 0;

public static void main(String[] args) throws InterruptedException {
    Thread one = new Thread(new Runnable() {
        public void run() {
            a = 1;
            x = b;
        }
    });

    Thread other = new Thread(new Runnable() {
        public void run() {
            b = 1;
            y = a;
        }
    });
    one.start();other.start();
    one.join();other.join();
    System.out.println(“(” + x + “,” + y + “)”);
}

运行结果可能为(1,0)、(0,1)或(1,1),也可能是(0,0)。因为,在实际运行时,代码指令可能并不是严格按照代码语句顺序执行的。大多数现代微处理器都会采用将指令乱序执行(out-of-order execution,简称OoOE或OOE)的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待3。通过乱序执行的技术,处理器可以大大提高执行效率。而这就是指令重排

3)内存屏障

内存屏障,也叫内存栅栏,是一种CPU指令,用于控制特定条件下的重排序和内存可见性问题。

  • LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
  • StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
  • LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
  • StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。 在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。

4)happen-before原则

  • 单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。 锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作。
  • volatile的happen-before原则:对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了)。
  • happen-before的传递性原则:如果A操作 happen-before B操作,B操作happen-before C操作,那么A操作happen-before C操作。
  • 线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其它方法。
  • 线程中断的happen-before原则 :对线程interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。
  • 线程终结的happen-before原则: 线程中的所有操作都happen-before线程的终止检测。
  • 对象创建的happen-before原则: 一个对象的初始化完成先于他的finalize方法调用。

7.简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。

思路: 先说明一下什么是类加载器,可以给面试官画个图,再说一下类加载器存在的意义,说一下双亲委派模型,最后阐述怎么打破双亲委派模型。

我的答案:

1) 什么是类加载器?

类加载器 就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。

  • 启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-Xbootclasspath参数指定的路径中的类库加载到内存中。
  • 其他类加载器:由Java语言实现,继承自抽象类ClassLoader。如:
  • 扩展类加载器(Extension ClassLoader):负责加载<JAVA_HOME>\lib\ext目录或java.ext.dirs系统变量指定的路径中的所有类库。
  • 应用程序类加载器(Application ClassLoader)。负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。

2)双亲委派模型

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

如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

双亲委派模型图:

 

3)为什么需要双亲委派模型?

在这里,先想一下,如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类java.lang.String的同名类,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证,因此,为什么需要双亲委派模型?防止内存中出现多份同样的字节码

4)怎么打破双亲委派模型?

打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

8.说说你知道的几种主要的JVM参数

思路: 可以说一下堆栈配置相关的,垃圾收集器相关的,还有一下辅助信息相关的。

我的答案:

1)堆栈配置相关

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k 
-XX:MaxPermSize=16m -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=0

-Xmx3550m: 最大堆大小为3550m。

-Xms3550m: 设置初始堆大小为3550m。

-Xmn2g: 设置年轻代大小为2g。

-Xss128k: 每个线程的堆栈大小为128k。

-XX:MaxPermSize: 设置持久代大小为16m

-XX:NewRatio=4: 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。

-XX:SurvivorRatio=4: 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxTenuringThreshold=0: 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。

2)垃圾收集器相关

-XX:+UseParallelGC
-XX:ParallelGCThreads=20
-XX:+UseConcMarkSweepGC 
-XX:CMSFullGCsBeforeCompaction=5
-XX:+UseCMSCompactAtFullCollection:

-XX:+UseParallelGC: 选择垃圾收集器为并行收集器。

-XX:ParallelGCThreads=20: 配置并行收集器的线程数

-XX:+UseConcMarkSweepGC: 设置年老代为并发收集。

-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。

-XX:+UseCMSCompactAtFullCollection: 打开对年老代的压缩。可能会影响性能,但是可以消除碎片

3)辅助信息相关

-XX:+PrintGC
-XX:+PrintGCDetails

-XX:+PrintGC 输出形式:

[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails 输出形式:

[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs

9.怎么打出线程栈信息。

思路: 可以说一下jps,top ,jstack这几个命令,再配合一次排查线上问题进行解答。

我的答案:

  • 输入jps,获得进程号。
  • top -Hp pid 获取本进程中所有线程的CPU耗时性能
  • jstack pid命令查看当前java进程的堆栈状态
  • 或者 jstack -l > /tmp/output.txt 把堆栈信息打到一个txt文件。
  • 可以使用fastthread 堆栈定位,fastthread.io/

10.强引用、软引用、弱引用、虚引用的区别?

思路: 先说一下四种引用的定义,可以结合代码讲一下,也可以扩展谈到ThreadLocalMap里弱引用用处。

我的答案:

1)强引用

我们平时new了一个对象就是强引用,例如 Object obj = new Object();即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

2)软引用

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

SoftReference<String> softRef=new SoftReference<String>(str);     // 软引用

用处: 软引用在实际中有重要的应用,例如浏览器的后退按钮。按后退时,这个后退时显示的网页内容是重新进行请求还是从缓存中取出呢?这就要看具体的实现策略了。

(1)如果一个网页在浏览结束时就进行内容的回收,则按后退查看前面浏览过的页面时,需要重新构建

(2)如果将浏览过的网页存储到内存中会造成内存的大量浪费,甚至会造成内存溢出

如下代码:

Browser prev = new Browser();               // 获取页面进行浏览
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用        
if(sr.get()!=null){ 
    rev = (Browser) sr.get();           // 还没有被回收器回收,直接获取
}else{
    prev = new Browser();               // 由于内存吃紧,所以对软引用的对象回收了
    sr = new SoftReference(prev);       // 重新构建
}

3)弱引用

具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

String str=new String("abc");    
WeakReference<String> abcWeakRef = new WeakReference<String>(str);
str=null;
等价于
str = null;
System.gc();

4)虚引用

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。

11.JVM知识点精华汇总

用XMind画了一张思维导图(源文件对部分节点有详细备注和参考资料,需要的朋友可以关注我的微信公众号:Java团长,然后回复“JVM”获取):

參考与感谢


作者:Jay_huaxiao
链接:https://juejin.im/post/5d35ca5b518825449c64bc31
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

常见JVM面试题及答案整理 的相关文章

  • JDBC步骤(以查询为例)

    JDBC 全称为java database connectivity 也就是Java数据库连接 这是一个Java连接SQL数据库的标准 包含了常用的API 让我们能方便的连接和管理SQL数据库 每个数据库厂商都会提供相应的JDBC驱动程序
  • js取backgroundPositionX的值

    如果有内联样式通过elem style backgroundPosition可以取得backgroundPositionX和backgroundPositionY两个值 但是如果没有内联样式通过计算样式getComputedStyle el
  • 网络原理,以及对VMware Workstation虚拟网络VMnet0、VMnet1、VMnet8的图解

    网络原理 以及对VMware Workstation虚拟网络VMnet0 VMnet1 VMnet8的图解 借鉴了 http hi baidu com whitelocus blog item d091ded88ac669e038012f5
  • Spring 启动过程,bean到底是什么时候通过反射生成实例的

    Spring 启动时最重要的方法refresh 1 在obtainFreshBeanFactory 中创建所有对象的BeanDefinition 2 在finishBeanFactoryInitialization beanFactory
  • 堆(什么是堆以及怎样自己创建堆)

    我们不必非常聪明才能改变世界 我们只需要比绝大多数人更早地认识到问题 并付诸行动 毛里茨 萨克斯 作者 不能再留遗憾了 关于作者 博主正在学习C和Java 目前有些关于leetcode刷题的专栏leetcode刷题 该专栏主要是关于数据结构
  • 深度学习apex包安装失败的问题

    文章目录 一 前言 二 正确的安装方法 2 1 从github上下载 2 2 切换到下载后的路径 2 3 进行安装 一 前言 在进行论文复现的时候 发现缺了一个重要的包 apex包 这是NVIDIA开发的基于PyTorch的混合精度训练加速
  • 【Java】RestTemplate下载远程文件到本地

    一 什么是RestTemplate RestTemplate 是 Spring 框架提供的一个用于访问 REST 服务的组件 底层对 HTTP 请求及响应进行了封装 提供了很多访问远程REST服务的方法 可简化代码开发 二 实例化RestT
  • 在同一台机器上部署多个tomcat

    文章引用地址 https www cnblogs com wryu p 7327298 html 安装tomcat步骤 1 下载apache tomcat 8 0 30 下载下来的文件为apache tomcat 8 0 30 window
  • React Native —— webstorm搭建React Native开发环境

    1 下载安装node js 安装之前检查是否已有node js环境 cmd 命令下输入node v 出现版本号 说明已经成功安装了node js环境 如下图所示 2 安装 react native 脚手架工具 如果之前全局安装过旧的reac
  • Windows Keras load_model报错及解决

    1 报错 ValueError Unknown metric function psnr superResModel load model config SUPER RES MODEL 解决 设置custom objects superRe
  • 学生派生类

    学生派生类 10 分 根据所给的类Student定义其派生类 并利用构造函数进行数据初始化 使程序能按照 样例 的格式进行输出 类定义 include
  • 机器学习_周志华_问题汇总_第2周

    问题 Q1 如果我想分析一下文本分类错误的原因 应该从哪些方面入手 可以去分析一下哪个类别错误率高 然后看看这个类别的是否不平衡 针对这个类别看看能不能进行改进 还有就是数据量过少 或是数据质量较差 比如人为标注的样本可能类别是不正确的 都
  • 构建时 flatten-maven-plugin报错问题

    ERROR Failed to execute goal org codehaus mojo flatten maven plugin 1 2 4 flatten flatten on project 构建项目时发生以上错误 最后成功解决
  • 来,创建一个高效的IMEI编码生成器

    0x1 起因 话说 今天下午群里面有个同学求助一段代码 他想问的是 这个 tempimei j 2 0x30 是啥子意思 0x2 其实这是很常见的一种写法 我们留意到 tempimei 这个变量其实是一个字符串 在 NET中 对一个字符串取
  • Yolo 推测的候选框NMS笔记

    YOLOV3 NMS笔记 1 参数 假设当前网络输入大小为416 416 分类为3个 a b c 每个YOLO层3个anchor 输入图像 img 1 3 416 416 代表这个批次内一张图片 通道为3 经过降采样最大的YOLO层后 yo
  • TortoiseGit更换用户名和密码

    选择 TortoisGit 然后选择 设置 选择 已保存数据 然后 清除 认证数据 清除后 重新 pull 拉取 数据 会让重新输入用户名和密码
  • 微信小程序授权登录,跳转页面后在跳回首页不用再次登录

    小程序授权登录要使用wx getUserProfile 获得用户投头像后 做一些页面跳转功能 但是如果需要再次跳转首页的话 小程序就会有回到登录前的状态 这样体验感会很差 要想不用再次登录 也不难 只需要判断userInfo是否还存有信息就
  • 三种方式部署单机版Minio,10行命令干就完了~

    必要步骤 安装MinIO 拉取MinIO镜像 docker pull quay io minio minio 创建文件挂载点 mkdir home docker MinIO data 文件挂载点映射 默认是 mydata minio dat
  • JS中splice的详细用法介绍

    splice 是一个用于修改数组的方法 它可以实现添加 删除或替换数组中的元素 下面是 splice 方法的中文解释 splice 方法的语法如下 array splice start deleteCount item1 item2 参数说

随机推荐

  • 推荐系统学习总结

    前段时间参加了泰迪杯数据挖掘挑战赛 选的是B题电视产品营销推荐 由于涉及到推荐系统这一块比较大的知识领域 之前没有学过 于是在比赛之初找了一些网上的资料自学了几天 有了一些初步的了解与认识 因实训的项目中推荐系统仍是很重要的一部分 故重新再
  • win7下linux 双系统安装教程,【系统安装】双系统——Win7下安装linux系统详细步骤...

    preface html 1 在Win7下安装linux系统以前 若是以前安装过linux系统 可能会遇到须要从新安装的问题 linux 由于linux系统是安装在win7系统下的一个系统盘分区中 若是须要卸载linux直接把分区删除就能够
  • VLC使用教程(一):使用VLC录制屏幕

    1 打开VLC 选择媒体 gt 打开捕获设备 2 选择捕获设备 捕获模式选择桌面 捕获期望的帧率以及更多选项中的缓冲根据需求设置 3 点击播放按钮右侧的下拉三角 选择转换 4 点击目标文件右侧的浏览 选择文件放置路径 填写MP4文件的名字
  • nova6se可以升级鸿蒙吗,EMUI11支持哪些机型 华为EMUI11适配支持机型汇总

    华为最新的EMUI11公布了 不少的用户都想试试华为最新的这个EMUI11系统 下面就来为大家分享一下华为EMUI11适配支持机型汇总 1 首批支持EMUI11 更新的机型有 P40 系列 Mate30 系列 MatePad Pro系列等
  • 打印U盘文件计算机有记录吗,技术员教你win10系统查看打印机打印历史记录的问题...

    技术员教你win10系统查看打印机打印历史记录的问题 很多朋友安装win10系统后 在使用的过程中会遇到对win10系统查看打印机打印历史记录进行设置的情况 可能有很多用户还是不能自己对win10系统查看打印机打印历史记录进行设置吧 其实简
  • 添加购物车接口

    添加购物车接口 1 判断商品是否存在 是否上架 库存足够 2 判断商品之前是否已经在购物车里 3 返回的是当前用户的所有购物车物品信息 注意 测试 controller层 获取当前用户id下的购物车信息 1 判断商品是否存在 是否上架 库存
  • 华为OD机试真题- 字符串统计-2023年OD统一考试(B卷)

    题目描述 给定两个字符集合 一个为全量字符集 一个为已占用字符集 已占用的字符集中的字符不能再使用 要求输出剩余可用字符集 输入描述 1 输入为一个字符串 一定包含 符号 前的为全量字符集 后的字为已占用字符集 2 已占用字符集中的字符一定
  • MFC——获取当前字体的高度、宽度等信息

    当我们想往屏幕上面写多行内容时 我们需要之前当前文本的宽度和高度信息 我们可以采用以下方法 void CDialogView OnDraw CDC pDC CDialogDoc pDoc GetDocument ASSERT VALID p
  • JAVA String 常用方法(超详细)

    文章目录 一 常见String类的获取功能 1 length 获取字符串长度 2 charAt int index 获取指定索引位置的字符 3 indexOf int ch 返回指定字符在此字符串中第一次出现处的索引 数字是ASCII码中对
  • Android中保存图片到本地功能实现

    本文描述将一个Bitmap对象保存为一个图片文件的主要步骤 保存的图片文件能够立刻在系统相册和图库中找到 主要步骤 这里只介绍按下 保存 后如何将一个Bitmap对象保存为图片文件的执行步骤 对图片的下载 图片到Bitmap对象的转换 Bi
  • Unity如何获取鼠标当前帧和上一帧的屏幕坐标差

    在实际开发过程中 经常用到获取鼠标当前帧和上一帧的屏幕坐标差 今天我就简单写一个框架 希望对大家有所帮助 注意在计算两帧坐标时 一定要记得把第一帧去除 否则会出现跳动 给人以不连续感觉 FR 海涛高软 Hunk Xu QQ群 3864767
  • Java中的运行时异常

    Throwable 是所有 Java 程序中错误处理的父类 有两种子类 Error 和 Exception Error 表示由 JVM 所侦测到的无法预期的错误 由于这是属于 JVM 层次的严重错误 导致 JVM 无法继续执行 因此 这是不
  • 软件工程专业计算机毕设选题推荐

    同学们好 这里是海浪学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难
  • 【MySQL数据库

    目录 编辑 前言 DML介绍 语法详情 1 插入数据 特点 1 给指定字段添加数据 代码示例 运行结果 2 给所有的字段添加数据 代码示例 运行结果 3 批量添加数据 代码示例1 运行结果1 代码示例2 运行结果2 2 修改数据 有条件的代
  • MyBatis传入参数为list、数组、map写法

    1 美图 如果传入的参数只是一个list
  • Kafka消费者之Offset、重复消费、消费者事务及消息积压

    一 offset 位移 1 1 offset 的默认维护位置 consumer offsets 主题里面采用 key 和 value 的方式存储数据 key 是 group id topic 分区号 value 就是当前 offset 的值
  • Java 对象toString()之后转化成json对象

    在平时的工作中经常遇到Java对象toString 之后打印出来 在发生线上问题时需要参数重新调用时 无法转化参数 如下图 TransOccupyRequestDTO newOrderId 390310807 transOccupyDeta
  • 手把手教你SPSS进行ROC曲线分析

    ROC曲线也叫受试者工作曲线 原来用在军事雷达中 后面广泛应用于医学统计中 ROC曲线是根据一系列不同的二分类方式 分界值或决定阈 以真阳性率 灵敏度 为纵坐标 假阳性率 1 特异度 为横坐标绘制的曲线 ROC曲线主要应用于二分类结局 比如
  • Mac上最强大好用的的右键工具「超级右键」(3)--常用目录/进入终端/iTerm

    1 常用目录 不知道大家有没有和我一样 在Mac上打开一些经常要用的文件夹的时候很烦 要么存放位置很深 如果放在桌面又显得很凌乱 这个App就很好的帮我解决了这个问题 首先 我提前设置好常用目录 要打开的时候 只需要在空白地方右击 在右键菜
  • 常见JVM面试题及答案整理

    前言 总结了JVM一些经典面试题 分享出我自己的解题思路 希望对大家有帮助 有哪里你觉得不正确的话 欢迎指出 后续有空会更新 1 什么情况下会发生栈内存溢出 思路 描述栈定义 再描述为什么会溢出 再说明一下相关配置参数 OK的话可以给面试官