问题摘录

1. 一致性hash

一致性hash算法
分布式系统常用的宕机移除和新机器加入的算法
把每个节点计算的hash值mod 2^31 - 1, 加入一个hash环
为防止数据倾斜等问题,加入虚拟节点的概念, 每次都对新加入的节点虚拟化,使其尽可能均匀的分布在环上

当有一个输入进来, 使用treemap找到下一个节点

 

2. java有了基本类型的包装类为什么还要有基本类型

我们都知道在Java语言中,new一个对象存储在堆里,我们通过栈中的引用来使用这些对象;但是对于经常用到的一系列类型如int,如果我们用new将其存储在堆里就不是很有效——特别是简单的小的变量。所以就出现了基本类型,同C++一样,Java采用了相似的做法,对于这些类型不是用new关键字来创建,而是直接将变量的值存储在栈中,因此更加高效

 

3. HTTPS和HTTP的主要区别

        1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

        2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。

        3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

        4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

 

4.  为什么要3次握手,4次挥手
        3次握手: 防止已过期的连接请求报文突然又传送到服务器,因而产生错误
        4次挥手: 确保数据能够完成传输,但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必会马上关闭socket,也就是说你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下是分开发送的

 

5. TCP拥塞控制-慢启动、拥塞避免、快重传、快恢复

 

6.DNS是什么?工作方式?
        概念,域名解析,将www.xxx.com转换成ip,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的ip地址
        DNS协议运行在UDP协议之上,使用端口号53
        主机解析域名的顺序
          1. 浏览器缓存; 2. 找本机的hosts文件; 3. 路由缓存; 4.找DNS服务器(本地域名、顶级域名、根域名)

 

7.HTTP  header  
        HTTP请求: 
        GET /books/java.html HTTP/1.1
         Accept: */*
        Accept-Language: en-us
        Connection: Keep-Alive
         Host: localhost
         Referer: http://localhost/links.asp
         User-Agent: Mozilla/4.0
        Accept-Enconding: gzip, deflate

 

       HTTP响应:
       HTTP/1.1 200 OK    
       Server: Microsoft-IIS/5.0
       Date: Thu, 13Jul 2000 05:46:53 GMT
       Content-Length: 2291
       Content-Type: text/html
       Cache-control: private

 

8.MySQL引擎有什么?有什么差异?

        主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:

        一、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;

        二、InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 where  user like '%lee%'

        三、MyISAM索引文件和数据文件是分离的,索引文件的data域保存记录所在页的地址(物理存储位置),通过这些地址来读取页,进而读取被索引的行数据。

        四、InnoDB存储引擎表是索引组织表,即按照主键的顺序存储数据。与 MyISAM相同的一点是,InnoDB 也采用 B+Tree这种数据结构来实现 B-Tree索引。而很大的区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引,聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据也就是数据行和相邻的键值紧凑地存储在一起。

 

9. Linux进程状态

        Linux进程状态:R (TASK_RUNNING),可执行状态。 (运行态和就绪态)

        Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态。

        Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。(kill -9 杀不死, 不可中断)

        与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将惊奇的发现,kill -9竟然杀不死一个正在睡眠的进程了!于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。 而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的

        Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。

        向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数)向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态。

        Linux进程状态:Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。

        进程在退出的过程中,处于TASK_DEAD状态。在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。

        Linux进程状态:X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。

 

        10.LINUX进程进入等待状态

       进程等待必要性

              1.子进程退出,父进程如果不知道子进程退出,就可能造成“僵尸进程”的问题,这就是内存泄露。 
              2.一旦子进程变成了僵尸进程,KILL - 9也无能为力,没有办法去杀死一个已经死去的进程 
              3.子进程是父进程为了完成任务而生成的,派发给子进程的任务是否完成了,完成的怎么样,父进程都不知道。父进程需要知道该情况。 
              4.父进程通过等待的方式,回收子进程的资源,获取子进程退出信息

       进程等待方法

              API:pid_t wait(int *status)

              wait一直阻塞,直到有一个子进程死亡,称为僵尸进程,回收掉僵尸。 
              返回值:成功:wait返回子进程pid 
              失败 返回 -1 
              status:得到子进程的死亡信息

 

        11. mysql写 Binlog 的时机

        写 Binlog 的时机

        对支持事务的引擎如InnoDB而言,必须要提交了事务才会记录binlog。binlog 什么时候刷新到磁盘跟参数 sync_binlog 相关。

  • 如果设置为0,则表示MySQL不控制binlog的刷新,由文件系统去控制它缓存的刷新;
  • 如果设置为不为0的值,则表示每 sync_binlog 次事务,MySQL调用文件系统的刷新操作刷新binlog到磁盘中。
  • 设为1是最安全的,在系统故障时最多丢失一个事务的更新,但是会对性能有所影响。

       

        12. JVM内存划分

        方法区+堆区——线程共享的(所有线程只有一个方法区/堆区,共享使用)

        jvm栈+本地方法栈+程序计数器——线程私有的(每个线程都有一个)

        方法区:存储类信息和方法信息。具体包括:方法、成员变量、全局变量(static修饰)、常量

        堆区:存储new出来的对象

        注:jvm垃圾回收区域主要是堆区,由程序员申请和释放,如果程序员没有释放,将一直存在直至程序运行结束。

        虚拟机栈:虚拟机栈是用于描述java方法执行的内存模型。每个java方法在执行时,会创建一个“栈帧(stack frame)”,栈帧的结构分为“局部变量表、操作数栈、动态链接、方法出口”几个部分(具体的作用会在字节码执行引擎章节中讲到,这里只需要了解栈帧是一个方法执行时所需要数据的结构)。我们常说的“堆内存、栈内存”中的“栈内存”指的便是虚拟机栈,确切地说,指的是虚拟机栈的栈帧中的局部变量表,因为这里存放了一个方法的所有局部变量。

        本地方法栈: 本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。

        13. JVM垃圾回收机制

        1、垃圾回收器(Garbage collection,GC)

                垃圾回收机制是jvm自带的一个线程,用于回收没有被引用的对象。

        2、需要垃圾回收的区域:

                只有方法区与堆。因为程序计数器、JVM栈、本地方法栈的生命周期是和线程同步的,随着线程的销毁,它们占用的内存会自动释放,所以只有方法区和堆需要进行垃圾回收。

        3、垃圾回收算法(4种):

  1. 标记-清除算法
  2. 复制算法
  3. 标记-整理算法
  4. 分代收集算法(重要)

        4、常见的垃圾收集器:

 

       5、JVM的分代收集算法:

       堆被分成许多称为代的部分,每个部分根据“年龄”来保存对象。

       分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为多个区域。一般情况下将堆区划分为新生代、老年代,在堆区之外还有一个代就是永久代。新生代每次会回收大量对象垃圾,而老年代每次会回收少量对象垃圾,那么就可以根据不同代的特点采取最适合的收集算法。

       **新生代:用于存放新创建的对象。绝大多数新创建的对象会被分配到这里,大部分对象在创建之后会变得很快不可达。 -----复制算法 (Minor GC| YGC, stop the world时间短)

       **老年代:在新生代中经历了N次垃圾回收后仍然存活的对象,就会被复制到老年代中。因此,老年代中存放的都是一些生命周期较长的对象。-----标记-整理算法或标记-清除算法(Full GC, stop the world 时间长)

       **永久代:永久代也称方法区。用于存放静态文件,如类、方法、成员变量、全局变量等。永久代对垃圾回收没有显著影响。1.8之后变成了Metaspace

       6、如何判断对象是否是垃圾

       使用两种算法判断:(1)程序计数器 (2)可达性分析(相比于第一种更常用)

 

        13. JVM类加载机制

       类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。

       加载:查找并加载类的二进制数据

       验证:确保被加载的类的正确性

       准备:为类的静态变量分配内存(也就是在虚拟机栈中),并将其初始化为默认值

       解析:把类中的符号引用转换为直接引用

       初始化: 为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。在Java中对类变量进行初始值设定有两种方式:

  ①声明类变量是指定初始值

  ②使用静态代码块为类变量指定初始

       

       

       14.双亲委派机制

       双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值