zoukankan      html  css  js  c++  java
  • 面试题:已看1

    面试题
    1、String和StringBuffer的区别
    2、gc的概念,如果A和B对象循环引用,是否可以被GC?
    3、Java中的内存溢出是如何造成的

     Java堆溢出

    1.1 模拟场景

    Java堆用于存储对象,只要不断的创建对象,并保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,

    那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。

    2.虚拟机栈和本地方法栈溢出

    HotSpot虚拟机中不区分虚拟机栈和本地方法栈。栈容量用-Xss参数设定。Java虚拟机规范中描述了两种异常:

    • 如果线程请求的栈深度大于虚拟机锁允许的最大深度,将抛出StackOverflowError异常。
    • 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
    • 3.方法区和运行时常量池溢出

      3.1 运行时常量区溢出


    4、String s = “123”;这个语句有几个对象产生
    5、Error、Exception和RuntimeExcepti

    on的区别,作用又是什么?
    6、列举3个以上的RuntimeException
    7、reader和inputstream区别
    8、hashCode的作用

    以上这段官方文档的定义,我们可以抽出成以下几个关键点:

    1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;

    2、如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;

    3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;

    4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。


    9、Object类中有哪些方法,列举3个以上(可以引导)
    10、char型变量中能不能存贮一个中文汉字?为什么?
    11、列举几个Java Collection类库中的常用类
    12、List、Set、Map是否都继承自Collection接口?
    13、HashMap和Hashtable的区别
    14、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求?

    可以、但是要key对象必须是不可变的对象,不然在Entry被插入Map中后,再改变key值,会导致当前key值与hash值不符合,即与数组索引不符,将无法被查找到
    15、interface 和 abstrat class的区别 是否可以继承多个接口,是否可以继承多个抽象类
    16、 启动一个线程是用run()还是start()? 多线程有几种实现 同步和并发是如何解决的 什么叫守护线程,用什么方法实现守护线程(Thread.setDeamon()的含义) 如何停止一个线程? 解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

    后台线程如其名,就是在后台工作的线程,它的任务是为其他线程提供服务,也叫做“守护线程”与“精灵线程”。通过在start()方法调用前,调用setDeamon(true)方法,将线程设置为后台线程。后台线程会在前台线程死亡后由JVM通知死亡。

    后台线程最大的应用就是垃圾回收线程,它是一个典型的后台线程。
    两个线程对一个变量进行操作,但是没有上锁,即没有进行同步操作,就像买车票的时候多个窗口一起卖,但是车票数没有减去。车票被重复卖出
    。就是不安全。还有,被多个线程操作的变量改为静态量加static,才安全


    17、了解过哪些JDK8的新特性,举例描述下相应的特性?
    18、对sql进行优化的原则有哪些?

    https://www.cnblogs.com/xiaomifeng/p/4655317.html

    20、StringBuffer有什么优势?为什么快?

    StringBuffer是可以改变的字符串,而String是不可改变的。每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,就要为该对象分配新的空间。当要对字符串重复修改时,创建新的String对象相关的系统开销很大,就是要修改字符串而不创建新的对象,则用StringBuffer

    other
    谈谈你对HashMap的理解,底层原理的基本实现,HashMap怎么解决碰撞问题的?
    开发中用了那些数据库?回答mysql,储存引擎有哪些?然后问了我悲观锁和乐观锁问题使用场景、分布式集群实现的原理。
    springmvc和mybatis的工作原理,有没有看过底层源码?
    熟悉IO么?与NIO的区别,阻塞与非阻塞的区别
    微信红包怎么实现。

    抢红包过程

    当有人在群里发了一个N人的红包,总金额M元,后台大概发生的事情如下:

    一、发红包后台操作:

    1. 在数据库中增加一条红包记录,存储到CKV,设置过期时间;

    2. 在Cache(可能是腾讯内部kv数据库,基于内存,有落地,有内核态网络处理模块,以内核模块形式提供服务))中增加一条记录,存储抢红包的人数N

    二、抢红包后台操作:

    1. 抢红包分为抢和拆,抢操作在Cache层完成,通过原子减操作进行红包数递减,到0 就说明抢光了,最终实际进入后台拆操作的量不大,通过操作的分离将无效请求直接挡在Cache层外面。这里的原子减操作并不是真正意义上的原子减操作,是 其Cache层提供的CAS,通过比较版本号不断尝试,存在一定程度上的冲突,冲突的用户会放行,让其进入下一步拆的操作,这也解释了为啥有用户抢到了拆 开发现领完了的情况。

    2. 拆红包在数据库完成,通过数据库的事务操作累加已经领取的个数和金额,插入一条领取 流水,入账为异步操作,这也解释了为啥在春节期间红包领取后在余额中看不到。拆的时候会实时计算金额,其金额为1分到剩余平均值2倍之间随机数,一个总金 额为M元的红包,最大的红包为 M * 2 /N(且不会超过M),当拆了红包后会更新剩余金额和个数。财付通按20万笔每秒入账准备,实际只到8万每秒。

    FAQ

      1. 既然在抢的时候有原子减了就不应该出现抢到了拆开没有的情况?
        这里的原子减并不是真正意义上的原子操作,是Cache层提供的CAS,通过比较版本号不断尝试。

      2. cache和db挂了怎么办?
        主备 +对账

      3. 有没有红包个数没了,但余额还有情况?
        没有,程序最后会有一个take all操作以及一个异步对账保障。

      4. 为什么要分离抢和拆?
        总思路是设置多层过滤网,层层筛选,层层减少流量和压力。这个设计最初是因为抢操作是业务层,拆是入账操作,一个操作太重了,而且中断率高。 从接口层面看,第一个接口纯缓存操作,搞压能力强,一个简单查询Cache挡住了绝大部分用户,做了第一道筛选,所以大部分人会看到已经抢完了的提示。

      5. 抢到红包后再发红包或者提现,这里有什么策略吗?
        大额优先入账策略

      6. 有没有从数据上证明每个红包的概率是不是均等?
        不是绝对均等,就是一个简单的拍脑袋算法。

      7. 拍脑袋算法,会不会出现两个最佳?
        会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。

      8. 发红包人的钱会不会冻结?
        是直接实时扣掉,不是冻结。

      9. 采用实时算出金额是出于什么考虑?
        实时效率更高,预算才效率低下。预算还要占额外存储。因为红包只占一条记录而且有效期就几天,所以不需要多大空间。就算压力大时,水平扩展机器是。


    海量数据分析。
    线程安全和非线程安全。
    HTTP2.0、thrift。
    java反射应用
    分布式事务一致性。
    nio的底层实现。
    jvm基础是必问的,jvm GC原理,JVM怎么回收内存。
    dubbo如何一条链接并发多个调用。Dubbo的原理,序列化相关问题。
    用过哪些中间件。
    做过工作流引擎没有。
    以前的工作经历,自己觉得出彩的地方
    线程池的一些原理,锁的机制升降级
    从系统层面考虑,分布式从哪些纬度考虑
    Hadoop底层怎么实现
    threadLocal,线程池,hashMap/hashTable/coccurentHashMap等
    秒杀系统的设计
    虚拟机,IO相关知识点
    Linux的命令
    一个整形数组,给定一个数,在数组中找出两个数的和等于这个数,并打印出来,我写的时间复杂度高,要求O(n)。
    n个整数,找出连续的m个数加和是最大。
    更重视开源技术
    数据库锁隐原理
    1000个线程同时运行,怎么防止不卡
    并列的并发消费问题)

    线程越多,上下文切换所消耗的时间也就越多,因此不建议开大量线程,一种方法是用线程池,另一种方法是重新规划算法逻辑,用尽量少的线程处理。
    高并发量大的话怎么处理热点,数据等
    如何获取一个本地服务器上可用的端口
    流量控制相关问题
    数据库TPS是多少,是否进行测试过
    缓存击穿有哪些方案解决
    Java怎么挖取回收器相关原理
    Java的集合都有哪些,都有什么特点
    分布式锁,redis缓存,spring aop,系统架构图,MySQL的特性
    场景,同时给10万个人发工资,怎么样设计并发方案,能确保在1分钟内全部发完 打个比方会提出类似的场景



  • 相关阅读:
    [转载]Jupyter Notebook 的快捷键
    【转载】mysql行列转换方法总结
    【Deep Learning Nanodegree Foundation笔记】第 10 课:Sentiment Analysis with Andrew Trask
    赵铁夫讲单词·解密单词的潜规则【2016全新精华版】
    【转载】ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
    [IJCAI-17 口碑商家客流量预测]
    【Deep Learning Nanodegree Foundation笔记】第 9 课:Model Evaluation and Validation
    【Deep Learning Nanodegree Foundation笔记】第 5 课:Logistic Regression
    不用动笔背单词之托福
    Jenkins--02命令行构建Job
  • 原文地址:https://www.cnblogs.com/shan1393/p/9112512.html
Copyright © 2011-2022 走看看