2.5 HashMap 和 HashTable 有什么区别? HasHMap是线程不安全的,HashTable是线程安全的 因为线程安全的问题,HashMap 效率比 HashTable 的要高。 HashMap是允许null键和null值,HashMap不允许
2.6HashMap,HashTable,ConcurrentHashMap 之间的区别, 及性能对比
1、HashMap 是非线程安全的,HashTable 是线程安全的。2、HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。 3、因为线程安全的问题,HashMap 效率比 HashTable 的要高。 4、Hashtable 是同步的,而 HashMap 不是。
3.1 什么是线程?线程和进程的区别? 线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以独立运 行的基本单位。 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资 源分配和调度的一个独 立单位。 特点:线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行时各自内存 单元相互独立,线程之间 内存共享,这使多线程编程可以拥有更好的性能和用户体验 注意:多线程编程对于其它程序是不友好的,占据大量 cpu 资源。
3.2 创建线程有几种方式 1.继承 Thread 类 2. 实现 Runnable 接口 3. 实现 Callable 接口 4. 通过线程池方法
什么是线程池,如何使用? 线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接 去池中拿线程即可,节省了开辟子线程的时间,提高的代码执行效率。常用的线程池有哪些? 创建一个单线程的线程池,创建固定大小的线程池,创建一个可缓存的线程池,创建一个大小无限的线程池,创建一个单线程的线程池。 3.2 线程的基本方法有什么? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。 线程等待(wait)会释放对象的锁 线程睡眠(sleep)sleep 不会释放当前占有的 锁 .线程让步(yield)让出 CPU 执行时间片 线程中断(interrupt)给这个线程一个通知信号,会影响这个线程内部的一个中断 标识位 等待其他线程终止.(Join) 等待其他线程终止 线程唤醒(notify)唤醒在此对象监视器上等待的单个线程 3.3 在 java 中 wait 和 sleep 方法的不同? 最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。wait 通常被用于线程 间交互,sleep 通常被用于暂停执行。3.4 同步锁与死锁 同步锁:保证线程同步互斥,就是指并发执行的多个线程 死锁:就是多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放
3.5乐观锁和悲观锁是什么? 乐观锁:以为会排队不上锁 悲观锁:每次拿数据的时候都会上锁
3.6 线程池原理
线程池管理器:用于创建并管理线程池工作线程:线程池中的线程任务接口:每个任务必须实现的接口,用于工作线程调度其运行任务队列:用于存放待处理的任务,提供一种缓冲机制3.7 线程执行的顺序
当线程数小于核心线程数时,会一直创建线程直到线程数等于核心线程数;当线程数等于核心线程数时,新加入的任务会被放到任务队列等待执行;当任务队列已满,又有新的任务时,会创建线程直到线程数量等于最大线程数;当线程数等于最大线程数,且任务队列已满时,新加入任务会被拒绝3.8 线程池的核心参数有哪些? 1.corePoolSize(核心线程数) 2.queueCapacity(任务队列容量) 3.maxPoolSize(最大线程数) 4.keepAliveTime(线程空闲时间)
4.1 JVM 内存管理 JVM 将内存划分为 6 个部分:PC 寄存器(也叫程序计数器).虚拟机栈.堆. 方法区.运行时常量池.本地方法栈
4.2 GC 分代收集算法和分区收集算法区别?
分代收集算法:会根据算法的生命周期不同划分(新生代,老生代,永久代)分区收集算法:将整个堆空间划分为连续不同的小区间4.3 GC 垃圾收集器 Java堆内存被划分新生代和老生代,新生代主要使用复制和标记-清理垃圾回收算法, 老年代主要使用标记-整理垃圾回收算法,因此java虚拟机的针对新生代和老年代提供了 多种不同的垃圾收集器
4.4 JVM 调优工具 Jconsole,jProfile,VisualVM Jconsole:jdk自带,功能简单,但是可以在系统有一定夫荷的情况下。对垃圾回收算法有很详情的跟踪。 Jprofiler:商业软件,需要付费。功能强大。 Visualvm:jdk自带,功能强大 与jprofiler类似
4.5 如何调优 性能调优是lT运维工作中的重点之一 线程池:解决用户响应时间长的问题 连接池 JVM 启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量 程序算法:改进程序逻辑算法提高性能 4.6 内存泄漏检查 内存泄露是比较常见的问题,系统资源(各方面资源,栈,堆,线程等)在错误使用的情况下,导致使用完毕资源无法回收,导致新的资源分配请求无法完成,引起系统错误。 内存泄漏对系统危害比较大,因为他可以直接导致系统崩溃。
年老代堆空间被占满 异常: java.lang.OutOfMemoryError: Java heap space 这是最典型的内存泄露方式,简单说就是所有堆空间都被无法回收的垃圾对象占满,虚拟机无法再分配新空间 解决:根据垃圾回收前后情况对比,同时根据对象引用情况分析,基本都可以找到泄露点
持久代被占满 异常:java.lang.OutOfMemoryError: PermGen space Perm 空间被占满。无法为新的 class 分配存储空间而引发的异常 解决: 1. -XX:MaxPermSize=16m 2. 换用 JDK。比如 JRocket。
堆栈溢出 异常:java.lang.StackOverflowError 说明:这个就不多说了,一般就是递归没返回,或者循环调用造成
线程堆栈满 异常:Fatal: Stack size too small java 中一个线程的空间大小是有限制的。JDK5.0 以后这个值是 1M。 与这个线程相关的数据将会保存在其中。但是当线程空间满了以后,将会出现上 面异常。 解决:增加线程栈大小。-Xss2m。但这个配置无法解决根本问题,还要看代 码部分是否有造成泄漏的部分。
系统内存被占满 异常:java.lang.OutOfMemoryError: unable to create new native thread 这个异常是由于操作系统没有足够的资源来产生这个线程造成的。 解决: 1. 重新设计系统减少线程数量。 2. 线程数量不能减少的情况下,通过-Xss 减小单个线程大小。以便能生产 更多的线程。
说下原生 jdbc 操作数据库流程? 第一步:Class.forName()加载数据库连接驱动; 第二步:DriverManager.getConnection()获取数据连接对象; 第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、 PreparedStatement ; 第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX(); 第五步:关闭结果集、关闭会话、关闭连接。
1.2 说说事务的概念,在 JDBC 编程中处理事务的步骤。 1 事务是作为单个逻辑工作单元执行的一系列操作。 2,一个逻辑工作单元必须有四个属性,称为原子性、 一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为 一个事务事务处理步骤: 3,conn.setAutoComit(false);设置提交方式为手工提交 4,conn.commit()提交事务 5,出现异常,回滚 conn.rollback();
TCP 与 UDP 区别? UDP: a、是面向无连接, 将数据及源的封装成数据包中,不需要建立建立连接 b、每个数据报的大小在限制 64k 内 c、因无连接,是不可靠协议 d、不需要建立连接,速度快 TCP: a、建议连接,形成传输数据的通道. b、在连接中进行大数据量传输,以字节流方式 C、通过三次握手完成连接,是可靠协议 d、必须建立连接 m 效率会稍低 聊天、网络视频会议、桌面共享用的就是 UDP
说一下什么是 Http 协议? 客户端和 服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。 是一个基于请求与响应模式的、无状态的、应用层的协议,基于 TCP 的连接方式