面试

如何定位生产问题原因,并列举开发过程中常见的问题及处理方案。

1. 找到问题的大概发生时间。对于App或小程序问题,有截图的话可以从截图上看到问题发生的详细时间;没有截图,可以通过业务或者客户反馈问题的时间,推断问题发生的时间。
2. 下载或者直接查看生产日志,通过查找上下文或者当前操作关键字的方法,找到生产问题发生时间的日志。如果是页面有报错的,可以直接在问题发生时间范围内查找error或者exception日志。
3. 认真分析代码,找到出问题的代码逻辑。通过打印日志或者客户执行的而操作,找到产生生产问题的代码片段。仔细分析代码,看什么情况下会导致问题的产生,如果有多个答案,可以一一分析排除。
4. 找到产生问题的原因,并快速解决客户问题,尽量避免解决不彻底。找到问题原因后,先看怎么快速帮助客户解决问题,优先考虑不需要客户操作的方式解决,比如后台修改数据,以提高客户体验。解决客户问题后,需要检查是否还有其他客户也存在此问题,有没有版本规避。如果根因未找到,则还需要继续定位。
5. 如果以上方法未能定位出问题,考虑是否可以在准生产重现此问题 。
6. 如果以上方法仍未能定位出问题,向上级或者高手求助,一起定位 。

抽象类和接口有什么区别?

答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即 将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

至少列出5种你所熟知开发模式,列出名称即可。

Factory(工厂模式),      Builder(建造模式),      Factory Method(工厂方法模式), 
Prototype(原始模型模式),Singleton(单例模式),    Facade(门面模式), 
Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式), 
Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式), 
Command(命令模式),      Interpreter(解释器模式), Visitor(访问者模式), 
Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式), 
Observer(观察者模式),   State(状态模式),         Strategy(策略模式), 
Template Method(模板方法模式),  Chain Of Responsibleity(责任链模式)

Mybatis中#{}和${}的区别是什么?

 #{}:占位符号,好处防止sql注入

  ${}:sql拼接符号

什么是内存溢出和内存泄漏?

1、内存溢出:(Out Of Memory---OOM)

 系统已经不能再分配出你所需要的空间,比如系统现在只有1G的空间,但是你偏偏要2个G空间,这就叫内存溢出
例子:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。

比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出。说白了就是我承受不了那么多,那就报错。

2、内存泄漏:  (Memory Leak)
强引用所指向的对象不会被回收,可能导致内存泄漏,虚拟机宁愿抛出OOM也不会去回收他指向的对象
意思就是你用资源的时候为他开辟了一段空间,当你用完时忘记释放资源了,这时内存还被占用着,一次没关系,但是内存泄漏次数多了就会导致内存溢出

例子:你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。

比如我们在使用ThreadLocal的时候可能就会发生内存泄露,什么是ThreadLocal,


一般我们所说的内存泄漏指的是堆内存的泄露,堆内存是指程序从堆中分配的,大小随机的用完后必须显示释放的内存,C++/C中有free函数可以释放内存,java中有垃圾回收机制不用程序员自己手动调用释放
如果这块内存不释放,就不能再用了,这就叫这块内存泄漏了

Spring中有几种配置方式

将 Spring 配置到应用开发中有以下三种方式:

基于xml配置:通常一开头
基于注解配置:@Controller @Service @Autowired @RequestMapping @RequestParam @ModelAttribute @Cacheable @CacheFlush @Resource @PostConstruct @PreDestroy @Repository @Scope @SessionAttributes @InitBinder @Required @Qualifier
基于java配置:@Configuration、@Bean,当然,也兼容第二种形式

final关键字可以用来修饰引用、方法和类。

Mapreduce的优缺点

Mapreduce的优缺点
1:优点
Mapreduce易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个程序可以分布到大量的廉价的pc机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特性使的Mapreduce编程变得非常流行。
良好的扩展性
项目当你的计算资源得不到满足的时候,你可以通过简单的通过增加机器来扩展它的计算能力
高容错性
Mapreduce的设计初衷就是使程序能够部署在廉价的pc机器上,这就要求它具有很高的容错性。比如一个机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由hadoop内部完成的。
适合PB级以上海量数据的离线处理
2:缺点
不擅长实时计算
Mapreduce无法做到像Mysql那样做到毫秒或者秒级的返回结果
不擅长流式计算
流式计算的输入数据是动态的,而Mapreduce的输入数据集是静态的,不能流态变化。这是Mapreduce自身的设计特点决定了数据源必须是静态的。
不擅长DAG(有向图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个应用程序的输出,在这种情况下,Mapreduce并不是不能做,而是使用后每个Mapreduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下。

tomcat启动命令

查看启实时动日志。=====》 tail -f catalina.out
后台启动 tomcat 命令 ====》nohup ./startup.sh &

基础配置

%JAVA_HOME%\bin;

MAVEN_HOME

%MAVEN_HOME%\bin;

ANT_HOME

%ANT_HOME%\bin;

D:\JavaTools\apache-ant-1.9.15

mvn clean install -DskipTests -Pfast

yum安装程序

1.备份现有repo仓库
命令:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2.下载并使用阿里云仓库repo
命令:curl -o /etc/yum.repos.d/CentOS-Base.repo https://www.xmpan.com/Centos-6-Vault-Aliyun.repo

3.更新yum
命令1:yum clean all

命令2:yum makecache

4.用yum安装软件
命令: yum -y install 软件名称

说明:1.我使用的是centsos6.7,如果不是6没成功的话需要去官网重新改下步骤2的命令
2.尽量在Linux里面进行安装,Linux连接工具里面安装速度会比较慢

判断101-200之间有多少个质数,并输出所有质数.

package com.google.g;

public class Demo {

    public static void main(String[] args) {
        test13();
    }

    public static void test13() {
        int count = 0;

        for (int i = 101; i < 200; i++) {
            boolean b = false;
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    b = false;
                    break;
                } else {
                    b = true;
                }
            }
            if (b) {
                count++;
                System.out.print(i + "\t");
            }
        }
        System.out.println("一共有" + count + "个素数");
    }
}

error和exception的区别

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。
posted @ 2023-02-14 10:55  Sunray0330  阅读(55)  评论(0编辑  收藏  举报