精华内容
下载资源
问答
  • 怎么才能让他回来
    千次阅读
    2017-07-13 18:30:55

    最近有个项目用到了tabfragment,其中一个fragment中包含一个surfaceview在不断绘图,并且赋予了点击监听,但是当从其他fragment切回来时,在去点击他,onClick并没有响应,需要点击两次才会响应,不知道是为什么,后面猜测可能是焦点获取问题,surfaceview没拿到焦点,所以监听不到。所以重写了surfaceview的Ontouch方法。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                requestFocus();//在点下后,立马赋予焦点,等ACTION_UP时可以响应onClick事件
                break;
        }
        return super.onTouchEvent(event);
    }
    卧槽,onClick可以响应了,真的是奇葩。至于具体为什么切换fragment后surfaceview会失去焦点,要点击一次后才能获取,还是不明白。有大神路过的话,就帮忙解下惑吧!

    哦,对了,在Activity中,我用了一个跑马灯效果的textview,并且重写下面两个方法,让他‘欺骗’android一直获取‘焦点’以持续内容滚动状态,不知道是不是冲突了!

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(true, direction, previouslyFocusedRect);
    }
    
    @Override
    public boolean isFocused() {
        return true;
    }

    更多相关内容
  • B+树,以及两者的区别 B树是一种多路平衡查找树,其每一个节点都存储Key和data B+树是B树的一个变种,叶子节点存储data,非叶子节点只存储key,B+树的叶子节点增加了顺序访问指针,每一个叶子节点都可以访问到的下...

    可以说,学姐给我的这份文档真的把我的知识查漏补缺,面试问到了好多,值得收藏。

    并发编程

    .Executor

    为什么使用线程池:手动创建线程耗费性能,不利于管理。

    首先创建线程池有两种方式:使用Executors工厂来创建ThreadPoolExecutor这类自定义线程池。

    1. 使用Executors工厂来创建

    Executors是一个类,用来创建线程池,常用的有四种线程池

    1.newFixedThreadPool 创建一个可重复固定的线程数的线程池

    2.newCachedThreadPool 创建一个可缓存的线程池,调用execute将重复用以前构造的线程(如果当前线程可用)。如果没有可用线程则创建新的线程并加入到池中。终止并从缓存中移除那些已有60s未被使用的线程。

    3.newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

    4. newScheduledThreadPool 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

    使用示例:

     

     

     

    2. 使用ThreadPoolExecutor这个类自定义创建线程池

     

     

    .ThreadLocal

    https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/6782674c-1bfe-4879-af39-e9d722a95d39.png

     

    .中断线程

    1.线程执行完毕会自动结束

    2.在线程处于阻塞,期限等待火无期限等待时,调用线程的interrupt()会抛出interruptedException异常从而提前终止线程

    3.若没有处于阻塞状态,调用interrupte()将线程标记为中断,此时在调用interrupted()判断线程是否处于中断状态,来提前终止线程。

    4.线程池调用shutdown()等待所有线程执行完毕之后关闭

     

     

    .Volatile关键字的理解

    两层语义:1.保证不同线程对该变量的内存可见线

              2.禁止进行指令重排序

     

    内存语义:

    读这个变量的时候,JMM会把本地内存中的变量设置为无效,从主内存中取;

    写这个变量的时候,JMM会把本地内存变量刷新到主内存当中

    实现:添加Volatile关键字会在汇编代码中多处一个kock前指令,也就是内存屏障

     

    .Synchronized关键字

    1synchronizedJava中的关键字,是一种同步锁。它修饰的对象有以下几种:

        1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;

        2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;

        3. 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;

    4. 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

     

    2Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。

    3Synchronized 原理

        在编译的字节码中加入了两条指令来进行代码的同步。

        monitorenter :

        每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:

        1.如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。

        2.如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.

        3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。

        monitorexit:

        执行monitorexit的线程必须是objectref所对应的monitor的所有者。

        指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权。

         通过这两段描述,我们应该能很清楚的看出Synchronized的实现原理,Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。

    4Synchronized的优化

    (4)synchronized与Lock的区别

        lock是一个类,主要有以下几个方法:

        lock():获取锁,如果锁被暂用则一直等待

        unlock():释放锁

        tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true

    tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间

    https://note.youdao.com/yws/public/resource/cc25598bbaff18a55569c256de4cf1c6/xmlnote/10A95AB8238442569108FC93755C91FF/1701

     

        (1)Lock的加锁和解锁都是由java代码实现的,而synchronize的加锁和解锁的过程是由JVM管理的。

        (2)synchronized能锁住类、方法和代码块,而Lock是块范围内的。

        (3)Lock能提高多个线程读操作的效率;

    (4)Lock:Lock实现和synchronized不一样,后者是一种悲观锁,它胆子很小,它很怕有人和它抢吃的,所以它每次吃东西前都把自己关起来。而Lock底层其实是CAS乐观锁的体现,它无所谓,别人抢了它吃的,它重新去拿吃的就好啦,所以它很乐观。如果面试问起,你就说底层主要靠volatile和CAS操作实现的。

    .CAS机制

    Compare And Swap

    CAS操作是一个原子操作,由一条CPU指令完成,使用了3个基本操作数,内存地址V,旧的预期值A ,要修改的新值B

    需要更新一个变量的时候,只有当内存地址V中的值和预期值A相等的时候才会修改为新值B ,如果失败则自旋,重新尝试

    问题:

    1.ABA 解决办法,加一个版本号,只有当版本号和预期值都符合的时候才修改

    2.不能保证代码块的原子性,CAS机制知识保证一个变量的原子操作

    .JMM的理解

    JMM的核心是找到一个平衡点,在保证内存可见性的前提下,尽量的放松对编译器和处理器重排序的限制。

     

    可能会产生缓存一致性的问题:

    1.总线锁定

    2.缓存一致性协议

     

    三大特性:原子性,可见性,有序性

     

     

     

    .JVM的锁优化

    1.自旋锁和自适应自旋锁

    线程挂起和恢复都需要很大的性能开销,很多共享数据的锁定状态只持续很短的时间,为这段时间挂起恢复不值得,所以可以让现场进入一个自旋状态,但仍占用cpu的时间,默认是10次,超过10次则采用传统的方式挂起线程。自适应自旋锁会根据上次在这个锁上自旋的时间调整自选次数

     

    2.锁消除

    检测到对局部变量加锁,会自动将锁消除,如在一个方法里面有sb = s1 + s2 + s3以前会转化为StringBuffer(线程安全,有加锁)的append操作,优化之后会转换成StringBuilder的sppend操作

     

    3.锁粗化

    对一个对象反复加锁解锁,如上述的append方法,编译器会优化,只在最外层加一个锁

     

    4.轻量级锁

    对象有一个对象头,对象头分两部分区域,一部分存储子树的hashcode,GC分代年龄,锁标志位等,官方成为mark word,另一部分用于存储指向方法区对象类型的指针;

    轻量级锁的执行过程是代码进入同步块的时候,如果当前对象没有被锁定(锁标志为是01)则先在线程的栈帧中建立一个锁记录空间(lock record)将对象的mark word拷贝过来,然后利用cas操作尝试将对象的markword更新为指向lock record,如果成功则当前线程拥有该对象锁,并且将锁标志位从01改为00,如果更新失败则会检查当前对象markword是否指向当前线程的栈帧,如果是则直接进入同步块执行否则说明当前的对象锁已经被其他线程占有。如果有两条以上的线程竞争这个锁,那就会膨胀成重量级锁,锁标志为变成10;

     

    5.偏向锁

    锁对象第一次被线程获取的时候,会将当前的锁标志设置为偏向锁01状态,并使用cas操作将当前线程的id记录在markword当中,如果成功那么在以后的操作当中不需进行任何操作就可以进入同步代码块,当有另外一个线程获取当前锁的时候,偏向模式就宣告结束,撤销偏向锁之后恢复到未锁定或者轻量级锁状态

     

    JAVA基础

    String

    1.string s1 = “aaa” 与 String s1 = new String(aaa);

    前者会在Stringpool中创建一个对象,如果Stringpool中已经有了,则直接引用

    后者会在Stringpool和堆中分别创建一个对象,如果StringPool中已经有了则只创建一个对象

     

    2.调用s1.integer()方法,可以将字符串放入StringPool中,如果已经存在则直接返回这个对象

     

     

    继承

    1.几种修饰符的访问权限范围

     

    2. ==  equals  hashcode的关系

    1.==是比较两个对象的地址是否相等

    2.equals默认和 == 一样也是比较地址,也可以根据自己的需求来重写什么叫做相等

    3.hashcode 是根据对象的地址来返回一串int型数字,如果对象不一样的话返回的值也不一样

     

    3.为什么重写equals的同时也要重写hashcode

    首先必须满足如果equals相同,那么hashcode也必须相同,如果hashcode不相同,那么equals必须不相同的原则,否则会导致该类无法与基于散列值的集合类(hashmap , hashset ,hashtable)结合正常运行

     

    因为对于这些集合在进行重复性判断时,是先用hashcode判断,如果相同在用equals判断

     

     

    4.hash冲突的解决方法

    1.开放地址法(线性探测法,二次探测法)

    2.在散列函数法

    3.链地址法

     

    5.hashtablehashmap的区别

    1.hashmap线程不安全,hashtable线程安全

    2.hashmap最多允许一个键为null,而hashtable不允许

    3.hashtable中默认的hash数组大小为11,增加的方式是old*2+1,而hashmap默认是16,肯定是2的指数

    4.计算hash的方法不一样,hashtable是直接用hashcode,而hashmap使用了key的高16位和低16位做异或运算

     

    Linkedhashmap继承于hashmap,可以按顺序读取,底层使用的是双向链表

    TreeMap实现了sortmap接口,可以对元素进行排序,底层使用的红黑树

     

    7.java BIO NIO AIO 序列化

    字节操作:使用inputStream和outPutSream实现,字节是传输和存储的最小单位

    字符操作:inputStreamReader:将字节流解码成字符流

    OutPutStramWriter:将字符流编码成字节流

    对象操作:序列化就是将对象转换成字节序列,方便存储和运输,两个用途:

    1.把对象的字节序列永久地保存到硬盘中,通常存放在一个文件里

    2.在网络上传送对象的字节序列

    在很多应用中,需要对某些对象进行序列化,让他们离开内存空间,入住到物理磁盘方便长期保存,比如session对象,当有大量用户并发访问的时候可能会出现10万个session对象,内存吃不消,此时就需要将这些session先序列化到硬盘中,等要用的时候在把对象还原到内存中。

    当两个进程在进行远程通信的时候,彼此可以发送各种类型的数据,无论是何种类型的数据,都会以二进制的序列在网络上传送。发送方需要把这个java对象转换成字节序列,才能在网络上传送;接收方则需要把字节序列恢复成java对象。

    Io与NIO的区别:

    1.NIO是非阻塞的

    2.NIO是面向缓冲区的,IO是面向流的

     

    AIO:异步非阻塞

     

     

     

    8.static关键字的作用

    一.修饰变量:

    1.静态变量在类加载的时候被创建并初始化,只被创建一次(类加载只进行一次),可以修改

    2.静态变量属于整个类而不属于某个对象。

     

    二.修饰方法

    1.可以通过类名来访问,不需要创建对象来访问,可以用来实现单例模式

    2.静态方法只能调用静态方法和静态变量

     

    三.修饰静态代码块

    在类加载的时候执行,且只执行一次

     

    9.单例模式

    实现:

    1.为什么要用判断双重:
    因为可能有两个线程都执行完了第一个if语句,如果没有第二重判断,那么当其中有个线程执行完synchronized里面的语句之后,另外一个线程跟着也会执行,这样就达不到单例模式的效果

     

    2.第一重判断去掉也可以实现,为什么不去掉

    这个设计性能问题,因为

    参考:https://qinjiangbo.com/mechanism-of-double-locking-check.html

     

    10.this与super关键字


     

     

    9.java中的多态

    分为两种:

    1.编译时多态:体现在重载(方法名相同而参数不同),在编译时期就根据传入的参数确定好调用哪个方法;

    2.运行时多态:体现在方法的重写。在运行时期判断引用类型的实际类型根据实际的类型调用其相应的方法;

    当父类对象引用变量引用子类对象时,被引用对象的类型决定了调用谁的成员方法,引用变量类型决定可调用的方法。如果子类中没有覆盖该方法,那么会去父类中寻找。

     

    参考链接:https://www.runoob.com/w3cnote/java-polymorphism.html

     

    10.接口类和抽象类的异同

    区别:

    1.抽象类可以有非抽象方法,但接口只能有抽象方法

    2.接口中的成员变量默认修饰为public static final(高度抽象的模版,所以这些都是提取出来的不变特征),方法默认修饰为public abstract。抽象类中的成员变量可以被不同的修饰符来修饰

    3.类可以实现多个接口但只能继承一个抽象类

     

    相同:

    1.不能被实例化

    2.派生类都必须实现未实现的方法

     

    11.instanceof

    用来判断一个对象是否是一个类的实例

    12.各种排序算法复杂度及稳定性

    1.java底层如何实现排序的

    Java中Arrays.sort使用了两种排序方法,快速排序和优化归并排序。

    快速排序主要针对基本的数据类型(int short long)排序,而归并排序用于对象类型的排序

     

    如果数据量小于60会使用插入排序,插入排序是稳定的

     

    13.java中的堆和栈

    栈:主要用于存储局部变量和对象的引用变量,每个线程都有一个独立的栈空间,所以线程之间是不共享数据的;

    栈的特点是存取速度快,但所存数据的大小和生存期必须是确定的(编译后就已经确定大小)

     

    堆:堆中主要存储实例化的对象和数组。线程共享。堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,但缺点是存取速度较慢

     

     

    Linux基本面试题:

    Ls:用于显示指定工作目录下的类容,不会列出详细信息

    Ll:会列出当前文件目录的详细信息,含有时间,权限,大小等

    Cd:用于切换到目标目录

    Mkdir:用于简历当前目录的子目录

    rm-r 删除的文件或者目录,需确认

    rm –rf同上但无需确认

    cp:复制文件 若复制目录则必须加上-r

    数据库MySQL

    .索引

    1.B树,B+树,以及两者的区别

    B树是一种多路平衡查找树,其每一个节点都存储Key和data

    B+树是B树的一个变种,叶子节点存储data,非叶子节点只存储key,B+树的叶子节点增加了顺序访问指针,每一个叶子节点都可以访问到他的下一个叶子节点

     

     

    区别:

    1.B+树种只有叶子节点会带有全部信息,非叶子节点只起到索引的作用,二B树的所有节点都带有全部信息,B+树的每一层节点都会再次出现在下一层节点上

    2.B+树种所有叶子节点都是通过指针连在一起,B树则没有

     

    2.索引的优点和缺点

    优点:可以加大检索速度

    缺点:创建和维护索引需要耗费时间

     

    3.Mysql为什么选择B+

    Mysql数据本质上是放在外部存储的,B+树是为了加快读取速度二设计的一种数据结构

    1.可以减少i/o次数,只有叶子节点才存储数据,非叶子节点存储索引,这样一次读取到内存的关键字增多,相对i/o次数也就减少(根据区别一

    2.能够提供稳定高效的范围扫描,因为所有的叶子节点都互相连接(根据区别二

     

    4.索引越多越好吗?

    索引可以提高select的效率,但是也降低了insert和updata的效率,因为插入和更新的时候可能会重建索引,索引怎么建索引要慎重考虑。

     

    5.索引分类

    1.B+树索引:以b+树作为数据结构的索引

    2.hash索引:能以O(1)的时间复杂度查找,但失去了有序性,innodb有一个自适应哈希索引,当这个索引值被频繁使用时会在b+树上创建一个哈希索引

    3.全文索引:用于查找文本的关键词,中文需要由中文分词插件

    . MySQL优化

    一.MySQL的优化,主要分为索引的的优化,sql语句的优化,表的优化。同时可以使用缓存增加效率

    1.索引的优化

    只要列中含有null,最好不要再此列设置索引

    对于经常在where语句中使用的列,最好设置一个索引

    对于like语句,以%或者-开头的不会使用索引,以%结尾会使用索引

     

    二.sql语句的优化

    查询优化要尽量避免全表扫描

    查询时能不用*就不用*,尽量写字段名

    . MySQL常问问题

    1.数据库如何应对大规模的写入和读取

    (1)使用NoSQL,通过降低数据的安全性,减少对事物的支持,减少复杂查询的支持来获取性能的提升;但有些场合NoSQL无法满足要求

    (2)分库分表:

    水平切分:不修改数据库的表结构,通过对表中的数据拆分而达到分片的目的,一般水平切分在查询的时候可能会用到union操作(多个结果并)

    可以根据hash或者日期来进行分表

     

    垂直切分:修改表结构,按照访问的差异将某些列拆分出去,一般查询数据的时候可能会用到join操作;把常用的字段放在一个表中,不常用的放在一个表中;把字段比较大的比如text字段拆出来放在一个表中。

     

    分库:分表能够解决数据量过大带来的查询效率下降问题,但是却无法给数据库的并发处理能力带来质的提升;分库可以对关键字取模的方式来对数据访问进行路由;https://note.youdao.com/yws/public/resource/96920e055ee2c654ada64b031cefec78/xmlnote/4A29F29BE4E14CFBB1B746D67A6018AC/9130

     

     

     

    (3)读写分离

    读写分离是在主服务器上修改数据,数据也会同步到从服务器上,从服务器只能提供读取,不能写入,实现备份的同时也实现了数据库的性能优化

    https://note.youdao.com/yws/public/resource/96920e055ee2c654ada64b031cefec78/xmlnote/747008E97868421DA096C6672EBDE002/9136

    如何保证数据一致性:

    (1)主节点

    保证事务每次提交之后,要确保binlog都能刷新到磁盘中,只要有了binlog,innoDB就有方法恢复数据,不至于导致主从复制的数据丢失

    (2)从节点

        开启 relay log 自动修复机制,发生 crash 时,会自动判断哪些 relay log 需要重新从master 上抓取回来再次应用,以此避免部分数据丢失的可能性。

     

    2.数据库事务及其隔离级别

    事务的特性:ACID

     

    事务在并发的时候,隔离性很难保证主要可能出现下面这些问题

    脏读:一个事务读了另外一个事务未提交的数据,如果另一个事务回滚则会发生脏读

    不可重复读:一个事务前后读取同一行数据,如果在这个过程中有其他事务修改了此数据则会发生不可重复读

    幻读:一个事务前后读取范围的时候

     

     

     

    事务隔离级别:

    MySQL实现事务是基于undo/redo日志实现的:
    undo日志记录修改前的状态,ROLLBACK基于UNDO日志实现;

    REDO日志记录修改后的状态,事务的持久性基于REDO日志实现

     

    两种解决脏读、不可重复读、幻读的方案:

    MVCC(性能较高,但读的可能是历史版本)

    1.版本链:对于每一行的数据,在undo日志中,总会记录每个版本记录以及对应的事务id,

    2.readView:

    核心问题:当前版本链中哪个版本对当前事务可见

    Readview包含的内容:{当前活跃的事务id,下一个应该分配的事务id,当前自己的事务id},根据当前读的版本事务id和这个readview对比,如果是活跃的或者大于下一个应该分配的事务id则说明当前版本对此事务不可见,应该前读一个版本,依次类推直到找到可见的版本

    提交读:每次读取数据前都会生成一个readview

    可重复读:在第一次读取时句时生成一个readview

     

     

    锁(性能不高,但读的是最新版本):

     

     

     

    MyISAM和innoDB的区别

    1.innodb支持行锁,myisam不支持行锁

    2.innodb支持事务,myisam不支持事务

    3.innodb支持回滚和安全回复,myisam不支持

    4.innodb的索引就是数据,myisam的索引只存储了主键和行号,还需要根据行号去查找相应的记录

    5.innodb更适合写密集的表,myisam更适合读密集的表

    计算机网络

    1.tcp和udp的区别:

    Udp:无连接,尽最大可能交付,没有拥塞控制流量控制

    Tcp:面向连接,可靠交付,有拥塞控制和流量控制

     

    2.输入一条url,整个过程:

    1.DNS解析,获取ip地址(本机,本地域名服务器,根域名服务器,顶级域名服务器,权限域名服务器)

    2.建立TCP连接

    3.浏览器发出http请求

    4.服务器进行响应

    5.TCP连接释放

    6.浏览器渲染

     

    3.为什么是三次握手,四次挥手

    三次握手:防止之前滞留的连接请求再次到达服务端

    四次挥手:因为tcp是全双工模式,客户端停止发送请求之后,服务端也要停止发送请求

     

    4.time_wait存在的原因,时间是多少(两倍的报文最大存活时间)

    1.确保客户端发送的最后一个报文能被收到,服务端可以正常关闭。

    2.让所有报文都在网络中消失,时间是两倍的最大报文存活时间。

     

    5.tcp的可靠传输靠什么:

    超时重传:如果已经发送的报文在超过时间内没有被确认,那么就重新发送这个报文

     

    6.Tcp的滑动窗口

    发送方和接收方都有一个滑动窗口

     

    7.TCP流量控制

    流量控制是为了控制发送方的发送速率,保证接收方来得及接收

    通过滑动窗口来控制,根据报文知道对方窗口的大小,然后根据窗口大小来控制发送速率

     

     

     

    8.TCP拥塞控制

    如报文过多,会导致超时重传,又会导致网络更加阻塞

    https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/910f613f-514f-4534-87dd-9b4699d59d31.png

    1.慢开始和拥塞避免:

    慢开始:设置初始的报文数量为1;

    拥塞避免:设置一个阈值,当报文数超过这个阈值的时候每次,报文每次加一,如果出现超时领阈值等于当前报文的一半,重新执行慢开始

     

    快重传:如果收到3个确认报文,则重传丢失的那个报文

    快恢复:这种情况令阈值等于当前报文的一半,并令当前发送的报文数等于阈值,因为没有出现网络阻塞

     

     

    http各个版本的区别

    http0.9 : 仅支持GET请求,仅能访问html资源

    http 1.0 :增加了post和head请求

    http1.1 : 增加了长连接,一个tcp连接可以发送多个http请求,新增了put,patch,delete请求

    http2.0 : 增加了双工模式,不仅客户端能发送多个请求,服务端也能处理多个请求

    Redis

    1.redis的数据淘汰策略

    当redis内存数据大小达到一定的大小时,就会施行数据淘汰策略,主要有六种策略

     

    2.数据库和缓存的数据一致性

    2.1 mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

    根据数据淘汰策略,先算一下这20W的数据大概占多少内存,然后设置redis的内存,启用从所有数据集中挑选最近最少使用的淘汰策略

     

    2.2 redis缓存和mysql数据库同步

     

     

     

    3.Redis持久化

    1.RDB持久化(redis默认方式)

    将某个时间点的所有数据都存在硬盘中,如果发生故障将丢失最后一次创建快照的数据

    触发RDB快照的条件:在指定的时间间隔内,执行指定次数的写操作

    2.AOF持久化

    所执行的每一条指令,都会记录到appendonly.aof文件中,redis会按照策略将指令存入硬盘中。当redis重启的时候会根据日志文件的内容将写指令从前到后执行一次完成数据恢复的功能

     

     

    Java异常体系

    http://assets.tianmaying.com/md-image/c887bccaa4b144622c82685097908f3d.png

    Error:主要是虚拟机产生,与代码编写者无关,例如:outOfMemoryError

     

    Exception:主要有运行时异常和io异常

    运行时异常:数组越界,空指针异常

    Io异常:找不到文件

     

    发生oom的可能区域:

    除了程序计数器都有可能发生

    虚拟机栈:当jvm尝试去扩展栈空间失败时可能会抛出oom异常

    堆:堆中对象堆积起来无法释放

    方法区

     

     

    四种引用类型:

    主要体现在对象不可达性和对垃圾回收的影响:
    强引用:只要有强引用指向一个对象,就表面对象还活着,垃圾回收期不会碰这种对象

    软引用:只有当jvm认为内存不足的时候才会去试图回收这些对象

    弱引用:不能使对象豁免垃圾回收,只是提供一种对象的访问途径

    虚引用:不能提供他访问对象,仅仅提供一种确保对象呗finalize之后做某些事情的机制

     

     

     

    JAVA虚拟机是如果加载类的

    1.加载:主要是用类加载器(启动类加载器,扩展类加载器,应用类加载器)来查找对应类的字节流

    双亲委派的好处:由于类随着类加载器一起有一种优先级的层级关系,从而使基础类得到统一

     

    2.链接

    验证:确保字节流的安全性,不会对虚拟机造成危害

    准备:为类的静态字段分配内存

    解析:将符号引用解析成实际引用

     

    3.初始化:调用<clinit>方法,为静态变量赋与实际的值,执行静态代码块

    运行时数据区域:

     

     

     

    运行时内存区域

    1.程序计数器:记录正在执行虚拟机字节码的指令地址

    2.java虚拟机栈:主要存储局部变量表

    3.本地方法栈

    4.堆:存储对象的地方,有新生代和老年代

    5.方法区:存储类信息,常量,静态变量等信息

     

    内存分配策略:

    1.对象优先在eden区域分配

    2.大对象直接进入老年代

    3.长期存活的对象进入老年代:会有一个年龄计数器,达到指定的阈值就会进入老年代

     

    FullGC触发条件:

    1.调用system.gc()

    2.老年代空间不足

    3.minor GC时老年代空间分配担保失败

    展开全文
  • 编程段子│只有程序猿才能看懂的搞笑段子

    万次阅读 多人点赞 2021-06-22 22:37:03
     八、好像没买错 老婆给当程序猿的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。” 当晚,程序猿老公手捧一个包子进了家门。。。 老婆怒道:“你怎么就买了一个包子?!” 老公答曰:“因为...

    目录

    一、PHP是最好的语言

    二、你需要客户端吗

    三、 大爷年轻的秘诀

    四、 神特马的注释

    五、对联

    六、凑整

    七、你的今天就是我的明天

    八、好像没买错

    九、 婚礼誓言

    十、永生


    一、PHP是最好的语言

    • 女:你能让这个论坛的人都吵起来,我今晚就跟你走.
    • 男:PHP 是最好的语言!
    • 某论坛炸锅了,各种吵架…
    • 女:服了你了,我们走吧你想干啥都行.
    • 男:今天不行,我一定要说服他们,PHP 必须是最好的语言
    • 女:……. 

    二、你需要客户端吗

    • 你们饭店需要客户端吗?

    • 不忙的时候都是小二端,只有忙的时候才需要客户端。

    三、 大爷年轻的秘诀

    • 记者问一位大爷:老大爷,您保持年轻的秘诀是什么?

    • 大爷:白天上班,夜晚加班,节假日值班,一天五包烟,天天吃泡面。

    • 记者:老大爷,您是干什么工作的?

    • 大爷:我是程序员!

    • 记者:啊??大爷您今年高寿?

    • 大爷:老子今年 28!

    四、 神特马的注释

    • 甲:昨天老板把我惹毛了,我都拟了封邮件给他,不过谢天谢地,发送前我恢复了理智
    • 乙:好险,没留脏话吧
    • 甲:嗯,全部注释掉了

    五、对联

    • 上联:一个项目两部电脑三餐盒饭只为四千工资搞得五脏俱损六神无主仍然七点起床八点开会处理九个漏洞十分辛苦 

    • 下联:十年编码九年加班八面无光忙的七窍生烟到头六亲不认五体投地依旧四肢酸软三更加班只为二个臭钱一生孤苦

    • 横批:苦逼程序员

    六、凑整

    • 程序员A:借我一千块钱。

    • 程序员B:再借你 24 块,凑个整吧。

    七、你的今天就是我的明天

    • 我是个程序员,一天我坐在路边一边喝水一边苦苦检查程序。
    • 这时一个乞丐在我边上坐下了,开始要饭,我觉得可怜,就给了他 1 块钱。
    • 然后接着调试程序...
    • 他可能生意不好,就无聊的看看我在干什么,然后过了一会,他缓缓地指着我的屏幕说,这里少了个分号。 

    八、好像没买错

    • 老婆给当程序猿的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”
    • 当晚,程序猿老公手捧一个包子进了家门。。。
    • 老婆怒道:“你怎么就买了一个包子?!”
    • 老公答曰:“因为看到了卖西瓜的。

    九、 婚礼誓言

    • “你愿意尊重她,帮助她,关怀她,爱她一生一世吗?”

    • 被问到这个问题的时候,程序员新郎有点慌,因为这个场景太熟悉了,又是需求还没明确好就把排期给定好了。

    十、永生

    • 从前,有一个程序员,他得到了一盏神灯。

    • 灯神答应实现他一个愿望。

    • 然后他向神灯许愿, 希望在有生之年能写一个好项目。

    • 后来。。。他得到了永生。

    展开全文
  • 是个人痛恨的小偷,外婆一个人在家,偷了外婆几千块,几千块我们打几天工就来了,但是不知道,这是这个老人所有的积蓄,也不知道她哭得多伤心,我不知道是谁,但是我恨你。 她是个可爱的老人,我每次去...

    点赞再看,养成习惯,微信搜索【三太子敖丙】关注这个被微信官方推荐过的逗比

    本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点系统复习,希望我们一起有点东西。

    注:本文是水日常的文章,不是技术文,看技术的同学可以右划了。

    今天是除夕,帅丙也不水太多东西了,先祝大家新年快乐先,一定要起飞,2020干就完了。

    后面丙丙需要上山点灯(上坟),拜年啥的,估计也水不了了太多了。

    昨天晚上丙丙到家后,就开始怼文章了,因为一天实在经历太多事情了,然后也是无聊,我发现我基本上是用写文章去打发我的碎片时间了,替代了刷手机,我写文章以来,手机每周的阅读时间直线下降,我觉得也是个好事。

    昨天写文章不同的一点可能就是有了一个小美女在我旁边陪伴,小我13岁的小表妹

    这倒舒服,使唤她给我切水果,端茶倒水,还是惬意,比我以前在杭州孤家寡人不知道舒服多少倍。

    看来明年,我还是得找个女人陪我了,泪目。

    我十分怀念老家的羊肉粉,在外面从来吃不到这么好吃地道的羊肉粉,我就叫小表妹带我去嗦粉了。

    说真的,大家有机会来遵义,一定要找个地道的羊肉粉馆,好好嗦一顿,是真的好吃。

    吃完后闲逛,鉴于她良好的表现,而且成绩考得还不错,那我觉得适当的奖励,是必要的,不然以后谁给我端茶倒水呀哈哈。

    走着走着,表弟就开车过来接我们回老家了。

    是的这是我外婆家,这房子的历史十分悠久了,只是今年看起来好像破败了不少,也不知道是不是错觉,房子看起来是歪的。

    外婆的身体还是辣么硬朗,她就是个老人,做饭很好吃的老人,很念旧的老人。

    打我记事开始,我就跟着父母在外打工,直到高三回来高考那年,是我第一次回贵州。

    在记忆中,外婆只是个老人,她那么老,好像从来不曾年轻过,她那么老,好像生来只为了做我的外婆。

    她是个固执的老人,任凭舅舅怎么叫都不去城里住,每次都说走了鸡鸭没人喂。

    但是我知道,她舍不得离开这个陪伴了她85年的家,没读过书的她,也很难融入村外的世界。

    她是个节约的老人,她每次去卖鸡蛋、大蒜,都舍不得打车去街上,这么大年纪走几公里的路程。

    她是个大方的老人,每年我回家,她都给我几百,我知道这是她卖几百个鸡蛋才能赚到的。

    当然每次我都没要,还给她不少,但是她的几百和我的几百,分量不一样。

    他是个让人痛恨的小偷,外婆一个人在家,他偷了外婆几千块,几千块我们打几天工就来了,但是他不知道,这是这个老人所有的积蓄,也不知道她哭得多伤心,我不知道他是谁,但是我恨你。

    她是个可爱的老人,我每次去她那,她总是叨叨个不停,她喜欢跟我唠嗑,咳咳,又聊到了我找女朋友的话题….

    她的一生我也知道得很少,妈妈说过的一些,我也记不大起来,就像她爱我很多,我只是喊他外婆。

    结束了尴尬的话题之后,我回到了家里,第一眼就看到老妈在那忙活,因为我打电话说了我要回家,准备丰盛点。

    一看到我,老妈就放下手中的碗,给了我一个拥抱,这个拥抱她和我都等了一年,我不想松开。

    没抱老爸,男人之间不用这种形式,所以我开了一瓶他89年的酒,我说实话,也不是我想喝,主要是表弟惦记很久了。

    不过说实话,真香。

    吃完后,我厚脸皮的说丙导,亲手导演了蘑菇街的年会视频,并且在家里播放给大家看。

    也不知道视频的中的是谁,这个侧颜,我爱了….

    现在表弟和老爸以及村里的同乡在打麻将,我对棋牌天生不感冒,就是看都不喜欢看那种,村花也嫁出去了,没人跟我聊天,我只能坐在家里对文章了。

    不要问我为什么这么糊,要问就去问工具人小表妹哈哈。

    明天哥哥就要回来过年了,大家基本上也都到家了,希望大家多陪陪家人,一年这几天的相聚是他们等了很久才等到的。

    可以的话,可以像丙丙一样给爸妈一个拥抱,晚上跟家人烤火,促膝长谈。

    这样的时光,对于你和他们都迷之珍贵。

    点关注,不迷路

    好了各位,以上就是这篇水文的全部内容了,我是敖丙,励志做一名让大家都记得住的博主,能看到这里的人呀,都是人才

    我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢人才们能看到这里,如果这个文章写得还不错,觉得「敖丙」我有点东西的话 求点赞👍 求关注❤️ 求分享👥 对暖男我来说真的 非常有用!!!

    白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

    敖丙 | 文 【原创】

    如果本篇博客有任何错误,请批评指教,不胜感激 !

    展开全文
  • 大学计算机系最努力的同学都是如何学习的?

    万次阅读 多人点赞 2021-06-21 09:15:04
    经常会被同学们问到这个问题,要怎么努力才能找到好工作? 学习好就能进好公司? 屁! 被学校教育坑的一把鼻涕一把泪的老学长来回答一波。 我上大学时,连续三年得过国家励志奖学金,英语过六级,以为软考有用,...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,一篇文章足够。能换你一个收藏了吧?
  • 我把一个微信好友从我的微信里删除了,不知道怎么回事又进来了。很多人觉得不可思议,怀疑是系统出错了。 在这里,我很负责任的告诉大家,如果我们的微信中的一些设置操作不当的话,确实会出现这种情况。 其实...
  • 程序员才能看懂的梗(精选1)

    万次阅读 2020-11-27 18:25:42
    老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。” 当晚,程序员老公手捧一个包子进了家门…… 1 某程序员退休后决定练习书法,于是重金购买文房四宝。一日,饭后突生雅兴,...
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    那么话又说回来了,如何才能学习并了解到上面这些内容呢?接下来重点来了!!! 如果你能看到这里,我就认为你养成了每日编程的习惯,此时的你能够静下心来编程了。 那么我首先给你推荐一本初学 Java 非常合适的一...
  • 然后根据这个最小下标的左右同学的成绩来判断的橙子数,如果比左右的同学大,那就在左右同学的基础上取大的那个++; 之后再把这个数从数组中忽略,重复上述工作 然而我忽略了一个非常重要的事情QAQ,那就是找最小...
  • 我到Python虚拟机里逛了一圈,回来就被干掉了!

    千次阅读 多人点赞 2019-12-02 08:50:00
    我出生在C盘一个很深的目录下,也不知道是谁把我放到这里的。我无事可干,整天就是睡觉,睡醒了就和我的邻居Account.class聊天,曾经去过一次内存的Java虚拟机,不停地给我重复...
  • 今天这期本来是没有的,但是今早你们看我朋友圈就知道了,我去翻了一下我的书房,说是书房其实丙丙没在这里读书过,因为下面这个房子是才修没多久的,修好了丙丙都是出去打工的,每年回来都是家里呆几天就走了,故没...
  • 别慌,这些方法可以救回来由于我很多年不用安卓,这次从iPhone XR换成一加8,惊讶地发现安卓大版本已经发展到10了。从苹果换成安卓,其中很重要一个原因是在苹果封闭的生态中,用户的权限被牢牢地限制,直接导致了...
  • 想起高三时一个同学的座右铭:只有沉下去,才能浮上来。共勉(juan)。 坐标:西安 钟楼 作者:唐伯虎点香烟 车票 面试题1:说一下你对ReentrantLock的理解? 追问1:你认为 ReentrantLock 相比 synchronized 都有...
  • 读书笔记-只有偏执狂才能生存

    千次阅读 2017-03-03 18:53:28
    《只有偏执狂才能生存》作者是Intel公司董事长安迪·格鲁夫,以带领Intel成功跨越存储器死谷成为最大处理器公司的亲身实践,写作本书。“10倍速时代已经来临,我们的失败和成功都以10倍速的节奏进行。”
  • 沉淀、分享、成长,自己和他人都能有所收获!???? 一、前言 20万行代码写完,毕业了找一份工作不是问题! 刚一毕业因为找不到工作,就得报名去参加Java培训的大有人在。并不是说参加培训就不好,只不过以你现在这...
  • 2021年已经离去,感谢大家的陪伴和帮助,感谢家人的鼓励。转眼,这已是我在CSDN写下的第九篇年终总结,真是岁月如梭。...或许现实将更加残忍,岁月将不饶人,这荆棘一年我意识到,我已为人父,不再少年。
  • 世界上最好的学习法:费曼学习法

    万次阅读 多人点赞 2019-09-27 19:15:09
    另外有一则报道说:一个农民自己的孩子每天去学校上课回来教学过的内容,这样可以一份学费学两次,就这么一个单纯的想法,的孩子学习成绩一直很优异最终考上了清华。 不论上面的报道是否属实,但它正是费曼...
  • 你需要做一件特定的事情,但是平常做那个工作的人偏偏不在——在你的项目里,你碰到过多少次这种情况?你的项目受到什么影响?是不是只能等着那位专家回来
  • 什么是真正的程序员

    万次阅读 多人点赞 2020-10-16 10:18:10
    因为你把树枝扔出去,你需要自己捡回来。(作者这个故事是活跃气氛吗?) 当我们长大了,上面说的游戏变得很幼稚。你不能把一个松塔当成一个手榴弹;假装拥有神奇的魔法;当其他孩子觉得作为一个成年人很酷。你最终...
  • 前言:迷茫本就是青春该有的模样,但不要未来的你讨厌现在的自己。 "就要毕业了。 回头看自己所谓的大学生活, 我想哭,不是因为离别,而是因为什么都没学到。 我不知,简历该怎么写,若是以往我会它空白...
  • 我们程序员,即便做到CTO,也远没有到拼才华的时候,即使吹上天,也不过是普通人,一些看起来比我们牛逼的人物,只不过在别人选择安逸的时候,选择了拼搏而已。 我也一样,曾几何时,我也是2500一个月都找不到...
  • gitee教程(超全,超详细,超长)

    万次阅读 多人点赞 2021-10-22 15:46:36
    并且也能我在写文档的过程中对git的理解更深。本篇文章的起因是因为一个知乎老哥的评论,它的写作风格,我很喜欢。 于是本篇也是尝试(体验)用这种风格来进行写作。 没有一个软件规格书,就没有一个好的...
  • 【CSDN 2021 年度总结】半年涨粉11万,铁杵磨成针

    万次阅读 多人点赞 2022-01-10 06:17:43
    对于初学者来说,可以先看这么几节,然后我们继续看下面的内容,等遇到相关知识点时再回来翻开即可。 七、刷题必读   光看不练肯定是不行的,所以主要还是要刷题,我这里推荐的是 LeetCode,主要原因是因为现在...
  • 这样,才能让你在日益激烈的竞争环境中脱颖而出。 如果你想成为某个领域的佼佼者,那就从现在开始,为自己定个目标,朝着目标不断前进。还是那句话:再牛逼的技术,也抵不过傻逼似的坚持,专注于某个领域,你也会...
  • 话说回来,的确不是每个人都能拿到高薪的。 我的学历就很一般,大三去苏州实习的时候,工资只有 1200 元,这是真实的,2010 年的时候。即便是 1200 元,那时候感觉也挺香的,因为再也不用伸手向父母要钱了,我可以...
  • 20个只有程序员才能看懂的段子

    万次阅读 多人点赞 2017-07-17 20:24:45
    ing,医院回来的同事一脸的苦逼样子,问怎么了?回答:得了类风湿性关节炎了,我怕会遗传给下一代啊。我一脸的问号:谁说类风湿性关节炎能遗传的?丫一脸诧异:类不是继承的吗?   10. 我很奇怪客栈这个...
  • 唐僧团队要裁员,你会裁谁?

    万次阅读 多人点赞 2019-10-15 09:57:24
    裁掉他,哪天叫他回来,以沙和尚的性格也是有可能愿意回来的 2️⃣沙和尚来之前,重活累活也是有人做的,悟空、猪八戒都会分担一些。所以,没有技术含量,可替代性高,裁掉他风险最小。 裁掉白龙马 这几乎就是...
  • 牛根生和我聊天时,提到了“与自己较劲”,说这是在蒙牛倡导的文化之一。 “与自己较劲”同前面提到的“自我强迫的狠劲”的意思差不多。就是讲,发生任何问题,先从自己身上找原因。因为改变自己容易,改变别人难...
  •   比如夜深人静,大家都睡觉了,这时积压的消息也吃完了,你揉了揉眼,冲了一杯免费咖啡,找到写好的程序,把过期的数据找回来并重新放到MQ中,让他重新消费一遍就行了。 追问3:如果mq经常写满你会怎么办?   ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,427
精华内容 42,170
关键字:

怎么才能让他回来