Interview Notes

来源:互联网 发布:沪深300指数基金 知乎 编辑:程序博客网 时间:2024/06/09 14:49
  1. 20亿个数字存在文本中,每行一个数字,找出最大的100个数字。
    声明一个可以包含9位整数的bit数组(10亿),一共需要10亿/8=120M内存,把内存中的数据全部初始化为0 ,读取文件中的数据,并将数据放入内存。比如读到一个数据为341245909这个数据,那就先在内存中找到341245909这个bit,并将bit值置为1 ,遍历整个bit数组,将bit为1的数组下标存入文件。
    关于海量数据查找排序问题:http://blog.csdn.net/lixam/article/details/8845310
  2. forward和redirect的区别
    • 页面转发在Servlet中两种实现:
      forward方式: request.getRequestDispatcher("/somePage.jsp").forward(request, response);
      <jsp:forward page="/servlet/login" />
      redirect方式:response.sendRedirect("/somePage.jsp");
    • forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客 户,客户将再请求一次,这里多了两次网络通信的来往。forward 会将 request state , bean 等等信息带往下一个 jsp
      redirect 是送到 client 端后再一次 request , 所以资料不被保留.使用 forward 你就可以用 getAttribute() 来取的前一个 jsp 所放入的 bean 等等资料
    • forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取。
      redirect是完全的跳转,浏览器将会得到跳转的地址, 并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,forward更加高效,在forward可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。
  3. reflection的工作原理(Java)
  4. 举例说说设计模式
  5. SQL查询字符串匹配正则(mysql)
    http://myten.iteye.com/blog/1226570
  6. servlet的生命周期
    • Servlet生命周期分为三个阶段:
      1,初始化阶段 调用init()方法
      2,响应客户请求阶段  调用service()方法
      3,终止阶段  调用destroy()方法
      http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html
    • Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
      与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
    • http://blog.csdn.net/javaloveiphone/article/details/8154791
      http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html
  7. 分布式事务处理 (2PC,3PC,Paxos算法)
  8. IO
    • 同步IO(阻塞IO,非阻塞IO,IO复用,信号驱动IO)
    • 异步IO
    • IO请求,IO操作
  9. Mysql优化
  10. HTTP 原理
  11. TCP
  12. 并发与并行是两个既相似而又不相同的概念:并发性,又称共行性,是指能处理多个同时性活动的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
    并发,是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序。
    并行,是每个cpu运行一个程序。

  • 进程可创建的最大线程数
    http://biancheng.dnbcw.info/linux/276867.html
    最大线程数
    限制该值的因素:
    线程堆栈大小——》进程的最大内存——》操作系统位数
    linux线程
    查看默认的线程栈大小
    ulimit -a
    调整栈大小
    ulimit -s
    是否存在硬限制, /proc/sys/kernel/threads-max是否为硬限制?
    cat /proc/sys/kernel/threads-max: ?
    echo 12000 > /proc/sys/kernel/thread_max
    JVM线程
    JVM线程堆栈
    应用程序中的每个线程都需要内存来存储器堆栈(用于在调用函数时持有局部变量并维护状态的内存区域)。每个 Java 线程都需要堆栈空间来运行。
    根据实现的不同,Java 线程可以分为本机线程和 Java 堆栈。除了堆栈空间,每个线程还需要为线程本地存储(thread-local storage)和内部数据结构提供一些本机内存。
    JVM堆栈大小
    -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。
    在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
    JVM heap与JVM私有内存、JVM线程堆栈大小间的关系及平衡。
    线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时
    时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会
    出现内存溢出的错误.
  • 如何在windows和linux上查找哪个线程使用的cpu时间最长
    windows上面用任务管理器看,linux下可以用top 这个工具看。
    当然如果你要查找具体的进程,可以用ps命令,比如查找java:
    ps -ef |grep java
  • HTTP 301和302的区别
    301 redirect: 301 代表永久性转移(Permanently Moved)
    302 redirect: 302 代表暂时性转移(Temporarily Moved )
    301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
0 0