零、问题 谈谈你对Synchronized的理解 Synchronized的锁升级你聊聊 Synchronized的性能是不是一定弱于Lock synchronized锁:由对象头中的Mark Word根据锁标志位的不同而被复用及锁升级策略 一、Synchronized的性能变化 1、java5之前 java5以前,只有Synchronized,这个是操作系统级别的重量级操作 重量级锁
零、问题 Object object = new Object()谈谈你对这句话的理解? 一般而言JDK8按照默认情况下,new一个对象占多少内存空间? 位置所在:JVM里堆→新生区→伊甸园区 一、对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据、对齐填充(保证8个字节的倍数) 二、对象头 对象标记 类元信息(类型指针):指向该对象
一、ThreadLocal简介 1、问题 1、ThreadLocal中ThreadLocalMap的数据结构和关系 2、ThreadLocal的key是弱引用,这是为什么? 3、ThreadLocal内存泄露问题有说明 4、ThreadLocal中最后为什么要加remove方法 2、是什么 ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal
一、基本类型原子类 首先,我们来用原子类实现i++的效果,可以看出,结果并不是50000 package com.lori.juc2023.juc8; import java.util.concurrent.atomic.AtomicInteger; public class AtomicDemo1 { public static final int SIZE = 50;
一、原子类 java.util.concurrent.atomic下所有的类 二、没有用CAS之前 多线程下不使用原子类保证线程安全i++(基本数据类型) package com.lori.juc2023.juc7; public class casDemo1 { volatile int number = 0; //读取 public int getNumber(){
一、被volatile修饰的变量的两大特点 1、可见性:写完后立即刷新回主内存,并及时发出通知,大家可以去主内存拿最新的东西,前面线程的修改对后面所有线程可见 2、有序性: 排序要求:有时需要禁止重排 重排序: 指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,有时会改变语句的先后顺序。不存在依赖关系时可以重新排序。 存在数据依赖时,禁止重新排序 但重排序后的指令绝不能
一、一些疑问 什么是Java内存模型JMM JMM与volatile他们两个之间的关系 JMM有哪些特性 为什么要有JMM,他们为什么出现,功能和作用是什么 happens-before先行发生原则是什么 二、计算机硬件存储体系 计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存到CPU 一般对应的程序的操作就是从数据库查询数据到内存然后到CPU进行计算 因为有这么多级的缓
一、线程中断机制 1、概述 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制 — 中断 中断只是一种协商机制,Java没有给中断增加任何语法
一、乐观锁和悲观锁 1、悲观锁 认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的数据修改 synchronized关键字和Lock的实现类都是悲观锁 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确 显式的锁定之后再操作同步资源 // ------------------------- 悲观锁的调用方式 ---------------
一、Future接口理论知识 1、概述 Future接口可以为主线程开启一个分支任务,专门为主线程处理耗时和费力的复杂业务。 Future接口定义了操作异步任务执行的一些方法,如获取异步任务的执行结果,取消任务的执行,判断任务是否被取消,判断任务是否执行完毕。 比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事了,忙其他事情或者先执行完,过了一会才
一、Thread 代码示例: public static void main(String[] args) { Thread t1 = new Thread(()->{ },"t1"); // private native void start0();native修饰的:调用的是c语言编写的本地方法,jvm里面的本地
一、GC 分类 针对 HotSpot VM 的实现,它里面的 GC 按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC) 部分收集(Partial GC):不是完整收集整个 Java 堆的垃圾收集。其中又分为: 新生代收集(Minor GC / Young GC):只是新生代(Eden / S0, S1)的垃圾收集 老年代收集(Major G
一、JVM 参数选项 官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html 1、类型一:标准参数选项 > java -help 用法: java [-options] class [args...] (执行类) 或 java [-options] -jar jar
一、工具概述 1、概述 使用上一章命令行工具或组合能帮您获取目标 Java 应用性能相关的基础信息,但它们存在下列局限: 1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。 2.要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。 3.分析数据通过终端输出,结果展示不够直观。 为此,JDK 提供了一些内存
一、概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。 Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络 I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。 体会 1:使用数据说
一、大厂面试题 支付宝: 支付宝三面:JVM 性能调优都做了什么? 小米: 有做过 JVM 内存优化吗? 从 SQL、JVM、架构、数据库四个方面讲讲优化思路 蚂蚁金服: JVM 的编译优化 jvm 性能调优都做了什么 JVM 诊断调优工具用过哪些? 二面:jvm 怎样调优,堆内存、栈空间设置多少合适 三面:JVM 相关的分析工具使用过的有哪些?具体的性能调优步
一、概述 类加载器是JVM执行类加载机制的前提。 1、ClassLoader的作用: ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLo
一、概述 1、概述 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 其中,验证、准备、解析3个部分统称为链接(Linking) 从程序中类的使用过程看 2、大厂面试题 蚂蚁金服: 描述一下JVM加载Cl
一、概述 1、概述 Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。 Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的数字(称为操作码:Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数:Operands)构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。 由于限制了Java虚拟机操作码
一、概述 1、字节码文件的跨平台性 1、Java语言:跨平台的语言 当Java源代码成功编译为字节码后,如果想在不同的平台上运行,则无须再次编译 这个优势不再那么吸引人了。Python 、PHP 、perl、 ruby 、lisp等有强大的解释器 跨平台似乎已经快成为一门语言必须的特征 2、Java虚拟机:跨语言的平台 Java虚拟机不和包括java在内的任何语言绑定,它只与class文件这种
一、GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 Java不同版本新特性 语法层面:Lambda表达式、switch、自动拆箱装箱、enum API层面:Stream API、新的日期时间、Opti
一、System.gc()的理解 在默认情况下,通过system.gc()或者Runtime.getRuntime().gc()调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而system.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。(因为优先级较低,所以不能保证一定会被执行) JVM实现者可以通过system.gc() 调用来决定
一、标记阶段:引用计数算法 1、对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可
1、什么是垃圾 1、概念 2、什么是垃圾 从上图我们可以很明确的知道,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是
一、String的基本特性 1、String的基本特性 String:字符串,使用一对 "" 引起来表示 String s1 = "lori" ; // 字面量的定义方式 String s2 = new String("lori"); // new 对象的方式 String声明为final的,不可被继承 String实现了Se
一、执行引擎概述 执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被
一、概述 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 起源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高。 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。 Java的NIO库允许Java程序使用直接内存,用于
一、对象的实例化 1、面试题 1、美团 对象在JVM中是怎么存储的 对象头信息里面有哪些东西 2、蚂蚁金服 java对象头里有什么 2、简介 1、创建对象的方式 new:最常见的方式,直接new 或者 单例模式的 getInstance 方法等 Class的newInstance方法:反射方式, 在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 public Const
一、栈、堆、方法区的交互关系 前面的文章中已经了解了 栈 ,堆, java 运行时区中另一个非常重要的区域就是 方法区 从Person person = new Person(); 看 Person 类的 .class 信息存放在方法区中 person 变量存放在 Java 栈的局部变量表中 真正的 person 对象存放在 Java 堆中 在 person 对象中,有个指针指向方法区中的
一、堆的核心概述 堆针对一个JVM进程来说是唯一的,也就是一个进程对应一个JVM实例,但是进程包含多个线程,他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建, 其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中
Copyright © 2005-2023 51CTO.COM 版权所有 京ICP证060544号