最近,某头部大厂的神秘事件在圈内炸开了锅,不少技术人都在群里吃瓜。
据说是一位来自某顶尖高校的实习生在字节跳动的大模型训练项目上,感受到了不公平的资源分配,于是他决定用代码“发泄一下”情绪。
利用了 Huggingface 的漏洞,注入了恶意代码。这段代码不仅随机调整模型参数,还故意设置了睡眠时间。
他潜伏在内部 debug 群内进行极致攻防!
导致模型训练结果一直波动,训练成果完全不靠谱!
想象一下,字节这么大个公司,8000多张昂贵的H100 GPU集群跑了几个月,结果却因为这段代码,全都白费了。这损失,初步估算至少要上千万!
事情被发现后,这位田姓实习生自然被辞退了。而后,字节内部和行业联盟都被同步了这件事。这在圈内可谓是“举世皆知”。
不过,这位实习生似乎并不认输(听说是入职六小龙失败)。开始“辟谣”,说自己只是论文发完后离职,锅是别人扣在他头上的,真是“一波未平,一波又起”。
听说还找自媒体博主传播一下他的“辟谣”。
但根据媒体渠道的报道来看,字节内部已明确此事为田姓实习生所为!
这次的事故有多严重?百度百科都已经光速收录了!
这里给大家科普下刑法第 286 条:
第二百八十六条【破坏计算机信息系统罪(刑法第286条)】 违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。
希望大家应以为戒,不要因为冲动带了银手镯。
吃瓜完毕,继续面试刷题!争取早日找到工作或跳槽成功!
今天来看一道非常经典又容易遗忘的面试题:
Spring IOC 容器初始化过程?
回答重点
先和面试官说一共有四个阶段,分别是启动、Bean 定义注册、实例化和依赖注入、初始化,然后停顿下,如果面试官示意你继续,然后再细化讲解每个阶段的细节。
1)启动阶段:
配置加载:加载配置文件或配置类,IoC 容器首先需要加载应用程序的配置信息,这些配置信息可以是 XML 配置文件、Java 配置类或注解配置等方式。 创建容器:Spring 创建 IOC 容器(BeanFactory 、 ApplicationContext),准备加载和管理 Bean。
2)Bean 定义注册阶段:
解析和注册:BeanDefinitionReader 读取解析配置中的 Bean 定义,并将其注册到容器中,形成 BeanDefinition 对象。
3)实例化和依赖注入:
实例化:根据 BeanDefinition 创建 Bean 的实例。 依赖注入:根据 BeanDefinition 中的依赖关系,可以通过构造函数注入、Setter 注入或字段注入,将依赖注入到 Bean 中。
4)初始化:
BeanPostProcessor 处理:这些处理器会在 Bean 初始化生命周期中加入定义的处理逻辑,postProcessBeforeInitialization 和 postProcessAfterInitialization 分别在 Bean 初始化前后被调用。 Aware 接口调用:如果 Bean 实现了 Aware 接口(如 BeanNameAware、BeanFactoryAware),Spring 会回调这些接口,传递容器相关信息。 初始化方法调用:调用 Bean 的初始化方法(如通过 @PostConstruct 注解标注的方法,或实现 InitializingBean 接口的 bean 会被调用 afterPropertiesSet 方法)。
扩展知识
初始化细节
1)启动阶段细节:
配置文件解析:Spring 使用 XmlBeanDefinitionReader 解析 XML 配置文件,使用 AnnotatedBeanDefinitionReader 解析注解配置类。 上下文初始化:是通过创建具体的 ApplicationContext 实现(如 ClassPathXmlApplicationContext、AnnotationConfigApplicationContext),调用其 refresh 方法启动容器。
2)Bean 定义注册细节:
BeanDefinition:每个 BeanDefinition 对象包含 Bean 的类名、作用域(singleton/prototype)、依赖关系、初始化方法、销毁方法等信息。 BeanDefinitionRegistry:Spring 将 BeanDefinition 对象注册到 BeanDefinitionRegistry,形成 Bean 的定义数据结构。
3)实例化和依赖注入细节:
实例化策略:Spring 使用 InstantiationStrategy 接口来实例化 Bean,常用的实现是 CglibSubclassingInstantiationStrategy。(还有一个是jdk的) 依赖解析:Spring 通过 DependencyDescriptor 对象描述依赖项,并在容器中查找匹配的 Bean 进行注入。
4)初始化细节:
BeanPostProcessor 上面已经说了,这里不再赘述。 Aware 接口:如 BeanNameAware 获取 Bean 的名称,BeanFactoryAware 获取当前 BeanFactory 实例。 生命周期回调:使用 @PostConstruct 注解的方法会在依赖注入完成后立即调用,InitializingBean 接口的 afterPropertiesSet 方法也是如此。
初始化方法的执行顺序
顺序如下:
1)BeanPostProcessor#postProcessBeforeInitialization
2)@PostConstruct
标注在方法上的 @PostConstruct 注解会在 Bean 的属性设置完成之后立即被调用。
3)afterPropertiesSet
实现 InitializingBean 接口的 afterPropertiesSet 方法会在 @PostConstruct 方法之后被调用。
4)initMethod
在 xml 和 @Bean 注解里,都可以通过 initMethod 执行初始化方法。
5)BeanPostProcessor#postProcessAfterInitialization。
最后
再来推荐下我们的面试刷题网站和小程序:面试鸭!
面试鸭立志成为 一款题库全面、持续更新、题解优质的刷题神器,主要目的就是为了彻底解决所有你能想到的八股文学习痛点!
我们精选了近两年的高频面试真题,已经 有 9000 多道面试题 啦,由大厂资深面试官手写答案,押题命中率超高!
不仅有传统八股文,场景题、项目题、系统设计题等等应有尽有,还在不断更新中!
网页端网址:mianshiya.com
欢迎关注面试鸭,每日获取经典面试题和优质题解,我们下期见~
往期推荐
我的编程学习小圈子
自从来了这家神仙公司,我躺平了
创业一年半,我的团队终于走向正轨了!
24 年最新项目,手把手教程
超 10 万人在用的简历模板,绝了
我整理了 50 多个简历致命问题,知道为什么投简历没回复了!