总结

作者: yjaal | 来源:发表于2018-05-17 22:21 被阅读79次

    1、String、StringBuffer和StringBuilder的区别

    String是不可变对象,每次对其操作都等同于生成一个新的String对象,每次操作后指针指向新的对象,当内存中存在较多无用的对象后,GC就会开始工作,导致速度很慢,而StringBufferStringBuilder每次操作都是对自己本身进行操作,两个都是利用缓冲区,这样提升了速度,但是StringBuffer是线程安全的,而StringBuilder是非线程安全的,速度会快一些。创建String对象时一般是会先在字符串常量区创建一个对象然后赋值,这里在类加载的时候是涉及到两个对象,但是在程序执行过程中是创建了一个对象。

    2、GC的概念。循环引用的对象能否被回收?

    GC就是JVM中的内存进行标记,判断哪些内存需要回收,根据一定的回收策略自动回收相关内存,防止出现内存泄漏的情况。循环应用的对象也是可以被回收的,因为GC回收对象不仅仅考虑对象是否被引用,还要看对象是否被至少一个GC roots对象直接或间接引用。这里GC roots有:
    a.每个线程当前的函数调用栈,从栈顶到栈底的每个函数里的局部变量
    b.静态变量
    c.被JNI引用的变量

    3、Java中的内存溢出是如何造成的?

    (1)首先要知道Java中的内存是如何管理的:在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上。java中对象之间的引用关系像一条链子,每分配一个新的对象,堆指针就会向后移动,当移动到内存的最终地址,内存就耗尽了,此时GC就会参与进来回收不再使用的内存,当然回收的策略有很多。
    (2)java内存泄漏其实就是不再被使用的对象的内存不能被回收。比如一个类中维护了一个对象实例,而我们希望这个实例只作用于某个方法中,但是当这个方法运行完了之后此对象占用的内存是不会被释放的,只有在类创建的实例对象被释放后此对象才能被释放,严格来说这就是一种内存泄漏,解决方法就是将类中维护的实例放到方法中去维护,这样当方法执行完后此实例也会被释放。
    (3)一般解决内存泄漏的方法就是尽量减小对象的作用域,对象不用后设置为null,还有各类close方法。如数据库连接、网络连接、IO连接,单例也会造成内存泄漏,可以使用同步解决。

    4、高并发下线程安全的单例模式

    一般单例模式有饿汉式与懒汉式,但是在多线程中极易出现线程冲突,解决方法有很多,如对单例模式进行同步,推荐的方式是双检查锁机制,其实就是首先判断是否不为空,不为空直接获取;否则就需要同步,同步之后再加一个判空来实现。当然还有维护静态实例(static和枚举都行)等方式。

    5、异常机制

    异常有很多,如文件找不到、网络连接失败等。异常Throwable分为Exception异常和Error错误。Erro是程序自己无法处理的,而Exception是程序本身可以处理的异常。Exception又分为IO异常和RuntimeException异常。而总的来说,异常分为可检查的异常,编译器要求必须处理;不可检查异常就是Error和运行时异常。运行时异常都是RuntimeException的子类。异常处理一般可以捕获和抛出,常见的运行时异常如NullPointerException UnknowTypeException、ClassNotFoundException等。

    6、HashMap中的key。

    jdk8key是可以为null的,但是不是所有对象都能作为key,比如可变对象,当使用可变对象作为key的时候很容易造成数据丢失,一般如果要将可变对象作为key,一定要保证在修改其中的某些字段的时候保证其hashcode值不变。

    7、守护线程分为用户守护线程和Daemon守护线程。

    只要当前JVM中存在任何一个非守护线程没有结束,那么守护线程就工作,守护线程最典型的应用就是GC。我们可以自己设置守护线程,但是必须在线程运行之前,我们不能将一个正在运行的线程设置为守护线程。

    8、对SQL进行优化的原则

    (1)使用索引来更快地遍历表
    (2)不能用null作索引
    (3)EXISTS要远比IN的效率高
    (4)在海量查询时尽量少用格式转换
    (5)循环中不要使用变量

    9、数据库存储引擎,存储数据结构

    ISAM读取操作快,占用资源少,但是不支持事务和容错;
    MYISAM使用表格索引机制,来优化多个并发的读写操作
    INNODB支持对事务的处理,支持外来键

    10、乐观锁、悲观锁

    悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性,但这使得数据库开销太大,特别是长事物。乐观锁大多是基于数据库版本记录机制实现的,即为数据增加一个版本标识,读取数据时将版本号一同读出,对此版本号加一,然后当前版本数据进行对比,如果版本号大于当前的版本号,则更新,否则认为是过期数据。

    java中的悲观锁和数据库中的悲观锁类似,而乐观锁是假设完成某项操作不会产生冲突,当在完成过程中发生冲突则重试,直到成功为止。

    11、Mybatis的工作原理

    查看笔记中内容。

    12、IO(BIO)与NIO、AIO(NIO2)的区别,阻塞与非阻塞的区别

    IO是同步阻塞式,就是每次只能为一个请求服务,每个请求在处理过程中会阻塞其他请求,当并发量较高时不可用,于是有了伪异步IO,这是用线程池来解决的。当某个请求没有得到响应,则会一直阻塞。
    NIO是同步非阻塞式。使用全双工通道Channel和多路复用器Selector实现,可以同时进行读写操作,Selector会不断轮询注册在其上 通道,如果哪个通道准备好了就为其服务。
    AIO是异步非阻塞式,AIO提供了异步通道,并提供了异步文件通道和异步套接字的实现,异步套接字时真正的异步非阻塞IO。这种IO的读写都是异步的。

    13、海量数据分析

    14、多线程

    Hibernate一级和二级缓存,其他缓存,事物传播行为种类,如何实现申明式事务
    restful的好处,有几种请求,表单如何提交put请求
    web中安全问题的考虑如何防止,web系统整体架构

    一、
    1、hashmap、concurrenthashmap的底层实现和区别;
    2、spring框架的原理
    3、如何写一个orm框架
    4、hibernate一级和二级缓存,其他缓存
    5、hibernate事务传播行为种类
    6、springmvc原理
    7、restful的好处
    8、restful有几种请求,表单如何提交put请求
    9、web中安全问题的考虑,如何防止
    10、web系统整体架构
    11、hibernate如何实现声明式事务
    12、java并发包
    13、volatile
    14、spring底层数据 结构
    15、如何进行反射,如何提高反射的性能
    16、如何实现java的代理,为什么需要实现接口
    18、三次握手
    19、springmvc有哪些注解

    二、
    1、什么是restful web service
    2、并发集合
    3、项目中使用的数据结构
    4、TCP中断连接四次挥手
    5、http和https
    6、知道哪些锁
    7、JVM内存
    8、springcloud相关

    相关文章

      网友评论

          本文标题:总结

          本文链接:https://www.haomeiwen.com/subject/xenidftx.html