JVM、多线程面试

java的内存区域

  1. 程序计数器:当前线程所执行的字节码的行号指示器,用于线程切换后能恢复到正确的执行位置
  2. java虚拟机栈:其中局部变量表存放编译期可知的基本类型、对象引用
  3. 本地方法栈:虚拟机使用到的本地方法服务
  4. java堆:内存区域最大的一块,gc主要区域,用来存放实例
  5. 方法区:存储被虚拟机加载过的类的信息、常量、静态变量、即使编译后的代码
  6. 直接内存:nio相关

java对象的创建过程

类加载检测-->内存分配-->初始化零值-->设置对象头-->执行init

  1. 类加载检测:常量池中定位此类的符号引用,并检查是否被加载、解析、初始化过,如果没有则先加载
  2. 分配内存:两种方式:指针碰撞、空闲列表
  3. 初始化零值:分配内存后可直接使用
  4. 设置对象头:存储类的元数据信息,对象的hashCode、分代年龄
  5. 执行init:按照程序的医院初始化

对象访问的两种方式

句柄、直接指针

java对象的生命周期

  1. 创建阶段
  2. 应用阶段
  3. 不可见阶段
  4. 不可达阶段
  5. 收集阶段
  6. 终结阶段
  7. 对象空间重分配阶段

堆内存设置的参数

-Xmx:设置堆的最大空间大小

-Xms:设置堆的最小空间大小


类加载器

负责读取java字节码,并转换成Java.lang.Class的实例

类加载器种类

  1. 启动类加载器(BootStrap ClassLoader):加载JAVA_HOME/lib
  2. 扩展类加载器(Extension ClassLoader)
  3. 系统(应用)类加载器(Application Classloader)
  4. 自定义类加载器

关系:应用类加载器继承自扩展类加载器、自定义类加载器继承自应用类加载器

双亲委派机制

类加载器收到类加载请求,自己不加载,向上委托给父类加载,父类加载不了再自己加载

优势:不会多次加载同一个类、每个类加载器只加载自己范围内的类

自定义类加载器的意义

加载特定路径的.class文件

加载网络上加密的.class文件

热部署加载class文件


多线程

  1. 并发(Concurrent):通过cpu调度算法,使看起来同时执行,cpu层面不是真正的同时
  2. 并行(Parallel):多个cpu实例或多台机器同时执行一段处理逻辑
  3. 线程安全:经常描述一段代码。指在并发情况下,改代码经过多线程使用,线程的调度顺序不影响任何结果
  4. 同步:Java中同步指通过人为的控制和调度,使多线程之间的共享资源变为线程安全的,来保证准确性
  5. 线程的状态:

JVM、多线程面试_第1张图片

多线程实现

如何在java中实现多线程?

  1. 继承Thread类,重写run方法
  2. 实现Runable接口,重写run方法

用runable还是Thread?

  1. 当类本身已经继承其他类时,实现Runable接口,因为不支持多重继承

Runable和Callable有什么不同?

  1. Callable的call方法可以有返回值和抛出异常,可以返回有计算结果的Future对象

线程池

避免了在处理短时间任务时创建与销毁线程的代价

  1. 线程池管理器(ThreadPoolManager):用于创建并管理线程
  2. 工作线程(WorkThread):线程池中的线程
  3. 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行
  4. 任务队列:用于存放没有处理的任务,提供一种缓冲机制

 


 

 

 

 

 

 

 

你可能感兴趣的:(JVM、多线程面试)