java面试常用总结——基础篇

GC相关

GC回收机制及算法
  对于堆内存中的对象,在用完之后不会立即回收,而是在某个时刻被回收。将堆内存分为两块---新生代和老生代。新生代又划分为伊甸园区和幸存区,一个对象刚创建的时候是放到伊甸园区,在伊甸园区经过一次扫描之后,如果这个对象已经不被引用,则释放内存;如果依然被引用,则挪到新生代的幸存区中;幸存区的扫描频率会略低于伊甸园区;在幸存区经过多次扫描之后,如果这个对象依然存在,则挪到老生的,老声带的扫描频率远远低于新生代。老生代中的一旦产生回收,则会导致程序的卡顿甚至崩溃。
    1.垃圾回收关注的是堆内存
         (1)JVM中java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生灭,这3个区域的内存分配和回收都具备确定性,不需要过多考虑回收问题;
         (2)堆后和方法区不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也不一样,只有在程序处于运行时期时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,因此垃圾收集器所关注的是java的堆内存。
       2.如何确定该实例是否可以被回收及算法
         (1)引用计数算法
        实现简单,效率高;
             给对象中添加一个计数器,当有一个地方引用它时+1,引用失效时-1;
             很难解决对象之间相互循环引用的问题;
         (2)可达性算法
             通过一系列称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,证明此对象不可用;
       3.垃圾收集算法
         (1)标记-清除算法
                 标记所有需要回收的对象,在标记完成后统一回收;
                 标记和清除两个过程的效率都不高;
                 空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多会导致运行过程中需要分配较大对象时,无找到足够的连续空间,而不得不提前触发一次垃圾收集;
         (2)复制算法
                 将内存划分为等大的两块,每次只使用其中的一块,当一块的内存用完后将存活的对象复制到另一块上,在把已使用过的内存空间一次清理掉;
         (3)标记-整理算法
                 过程类似于“标记-整理”,后续将所有存活对象都向一端移动,然后直接清理掉端边以外的内存
         (4)分代收集算法
       4.GC收集器
       5.何时触发full GC
         (1)旧生代空间不足:一般会在新生代晋升为旧生代对象时,或者创建大对象,大数组时出现空间不足,OutOfMemoryError异常
         (2)Minor GC晋升到旧生代的平均大小>旧生代的剩余空间
HTTP协议
  (1)概述
     HTTP协议(超文本传输协议)
     应用于应用层;
     基于TCP/IP通信协议来传递数据(HTML文件,图片文件...)
     工作与客户端-服务器端架构上,浏览器作为HTTP客户端通过URL向HTTP服务器端即web服务器发送所有请求,web根据请求发送响应信息;
  (2)主要特点:
       ①简单快速:客户发送请求时,只需传送请求方法和路径,常用方法有GET、POST;
       ②灵活:HTTP允许传输任意类型的数据对象,由Context-Type加以标记;
       ③无连接:限制每次连接只处理一个请求,服务器处理完请求并受到客户的应答后,即断开连接,节省传输时间;
       ④无状态:指协议对事物处理没有记忆能力,不需要先前信息,以此它的应答较快;
       ⑤支持B/S及C/S模式
  (3)HTTP之URL
       HTTP使用统一资源标识符来传输数据和建立连接;
       协议部分://域名部分:端口部分/虚拟目录部分/文件名部分?参数部分
       URI是一种抽象的,高层次概念定义统一资源标识符,URL和URN则是资源标识的方式;
  (4)HTTP之请求消息Request
     客户端发送一个HTTP请求消息格式:
      ①请求行:用来说明请求类型,要访问的资源和所使用的HTTP版本;
      ②请求头:用来说明服务器要使用的附加信息;
      ③空行:请求头后的空行是必须的;
      ④请求数据:也叫主体,可以增加人员的其他数据;
  (5)HTTP之响应
       服务器接收并处理客户端发送过来的请求后会返回一个HTTP响应消息
        ①状态行:HTTP版本号,状态码,状态消息;
        ②消息报头:用来说明客户端要使用的一些附加信息;
        ③空行:
        ④响应正文:服务器返回给客户端的文本信息
  (6)HTTP之状态码:
      1xx:提示信息
      2xx:成功
      3xx:重定向
      4xx:客户端错误
      5xx:服务器端错误

JVM相关
  一、工作原理:
          .java源文件经过前端编译器编译为java字节码文件(.class);
          然后JRE加载字节码文件,载入系统分配到jvm的内存区;
          然后执行引擎解释或编译类文件,再由即时编译器将字节码转换为机器码;
  二、字节码在运行时数据区执行步骤
      载入:将系统中的.class文件载入到运行时数据区;
      认证:检查载入类文件是否符合java规范和虚拟机规范;
      准备:为载入类分配所需内存,确定类的属性,方法等所需要的数据结构;
      解析:将该类常量池中的符号引用变为直接引用;
      初始化:初始化类的局部变量,为静态域赋值,同时执行静态代码块;
  三、运行时数据区:
        (1)java虚拟机栈
           线程私有,生命周期与线程相同
           虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息;
           每个方法从调用到完成过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程;
           ①局部变量表:包含了方法执行过程中的所有变量,方法参数;
           ②操作数栈:对于每个方法的调用,jvm都会创建一个操作数栈,以供计算;
           ③动态链接:每个栈帧内部都包含一个指向运行时常量池的引用;
           long和double占用两个局部变量数组的两个连续位置64位双精度,其余的数据类型占一个
        (2)java堆
          被进程的所有线程共享,在虚拟机启动时被创建,唯一目的是存放对象的实例,所有的对象和数组都在堆上分配;
          java堆是垃圾收集器管理的主要区域,由于现在的收集器基本都采用分代收集算法,细分为新生代和老生代...;
        (3)方法区 
          用于存储已被虚拟机加载的类信息,常量,静态变量;
          运行时常量池是方法区的一部分,用于存储编译期生成的各种字面量和符号应用,这部分内容在类加载后进入方法区的运行时常量池中存放
        (4)本地方法栈:
           与虚拟机栈类似,区别是虚拟机使用的native方法服务(一个接口,实现非java编写的代码)    
         (5)程序计数器:
        可看做是当前线程锁执行的字节码的行号指示器,通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复都依赖这个计数器完成;
  四、OutOfMemoryError异常
          (1)java堆溢出:
             创建对象数量达到最大堆容量限制后产生内存溢出
          (2)栈溢出:
             ①线程请求的栈深度(受栈帧影响,栈帧中的局部变量越多栈帧越大,栈深度越小)大于虚拟机所允许的最大深度,抛出StackOverflowError    
             ②虚拟机在扩展栈时无法申请到足够的内存空间,抛出OutOfMemoryError
             ③单线程下,无论栈帧太大还是虚拟机容量太小都抛出StackOverflowError
          (3)方法区溢出
内存溢出
  应用的内存已经不能满足正常使用,栈堆已经达到系统设置的最大值;
  相比于内存泄漏:指应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述

话说反射

一、概述:通过xx.class文件,能够拿到该类相关的所有资源,例如:该类所在位置,通过该类创建一个对象,获取这个对象的所有共有,私有方法及属性;
二、方法总结
    1.使用步骤
        //得到调用的类的class
        Class cls=Class.forName(“类的全路径名”)
        //得到要调用的类中的方法
        Method m=cls.getDeclaredMethod(“方法名”,类型.class)
        //方法调用
        m.invoke(cls.newInstance(),参数)
     2.static方法的反射调用
         Class cls=Class.forName("")
         Method m=cls.getDeclaredMethod()
         m.invoke(cls,参数)
     3.private修饰的成员变量赋值
         Field field=cls.getDeclaredMethod("age");
         field.setAccessible(true)
         field.set(cls.newInstance,10)

有关集合

分两大类,Map和Collection
  一、collection
     接口是集合的根接口,java中没有提供这个接口的直接实现类,但让其被继承产生两个接口,Set和List
      (1)Set:无序,元素不可重复,
      (2)List:有序,元素可重复,
           ArrayList:基于数组,内存空间连续,便查询;非同步
           LinkList:基于链表,内存空间不连续,便增删;非同步
           Vector:与ArrayList类似;同步线程安全
      (3)Queue:通常但不一定是先进先出
  二、Map
        (1)HashMap:允许键值为null;异步式线程不安全;初始容量为16,填充因子0.75
        (2)Hashtable:不允许键值为null;同步式线程安全;每个方法都加入了Synchronized;初始容量为11,填充因子0.75
        (3)concurrentHashMap:异步式线程安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值