java面试
文章平均质量分 72
你回到了你的家
这个作者很懒,什么都没留下…
展开
-
Java线程和进程内存模型
test原创 2022-07-13 20:08:28 · 161 阅读 · 0 评论 -
3.2 如何判断Java对象的存活
一、引用计数算法判断对象是否存活可以利用如下方式:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。客观地说,上述方法–也就是引用计数算法(Reference Counting)虽然占用了一些额外的内存空间来进行计数,但它的原理简单,判定效率也很高,在大多数情况下它都是一个不错的算法。也有一些比较著名的应用案例,例如微软COM(Component Object Model)技术、使用ActionScript 3原创 2021-03-12 09:09:17 · 381 阅读 · 0 评论 -
3.3 垃圾回收算法
从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference CountingGC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。由于引用计数式垃圾收集算法在主流Java虚拟机中均未涉及,所以可以暂时不关注,下面介绍的算法均属于追踪式垃圾收集的范畴。一、分代收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)的理论进行设计,分代收集名为理论,实质是一套符原创 2021-03-11 08:17:56 · 130 阅读 · 0 评论 -
大数据处理面试题
一、题目以及答案1.1题目:海量日志数据,提取出某日访问百度次数最多的那个IP解决方法:IP地址最多有2322^32232种取值情况,所以不能完全加载到内存中处理可以考虑采用“分治”的思想,按照IP地址的Hash(IP)%1024值,将海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址对于每个小文件,可以构建一个IP为Key,出现次数为value的Hash Map,同时记录当前出现次数最多的那个IP地址可以得到1024个小文件中的出现次数最多的IP,再依据常原创 2020-11-03 20:23:21 · 243 阅读 · 0 评论 -
Java中IO流有哪些
按数据流向:输入流和输出流其中输入和输出都是从程序的角度来讲的输入流:数据流向程序输出流:数据从程序流出按处理单位:字节流和字符流字节流:一次读入或读出是8位二进制字符流:一次读入或读出是16位二进制JDK中后缀是Stream是字节流;后缀是Reader,Writer是字符流按功能:节点流和处理流节点流:直接与数据源相连,读入或写出处理流:与结点流一块使用,在结点流的基础上,再套接一层最根本的四大类:InputStream(字节输入流)OutputStream(字节输原创 2020-09-16 09:18:16 · 840 阅读 · 0 评论 -
Java GC种类以及触发时机
一、JVM创建新对象的内存分配过程以下是JVM中创建一个新对象的时候的完成的一个流程:二、Full GC触发过程2.1 System.gc()方法的调用此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。2.2 老年代空间不足老年原创 2020-09-14 08:56:38 · 751 阅读 · 0 评论 -
JVM调优
一、GC原理年轻代包括Eden区(对象刚被new出来的时候,放到该区),S0和S1,是幸存者1区和幸存者2区,从名字可以看出,是当发生YGC,没有被任何其他对象所引用的对象将会从内存中被清除,还被其他对象引用的则放到幸存者区。当发生多次YGC,在S0、S1区多次没有被清除的对象,则会被移到老年代区域。当老年代区域被占满的时候,则会发生FullGC。无论是YGC或是FullGC,都会导致stop-the-world,即整个程序停止一些事务的处理,只有GC进程允许以进行垃圾回收,因此如果垃圾回收时间较长,部原创 2020-09-14 08:39:09 · 252 阅读 · 0 评论 -
Java CLH队列
一、SMP和NUMA简要介绍1.1 SMPSMP(Symmetric MultiProcessing)对称多处理是一种包括软硬件的多核计算机架构,会有两个或以上的相同的核心共享一块主存,这些核心在操作系统中地位相同,可以访问所有I/O设备。它的优点是内存等一些组件在核心之间是共享的,一致性可以保证,但也正因为内存一致性和共享对象,在拓展性上就受到限制了。下图展示了SMP架构:1.2 NUMANUMA(Non-uniform memory access)非一致存储访问也是一种在多处理任务中使用的计原创 2020-09-10 19:19:24 · 869 阅读 · 0 评论 -
Java变量区分
一、成员变量1.1 什么是成员变量成员变量就是类中的属性。当new对象的时候,每个对象都有一份属性。一个对象中的属性就是成员变量1.2 作用范围在类内部,任何地方都可以访问成员变量1.3 生命周期出生:new对象的时候,开辟内存空间死亡:堆内存地址没有引用,变成垃圾,被垃圾回收器回收后二、局部变量2.1 什么是局部变量方法的形式参数以及在方法中定义的变量。2.2 作用范围形参:在方法体中任何位置都可以访问。方法中定义变量:从定义处开始,直到所在代码块结束。2.3 生命周期出生:原创 2020-09-09 22:45:04 · 187 阅读 · 0 评论 -
Java异常
一、Java异常机制Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构如下图所示:二、ThrowableThrowable类是所有异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运行时异常(RuntimeException)和非运行时异常,也称之为不检查异常(Unchecked Exception原创 2020-09-08 22:03:07 · 99 阅读 · 0 评论 -
乐观锁与悲观锁
一、悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和reentrantLock等独占锁就是悲观锁思想的实现。二、乐观锁2.1 什么是乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版原创 2020-09-08 21:49:38 · 127 阅读 · 0 评论 -
CMS与G1比较
一、CMSCMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。这是因为CMS收集器工作时,GC工作线程与用户线程可以并发执行,以此来达到降低收集停顿时间的目的。CMS收集器仅作用于老年代的收集,是基于标记-清除算法的。运作过程分为如下四步:初始标记(CMS initial mark)并发标记(CMS concurrent mark)重新标记(CMS remark)并发清除(CMS concurrent sweep)其中,初始标记、重新标记原创 2020-09-07 12:52:46 · 1823 阅读 · 1 评论 -
Java中内存泄漏八种情况的总结
由于Java的JVM引入了垃圾回收机制,垃圾回收器会自动回收不再使用的对象,JVm是使用可达性分析算法来判断对象是否不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)一、静态集合类如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。简单而言,长生命周期的对象持有短生命周期对象的引用原创 2020-09-04 18:43:28 · 2450 阅读 · 3 评论 -
内存溢出和内存泄漏的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!以发生的方式来分类,内存泄漏可以分为四类:常发性内存泄漏。发生内存泄漏的代码会被原创 2020-09-04 17:26:41 · 114 阅读 · 0 评论 -
MYSQL数据库优化的八种方式
一、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,它在上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。二、使用连接(JOIN)来代替自查原创 2020-09-04 17:22:16 · 100 阅读 · 0 评论 -
设计模式
一、设计模式的六大原则开闭原则:一个软件实体如类、模块和函数应该对修改封闭,对扩展开放单一职责原则:一个类只做一件事,一个类应该只有一个引起它修改的原因里式替换原则:子类应该可以完全替代父类。也就是说在使用继承时,只扩展新功能,而不要破坏父类原有的功能。依赖倒置原则:细节应该依赖于抽象,抽象不应依赖于细节。把抽象层放在程序设计的高层,并保持稳定,程序的细节变化由底层的实现层来完成。迪米特法则:又名最少知道原则,一个类不应该直到自己操作的类的细节,换言之,只和朋友谈话,不和朋友的朋友谈话接口隔离原创 2020-08-31 15:02:50 · 121 阅读 · 0 评论 -
ArrayList和LinkedList的区别
ArrayList和LinkedList都实现了List接口,但是两者在以下方面存在着不同:ArrayList是基于索引的数据接口,它的底层是数组,所以它可以以O(1)的时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素链表(双向链表)的形式存储它的数据,每一个元素都和它的前一个以及后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)相对于ArrayList,LinkedList的插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小原创 2020-08-20 15:18:36 · 264 阅读 · 1 评论 -
自定义类加载器与热部署
一、自定义类加载器要创建用户自己的类加载器,只需要继承java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,即指明如何获取类的字节码流。如果要符和双亲委派规范,则重写findclass方法(用户自定义类加载逻辑);要破坏的话,重写loadclass方法(双亲委派的具体逻辑实现)。例子:package classloader;import java.io.ByteArrayOutputStream;import java.io.File;原创 2020-08-18 11:52:16 · 325 阅读 · 0 评论 -
Java内存溢出的情况
一、程序计数器每条线程都有一个独立的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。该内存区是唯一一个在Java虚拟机规范中没有规定任何OOM(内存溢出:OutOfMemoryError)情况的区域。二、Java虚拟机栈在Java虚拟机规范中,对这个区域规定了两种异常情况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError异常如果虚拟机在动态拓展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常这两种情况存在着一些互相.原创 2020-08-17 19:43:35 · 114 阅读 · 0 评论 -
Java中的四种引用类型
java.lang.ref是Java类库中比较特殊的一个包,它提供了与Java垃圾回收器密切相关的引用类。强引用、软引用、弱引用、虚引用,这四种引用的强度按照上面的顺序依次减弱。引用类型对比:引用类型取得目标对象方式垃圾回收条件是否可能内存泄漏强引用直接调用不回收可能软引用通过get()方法视内存情况回收不可能弱引用通过get()方法永远回收不可能虚引用无法取得不回收不可能一、强引用如果一个对象具有强引用,那垃圾回收器绝不会回收它原创 2020-08-16 15:28:52 · 180 阅读 · 1 评论 -
垃圾回收中的finalize方法
一、判断对象是否是“垃圾”垃圾回收器在对堆进行回收前,第一件事就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即已经不可能再被使用的对象)1.1 引用计数算法(已被淘汰)给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就+1;当引用失效时,值就-1;任何时刻计数器为0的对象就是不能再被使用的。引用计数器算法的实现非常简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软公司的COM技术。但是,至少主流Java虚拟机里面没有选用引用计数器算原创 2020-08-16 08:09:05 · 675 阅读 · 0 评论