javaEE面试必背

java的环境的搭建:

jre:  java运行环境。  jre =  java虚拟机 + 核心类库(辅助java虚拟机运行的文件)

jdkjava开发工具集   jdk = jre + java开发工具。

jvm体系总体分四大块:
        1.类的加载机制
        2.jvm内存结构
        3.GC算法 垃圾回收
        4.GC分析 命令调优

类的加载
        类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类的生命周期
        1.加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象
        2.连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用
        3.初始化,为类的静态变量赋予正确的初始值
        4.使用,new出对象程序中使用
        5.卸载,执行垃圾回收

对象分配规则
        1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC
        2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
        3.长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
        4.动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
        5.空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC

GC算法
    GC最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。
        1.标记 -清除算法,标记-清除Mark-Sweep)算法,如它的名字一样,算法分为标记清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
        2.复制算法,复制Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
        3.标记-压缩算法,标记过程仍然与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
        4.分代收集算法,分代收集Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

强引用、软引用、弱引用、虚引用以及他们之间和gc的关系

强引用:new出的对象之类的引用, 
只要强引用还在,永远不会回收 
软引用:引用但非必须的对象,内存溢出异常之前,回收 
弱引用:非必须的对象,对象能生存到下一次垃圾收集发生之前。 
虚引用:对生存时间无影响,在垃圾回收时得到通知。


 调优命令
    Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
        1.jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
        2.jstatJVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
        3.jmapJVM Memory Map命令用于生成heap dump文件


        4.jhatJVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dumpjhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
        5.jstack,用于生成java虚拟机当前时刻的线程快照。
        6.jinfoJVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。






1. Java8种基本数据类型整数类型byteshortintlong,浮点类型floatdouble,字符类型char,布尔类型turefalse

2. String的长度是不可改变的,Stringbuffer长度是可变的, Stringbuffer是线程安全的,如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问他,不岑在不安全的因素了,则用Stringbuilder

3. 数组没有length方法有length属性,Stringlength方法,数组排序有插入,(直接插入,希尔排序)交换排序(冒泡排序,快速排序),选择排序(直接选择排序,堆排序)

4.面对对象的特征,抽象,封装,继承,多态,

抽象

就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有 关的 方面,抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用 部分细节,抽 象包括两个方面,一是抽象过程,二是数据抽象

继承

继承是一种连接类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述 共性 的方法。对象的一个新类可以从现有的类中派生,这个过程称为继承,新 类继承了原始 类的特性,新类为原始类的派生类(子类),而原始类称为新类 的基类(父类),派生类 可以从它的基类那里继承方法和实例变量,并且类可以 修改或增加新的方法使之更适合 特殊的需要

封装

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,面向对象计 算始于这个基本概念,即实现世界可以被描绘成一系列完成自治,封装的对象,这 些对象通过一个保护的接口访问其他对象

多态

多态性是指允许不同类的对象对同一消息做出响应,多态性包括参数化多态性和包 含多态性,多态性语言具有灵活,抽象的行为共享,代码共享的优势,很好的解决 了应用程序函数同名问题

5.包装类int包装类Integer Long类包装long Short包装类short Boolean包装boolean Byte包装类byte Character包装char Double包装double Float包装类float

6. Final如果一个类被声明为final就意味它不能再派生出新的子类,不能作为父亲被继承,因此一个类不能既被声明为abstract的,又被声明为final的,将变量或方法声明为final,可以保证他们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可以修改,被声明为final的方法也同样的只能使用,不能重载

Finally在异常处理时提供finally块来执行任何清楚操作,如果抛出异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)

Finalize方法名java技术允许使用finalze()方法在来及收集器将对象从内存中清楚出去之前必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,他是在object类中定义的,因为所有的类都继承了它,子类覆盖finalize()方法以整理系统资源或者执行其他清理工作,finalize()方法是在垃圾收集器删除对象之前对这个对象调用的

7.java常见的异常

1)类型转换异常ClassCastException

2)未找到相对应得类异常ClassNotounException

3)算数异常ArithmeticException

4)数组下标越界ArrayIndexOutOfBoundsException

5)操作数据库异常sqlException

6)空指针异常NullPointerException

7)输入输出异常IoException

8)文件已结束异常EofeException

9)文件未找到异常FileNotFounException

10)字符串索引超出异常StringIndexOutOfBoundsException

8. 集合

ArrayList和Vector,ArrayList是线程不安全的,也就是不同步的,数据的增长是原来的一半,Vector是线程安全的,也是线程同步的,数据增长是原来的一倍

List集合中允许重复,各元素的顺序就是对象插入的顺序,类似java数组的顺序,可以通过使用索引来访问集合中 的元素

Arraylist类实现了可变的数组,可以保存所有的元素,包括null,并可以根据索引位置对集合进行快速的随机访问,缺点是向指定的索引位置插入对象或者删除对象的速度比较慢

LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入,删除对象时,使用LinkedList类实现的list集合的效率较高,但对于随机访问集合中的对象,使用LinkedList类实现list集合的效率较低

Set集合中的对象不按特定的方式排序,这是简单的把对象加入集合中,但set集合中不能包含重复对象,set集合中由set接口和set接口的实现类组成的,

Hashset由哈希表支持,它不保证set的迭代顺序,特别是是他不保证该顺序恒久不变,此类允许使用null

Treeset在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对Treeset类实现set几种中的对象进行排序,

Map提供key value的映射,但是map中不能包含相同的key,每个key只能映射一个valuekey还决定了存储对象在映射中的存贮位置,但是key对象本身决定的

HashMap提供所有的可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性,hashmap通过哈希表对其内部的映射关系进行快速查找,此类不保证映射的顺序

Treemap集合具有一定的顺序,但在添加,删除和定位映射关系时,Treemap类比HashMap类型能稍差,对象按照一定的顺序排列的因此不允许键对象是null

9.线程

线程同步在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个 Java 线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。 

实现多线程的方法Java 线程可以实现 Runnable 接口或者继承 Thread 类来实现,当你打算多重继承时,优先选择实现 Runnable

Thread.start ()Thread.run ()有什么区别Thread.start ()方法()启动线程,使之进入就绪状态,当 cpu 分配时间该线程时,由 JVM 调度执行 run ()方法。

我们需要 run ()&start ()这两个方法是因为 JVM 创建一个单独的线程不同于普通方法的调用,所以这项工作由线程的 start 方法来完成,start 由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了 Runnable 接口,这就避免因继承了 Thread 类而造成的 Java 的多继承问题。  

什么是死锁 
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等待其它资源锁的释放,除非一个用户进程被终止。

分别为出生状态,就绪状态,运行状态,等待状态,休眠状态,阻塞状态,死亡状态。







  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值