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 应用中,每个线程可以存储和管理自己的用户会话信息。

线程请求日志收集

相关推荐
朝朝辞暮i11 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
leikooo12 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
小师兄吃牛肉12 小时前
C语言篇:宏
c语言·开发语言
郑同学的笔记12 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
言乐613 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
weixin_3077791313 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
Ivanqhz13 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
kakakahahahaha13 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i13 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
沙漠之主14 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++