• 一些看起来容易却忽视原理的知识


    1.hashcode

    hashcode是通过hash函数放回的一个int值,在对象的equals是,必须重写hashcode。因为对象的hashcode就类似一个MD5的加密值,只要这个值相等,对象肯定相等,而不用通过equal比较(equals比较就是一个属性一个属性的比对,效率太低,而hashcode就是计算的一个散列,一步就可以比较)。但是前提是生成hashcode的hash函数要没有冲突,所以,一般情况下,重新equals,为了更好生成对应唯一的hashcode,重写hashcode方法。

    2.char基于uncode字符编码的,占2个字节,而一个汉字就可以用一个char表示。其次,string是不可变得,string对应一个常量池。

    3.阻塞操作

      socket.accept,inputstrum.read,futre.get等,因为这些方法都要求有放回值,如果没有放回,程序就阻塞,不能继续执行。

      而NIO处理的机制就是通过轮询机制,以及事件监听机制,达到channel的复用,也就是说selector可以监听多个channel,那个里面有数据,那个就执行。

      NIO优势的基础是buffer,编程接口bufferFull()轮询监听buffer是否已满,此方法不阻塞,而reader.readLine()是阻塞的,其次NIO单线程处理多个connection,而IO是多个

      线程处理多个connection,因为线程多,耗费的资源就多。

      

    NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
    如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。一个线程多个连接的设计方案如

    如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:

    NIO就是单线程处理多个channel,减少线程切换,提高效率,一般如果并发量大并且通信数据量小,则可以使用NIO,否则我们可以基于BIO,自己创建线程处理请求。

    参看:http://www.jb51.net/article/50621.htm

    3.缓存机制的原理是什么?

    在开发中,我们基本都会使用缓存,本质就是将处理对象缓存在内存中,减少服务器的压力(比如2次一样的sql查询等),但是缓存管理的难点在于缓存的大小是固定的,那么

    如何换入换出,基本的算法就是FIFO等。常见的缓存有分布式缓存以及单机缓存。而各个缓存的实现高效在于缓存空间的管理以及内存分配。

    所以,涉及到内存或者磁盘的分配以及管理,基本都大同小易,比如oracle数据的磁盘与内存管理,但是基于的原理都是把磁盘内存空间对应成数据结构进行管理,此处了解不是很深刻,暂时记录一下。

    4.SQL的执行计划

    对于sql写完之后,基本就是优化,而优化的前提就是了解执行计划,执行计划就是sql转换成函数调用,其实RDBMS的SQL的执行计划就类似Hive的转换成MapReduce一样,下面说一下表链接的执行计划

    NESTED LOOPS   对应exists

    HASH JOIN         对应join/in

    MERGE JOIN

    5.Tomcat的内存设置

    第一:对于tomcat来说,设置内存就是设置jvm的内存,因为tomcat基于java开发,java运行在jvm虚拟机里面,而jvm类似计算机,他也有自己的内存区域,比如存放对象的堆内存,方法区(metadata数据),栈区(临时变量),所以在部署web app的过程中,存在堆内存设置(xms/xmx)以及方法区内存(pem)以及栈区的设置。注意堆内存的设置原则是物理内存的1/4-1/64之间,具体设置多少与场景有关。

    第二:对于tomcat来说,有connector(8080,8009)两个连接器,一个Engine,多个虚拟的Host,每个host下面可以部署一个webapp,各自一个context。其次就是对于tomcat的并发设置,最大并发线程,最小线程,空闲线程数量的设置,基本tomcat都有默认值。

    第三:设置tomcat的URL编码格式,URIEncoding .

    6.java线程池的原理:

    线程池的目的类似于生产者-消费者的模式,用户的请求就是生产者,存储在队列里面,而线程池就是消费者,通过notify来执行task。

    volatile 在线程开发场景里面可以保证数据一致性,不需要并发控制,基于的它的原子变量的非阻塞CAS轮询算法

  • 相关阅读:
    在数组中寻找和为定值的n个数
    第九届蓝桥杯省赛第六题---递增三元组
    序列螺旋矩阵
    铁轨
    最长公共子串
    STL之vector,deque学习实例
    jdbc Date问题(util.Date和sql.Date)DatePreparedStatement.set
    inti-mothd
    获取HttpResponse并解析JSON数据
    could not find the main class,program will exit
  • 原文地址:https://www.cnblogs.com/gstsyyb/p/5017402.html
Copyright © 2020-2023  润新知