JAVA相关知识

JAVA基础知识

说一下对象创建的过程?

  1. 类加载检查:当Java虚拟机(JVM)遇到一个类的new指令时,它首先检查这个类是否已经被加载、链接和初始化。如果没有,JVM会通过类加载器(ClassLoader)加载这个类。
  2. 分配内存:JVM为新对象分配内存。这个内存分配是在堆(Heap)上进行的,堆是JVM用来存储对象实例的地方。分配内存的大小在类加载时就已经确定,因为类的结构(包括字段和方法)已经确定。
  3. 零值初始化:在内存分配之后,JVM会将分配的内存空间初始化为零值。对于对象引用,零值是null;对于整数类型,零值是0;对于浮点类型,零值是0.0;对于布尔类型,零值是false;对于字符类型,零值是\u0000(即Unicode字符'\u0000')。
  4. 设置对象头:JVM会设置对象头(Object Header),它包含了对象的运行时数据,如哈希码、GC分代年龄等信息。
  5. 调用构造方法:在内存分配和初始化之后,JVM调用对象的构造方法(Constructor)。构造方法是一个特殊的方法,用于初始化新创建的对象。构造方法的名称必须与类名相同,并且没有返回类型。
  6. 对象创建完成:一旦构造方法执行完成,对象就被认为是创建完成的。此时,对象可以被使用,它的字段已经被构造方法赋予了初始值。
  7. 垃圾回收:当对象不再被引用时,它可能会成为垃圾回收(Garbage Collection, GC)的目标。GC是JVM用来回收不再使用的对象所占用的内存的机制。

ThreadLocal是什么?实现原理是什么?

ThreadLocal 是线程独有,而不是进程独有。

在Java中,ThreadLocal 为每个线程提供了一个独立的变量副本,这意味着每个线程访问自己的 ThreadLocal 变量时,都是访问自己的副本,不会与其他线程共享。这是通过在每个线程的 Thread 对象中维护一个 ThreadLocal.ThreadLocalMap 实现的,这个映射表将 ThreadLocal 对象作为键,将线程的局部变量值作为值。

线程隔离:每个线程通过自己的 ThreadLocalMap 存储数据,因此每个线程都有自己独立的副本,实现了线程隔离。

内存分配:ThreadLocal 的内存分配是在线程的栈上进行的,每个线程都有自己的栈,因此 ThreadLocal 变量的存储也是线程独有的。
ThreadLocal 通常用于以下场景:

数据库连接和会话管理:每个线程可以拥有自己的数据库连接,这样可以避免多线程操作时的数据库连接冲突。

事务处理:在处理事务时,每个线程可以有自己的事务对象,互不干扰。

用户会话信息:在 Web 应用中,每个线程可以存储和管理自己的用户会话信息。

线程请求日志收集

相关推荐
Source.Liu几秒前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马4 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng7 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
七星静香8 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员9 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU10 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie613 分钟前
在IDEA中使用Git
java·git
小白学大数据16 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA633718 分钟前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言