面试记录

JVM线程属于用户态还是内核态

当进程运行在ring3级别时为用户态,ring0级别时为内核态

有些操作需要有内核权限才能进行,那么有三种由用户态切换到内核态的情况:

  1. 系统调用:操作系统封装内核指令,统一管理硬件资源,然后向用户程序提供系统服务,用户程序进行系统调用,操作系统进行检查确保安全然后再进行相应的资源访问操作。比如malloc(),print()调用write()系统输出字符串
  2. 异常事件:当cpu正在运行用户态程序,发生不可预知的异常事件,就会转用户态,比如缺页中断。
  3. 外围设备的中断:当外围设备完成请求就会向CPU发出中断信号,此时cpu暂停下一条要执行的指令,去执行中断信号所对应的程序

相同点和不同点:都是中断,但是系统调用是主动,其他都是被动

用户态和内核态线程的映射关系

一对一(内核线程实现)

程序使用轻量级进程和内核线程产生映射

缺点:轻量级进程的数量有限制,执行效率低

多对一(用户线程实现)

优点:用户线程数量几乎无限制,执行效率高

缺点:一个用户线程阻塞,其他线程也会阻塞

多对多

UT 用户态线程 LWP 轻量级线程 KLT 内核态线程

面试记录

优点:

  1. 一个用户线程的阻塞不会导致所有线程的阻塞,因为此时还有别的内核线程被调度来执行。
  2. 多对多模型对用户线程的数量没有限制。
  3. 在多处理器的操作系统中,多对多模型的线程也能得到一定的性能提升,但提升的幅度不如一对一模型的高。在现在流行的操作系统中,大都采用多对多的模型。

用户态线程:切换代价小,高并发但是容易阻塞

内核态线程:处理能力高,切换代价大

Java线程的实现

虚拟机规范中并没有限定java线程需要使用哪种线程模型,要根据不同的平台来说,但是无论使用哪种线程模型,java程序的编码和运行都是没有差异的

Java线程调度

线程调度有两种:协同调度和抢占调度

协同:自己分配时间,自己切换

抢占:系统分配时间,系统决定线程的切换

java线程采用抢占调度

java线程的6种状态

新建———-运行———无限期等待——–限期等待———阻塞——结束

操作系统线程的几种状态

新建———就绪————等待————运行———–结束

java和操作系统的线程对应关系

1.2之前(绿色线程 1:N),程序员为jvm开发了一个线程调度内核,映射到操作系统层面就是用户态线程;

1.2(1:1)之后,jvmU型安泽了操作系统原生线程模型,映射到操作系统层面就是内核态线程,通过系统调用,将程序的线程交给了操作系统内核进行调度。

通过创建过程来理解

面试记录

Java的Thread对象:仅仅是一个Java对象

JVM的JavaThread对象:连接着java的Thread对象与OS对象

JVM的OSThread对象:一个工具类,对OS线程API进行了功能性封装

流程图:

面试记录

JVM_StartThread核心做了两件事情:

1.创建JavaThread对象

​ (1) 设置jvm执行run方法的跳板

​ (2) 调用os::create_thread创建OSThread对象及操作系统线程完成三者的关联

​ os::create_thread做了一下这些:

​ 创建OSThread对象,将JavaThread对象与OSThread对象进行关联

线程库

为开发人员提供创建和管理线程的一套API

三个主要的线程库:

1)POSIX Pthreads:可以作为用户或内核库提供,作为 POSIX 标准的扩展

2)Win32 线程:用于 Window 操作系统的内核级线程库

3)Java 线程:Java 线程 API 通常采用宿主系统的线程库来实现,也就是说在 Win 系统上,Java 线程 API 通常采用 Win API 来实现,在 UNIX 类系统上,采用 Pthread 来实现。

操作系统对于锁的实现

在硬件层面,CPU提供了原子操作、关中断(可解决单核情况下两个线程同时获得锁)、锁内存总线的机制(解决多核情况下两个线程同时获得锁);OS基于这几个CPU硬件机制,就能够实现锁;再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等等等等)

synchronized的底层实现

是通过对象内部的一个监视器锁(monitor)实现的,监视器锁有时通过操作系统的互斥锁来实现的,而且现在主流的java虚拟机实现中,java的线程是映射到操作系统原生的内核线程中的,那么线程的阻塞或唤醒,就涉及到用户态和内核态的转换中,所以是重量级锁。

是一种块结构的同步语法,经过javac反编译之后,会在同步块的前后分别生成monitorenter和monitorexit两个字节码指令,这两个指令都需要一个reference类型的参数来指明加锁解锁的对象,如果synchronized明确了对象参数。就以这个对象的引用作为reference,如果没有指定,那就根据修饰的方法类型,来决定是区代码所在的对象实例还是相应的class对象。

反射的性能优化

两个地方导致性能差:getMethod和invoke,反射是一个解释操作,临时告诉jvm应该做什么

优化思路1:缓存Method,不重复调用getMethod
优化思路2:借助ASM框架,使用reflectAsm,让invoke变成直接调用

借反射的getDeclaredMethods获取目标类的所有方法,然后动态生成一个继承于MethodAccess 的子类SimpleBeanMethodAccess,动态生成一个Class文件并load到JVM中。

SimpleBeanMethodAccess中所有方法名建立index索引,index跟方法名是映射的,根据方法名获得index,SimpleBeanMethodAccess内部建立的switch直接分发执行相应的代码,这样methodAccess.invoke的时候,实际上是直接调用。

hashmap在jdk1.7的死循环

多线程头插法造成的,线程2已经完成扩容散列,链表变成了倒序,线程1再进行扩容,将倒序链表变成了一个正序链表,从而形成环形链表,在使用get方法时造成死循环。

常用集合

ArrayList

首先有三种构造方法(有参,无参,指定集合参数组成的列表)

主要就是三个方法:

1.ensureCapacityInternal得到最小扩容量,并进行扩容

2.ensureExplicitCapacity//判断是否需要扩容,如果最小扩容量大于数组现在的长度就调用grow方法

3.grow 进行位运算,扩容1.5倍,并进行判断是否超出数组的最大容量。

始化数据量为0,add时变为10,当 要 add 进第 1 个元素时,minCapacity 为 1,在 ensureCapacityInternal的Math.max()方法比较后,minCapacity 为 10 ,

最好在 add 大量元素之前用 ensureCapacity 方法(因为是public修饰),以减少增量重新分配的次数

Set Map

Original: https://www.cnblogs.com/zz01/p/16488039.html
Author: 山野村夫01
Title: 面试记录

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622291/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CentOS 7 RabbitMQ 单机部署

    RabbitMQ版本:3.8.5 安装Erlang RabbitMQ的集群基于Erlang的分布式特性实现,所以需要先安装Erlang。 下载yum源配置脚本: curl -#LO…

    数据库 2023年6月9日
    093
  • Java学习-第一部分-第三阶段-第三节:MySQL基础

    零基础学MySQL 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 一个问题 淘宝网,京东、微信,抖音都有各自的…

    数据库 2023年6月11日
    095
  • 2018年最新JAVA面试题总结之基础(1)

    转自于:https://zhuanlan.zhihu.com/p/39322967 1、JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗?…

    数据库 2023年6月16日
    090
  • Burpsuite安装SQLmap操作

    Burpsuite安装SQLmap插件步骤: 安装准备: Burpsuite工具、SQLmap工具、python解释器 1.打开burpsuite插件; 2.找到CO2插件; 3….

    数据库 2023年6月9日
    095
  • jmeter并发设置的原理

    简介 广义并发 绝对并发 简介 ​ 性能测试过程中是否需要进行同步定时器的设置,需要根据实际情况来考虑。 ​ 举个栗子来讲是我们的双十一秒杀活动,这时候就必须实现请求数量达到一定数…

    数据库 2023年6月6日
    077
  • SpringBoot 搭建基于 MinIO 的高性能存储服务

    1.什么是MinIO MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应…

    数据库 2023年6月14日
    0152
  • 界面酷炫,功能强大!这款 Linux 性能实时监控工具超好用!

    对于维护、管理Linux系统来说,它的性能监控非常重要,特别是实时监控数据,这个数据有利于我们判断服务器的负载压力,及时调整资源调配,也有助于更好的服务于业务。所以,今天民工哥给大…

    数据库 2023年6月9日
    086
  • MySQL 基础

    MySQL 基础 SQL 介绍 SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据…

    数据库 2023年5月24日
    090
  • Javaweb-Ajax详解

    一、概念 Ajax = Asynchronous JavaScript and XML(异步的JavaScript和XML) Ajax不是一种新的编程语言,而是一种用于创建更好更快…

    数据库 2023年6月16日
    079
  • Linux安装nginx并配置ssl自签证书

    一、下载nginx压缩包:官网下载地址http://nginx.org/download/,点击进入选择合适自己系统的版本,本机已centos安装nginx-1.9.1.tar.g…

    数据库 2023年6月14日
    093
  • 慢SQL,压垮团队的最后一根稻草!

    一、什么是慢 SQL 什么是慢SQL? 顾名思义,运行时间较长的 SQL 语句即为慢 SQL! 那问题来了,多久才算慢呢? 这个慢其实是一个相对值,不同的业务场景下,标准要求是不一…

    数据库 2023年6月14日
    098
  • MYSQL–>SQL语法

    注:DDL(Data definition Language)数据库定义(比如说表,数据库)DML(Data Mainpulation Language)数据库 表的增删改查DQL…

    数据库 2023年5月24日
    0114
  • IO流

    流的分类 按操作数据不同,分为字节流和字符流。 按数据流的流向分为输出流和输入流。 按流的角色分为节点流和包装流。 抽象基类 字节流 字符流 输入流 InputStreanm Re…

    数据库 2023年6月16日
    079
  • NO.4 计算机组成原理-笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月14日
    091
  • 推荐几款最好用的MySQL开源客户端,建议收藏!

    一、摘要 众所周知,MYSQL 是目前使得最广泛、最流行的数据库技术之一,为了更方便的管理数据库,市场上出现了大量软件公司和个人开发者研发的客户端工具,比如我们所熟知的比较知名的客…

    数据库 2023年6月14日
    096
  • Linux 利用Cgroup 资源控制

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 cgroups 是Linux内核…

    数据库 2023年5月24日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球