62 一次 Promotion failed 的调试
前言
最近 有一个想法就是, 调试一下 DefNewGeneration 里面的晋升失败的情况
呵呵 对于这块的代码上面, 看着感觉有一些疑问的地方, 因此想通过 实际的调试, 来验证一下 实际的情况
然后 之前写了一个用例, 但是 和心中的期望差距甚大, 当然 主要的问题 还是自己对于 细节的把控不足, 参见 一次 younggc fullgc 的调试
因此 这次又来了, 当然 这个用例 在 vm 层面上做了一定的修改, 以方便 调试 "Promotion failed"
以下代码, 截图 基于 jdk9
一下调试可能是来自于多次调试, 因此 地址信息, 内存大小信息 未必能够对上
测试用例
package com.hx.test08;import org.openjdk.jol.vm.VM;
import org.openjdk.jol.vm.VirtualMachine;import static com.hx.test07.Test30PromotionFailed.touchMinorGc;/*** Test01PromotionFailed** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2020-08-16 15:43*/
public class Test01PromotionFailed {// identStrprivate String identStr = "identStr";public Test01PromotionFailed(String identStr) {this.identStr = identStr;}// Test01PromotionFailed// -Xmx32M -XX:+UseSerialGC -XX:NewRatio=1 -XX:MaxTenuringThreshold=1 -XX:+PrintGCDetails -cp .:/Users/jerry/.m2/repository/org/openjdk/jol/jol-core/0.8/jol-core-0.8.jar// 需要运行时 调整 DefNewGeneration 的相关代码, 这个示例 还需要在稍微调整一下, 能够体现出关系的public static void main(String[] args) throws Exception {VirtualMachine vm = VM.current();int _1M = 1 * 1024 * 800;Test01PromotionFailed[] alreadyInOld = new Test01PromotionFailed[3 * _1M];alreadyInOld[0] = new Test01PromotionFailed("alreadyInOld[0]");System.out.println("alreadyInOld : " + vm.addressOf(alreadyInOld));System.out.println("alreadyInOld[0] : " + vm.addressOf(alreadyInOld[0]));touchMinorGc();System.out.println("alreadyInOld : " + vm.addressOf(alreadyInOld));System.out.println("alreadyInOld[0] : " + vm.addressOf(alreadyInOld[0]));System.out.println(" ------------ alreadyInOld ------------ ");Test01PromotionFailed[] promotionFailed = new Test01PromotionFailed[3 * _1M];promotionFailed[0] = new Test01PromotionFailed("promotionFailed[0]");promotionFailed[1] = alreadyInOld[0];System.out.println("promotionFailed : " + vm.addressOf(promotionFailed));System.out.println("promotionFailed[0] : " + vm.addressOf(promotionFailed[0]));touchMinorGc();System.out.println("promotionFailed : " + vm.addressOf(promotionFailed));System.out.println("promotionFailed[0] : " + vm.addressOf(promotionFailed[0]));System.out.println("alreadyInOld : " + vm.addressOf(alreadyInOld));System.out.println("alreadyInOld[0] : " + vm.addressOf(alreadyInOld[0]));System.out.println(" ------------ promotionFailed ------------ ");}}
执行之后 日志如下
[0.025s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
Signal: SIGSEGV (signal SIGSEGV)
[2.545s][info ][gc] Using Serial
[2.545s][info ][gc,heap,coops] Heap address: 0x00000007be000000, size: 32 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
Signal: SIGSEGV (signal SIGSEGV)
# WARNING: Unable to get Instrumentation. Dynamic Attach failed: null. You may add this JAR as -javaagent manually.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.openjdk.jol.vm.sa.ServiceabilityAgentSupport (file:/Users/jerry/.m2/repository/org/openjdk/jol/jol-core/0.8/jol-core-0.8.jar) to field sun.management.RuntimeImpl.jvm
WARNING: Please consider reporting this to the maintainers of org.openjdk.jol.vm.sa.ServiceabilityAgentSupport
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
# WARNING: Unable to attach Serviceability Agent. You can try again with escalated privileges. Two options: a) use -Djol.tryWithSudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
[15.909s][info ][gc,start ] GC(0) Pause Young (Allocation Failure)
max_promotion_in_bytes = 1 = (size_t) 1
[20.978s][info ][gc,heap ] GC(0) DefNew: 13184K->1600K(14784K)
[20.979s][info ][gc,heap ] GC(0) Tenured: 0K->468K(16384K)
[20.979s][info ][gc,metaspace ] GC(0) Metaspace: 11260K->11260K(1060864K)
[20.985s][info ][gc ] GC(0) Pause Young (Allocation Failure) 12M->2M(30M) 5069.789ms
[20.985s][info ][gc,cpu ] GC(0) User=0.10s Sys=0.21s Real=5.08s
alreadyInOld : 33253750272
alreadyInOld[0] : 33253505256
max : 12M, used : 10M, touchMinorGc created 4 byte[1M]
[21.304s][info ][gc,start ] GC(1) Pause Young (Allocation Failure)
max_promotion_in_bytes = 1 = (size_t) 1
[22.969s][info ][gc,heap ] GC(1) DefNew: 14781K->391K(14784K)
[22.969s][info ][gc,heap ] GC(1) Tenured: 468K->11651K(16384K)
[22.969s][info ][gc,metaspace ] GC(1) Metaspace: 12040K->12040K(1060864K)
[22.969s][info ][gc ] GC(1) Pause Young (Allocation Failure) 14M->11M(30M) 1665.263ms
[22.969s][info ][gc,cpu ] GC(1) User=0.11s Sys=0.00s Real=1.67s
alreadyInOld : 33270016504
alreadyInOld[0] : 33266216512------------ alreadyInOld ------------
promotionFailed : 33254801960
promotionFailed[0] : 33254540032
max : 12M, used : 11M, touchMinorGc created 3 byte[1M]
[22.996s][info ][gc,start ] GC(2) Pause Young (Allocation Failure)
max_promotion_in_bytes = 1 = (size_t) 1
[23.969s][info ][gc,promotion ] Promotion failed
[24.825s][info ][gc,start ] GC(3) Pause Full (Allocation Failure)
[24.827s][info ][gc,phases,start] GC(3) Phase 1: Mark live objects
[25.017s][info ][gc,phases ] GC(3) Phase 1: Mark live objects 190.929ms
[25.017s][info ][gc,phases,start] GC(3) Phase 2: Compute new object addresses
[25.031s][info ][gc,phases ] GC(3) Phase 2: Compute new object addresses 13.600ms
[25.031s][info ][gc,phases,start] GC(3) Phase 3: Adjust pointers
[25.145s][info ][gc,phases ] GC(3) Phase 3: Adjust pointers 113.455ms
[25.145s][info ][gc,phases,start] GC(3) Phase 4: Move objects
[25.153s][info ][gc,phases ] GC(3) Phase 4: Move objects 8.183ms
[25.178s][info ][gc ] GC(3) Pause Full (Allocation Failure) 24M->21M(30M) 353.170ms
[25.178s][info ][gc,heap ] GC(2) DefNew: 13320K->9600K(14784K)
[25.178s][info ][gc,heap ] GC(2) Tenured: 11651K->12026K(16384K)
[25.178s][info ][gc,metaspace ] GC(2) Metaspace: 12040K->12040K(1060864K)
[25.179s][info ][gc ] GC(2) Pause Young (Allocation Failure) 24M->21M(30M) 2183.003ms
[25.179s][info ][gc,cpu ] GC(2) User=0.40s Sys=0.00s Real=2.18s
promotionFailed : 33252442112
promotionFailed[0] : 33262272528
alreadyInOld : 33270016504
alreadyInOld[0] : 33281179280------------ promotionFailed ------------
[25.184s][info ][gc,heap,exit ] Heap
[25.184s][info ][gc,heap,exit ] def new generation total 14784K, used 12163K [0x00000007be000000, 0x00000007bf000000, 0x00000007bf000000)
[25.184s][info ][gc,heap,exit ] eden space 13184K, 92% used [0x00000007be000000, 0x00000007bebe0d00, 0x00000007bece0000)
[25.184s][info ][gc,heap,exit ] from space 1600K, 0% used [0x00000007bee70000, 0x00000007bee70000, 0x00000007bf000000)
[25.184s][info ][gc,heap,exit ] to space 1600K, 0% used [0x00000007bece0000, 0x00000007bece0000, 0x00000007bee70000)
[25.184s][info ][gc,heap,exit ] tenured generation total 16384K, used 12026K [0x00000007bf000000, 0x00000007c0000000, 0x00000007c0000000)
[25.184s][info ][gc,heap,exit ] the space 16384K, 73% used [0x00000007bf000000, 0x00000007bfbbea60, 0x00000007bfbbec00, 0x00000007c0000000)
[25.184s][info ][gc,heap,exit ] Metaspace used 12046K, capacity 12844K, committed 13056K, reserved 1060864K
[25.184s][info ][gc,heap,exit ] class space used 1305K, capacity 1466K, committed 1536K, reserved 1048576K
[25.189s][info ][gc,verify,start] Verifying
[25.570s][info ][gc,verify ] Verifying 381.932ms
从上面可以看到, 整个过程中 总共是触发了 四次 gc
在 分配 alreadyInOld 之前空间不够 触发了一次 young gc
然后 之后 alreadyInOld 之后的 touchMinorGc 触发了一次 young gc, 吧 alreadyInOld 放到了 old(to空间不够, promotion 到了 old)
然后 promotionFailed 之后又触发了一次 gc, 这次 young gc 发生了 "Promotion failed ", 然后 之后 又触发了一次 full gc
我们这里 核心需要关注的是 第三次 gc, 也就是 发生了 "Promotion failed " 的这一次
第一次 gc 的触发时机

第二次 gc, alreadyInOld 的去向

上面日志中有一行 "max_promotion_in_bytes = 1 = (size_t) 1", 这个是为了 更轻松的构造 "Promotion failed ", 运行时修改了一个条件, 修改的是 如下的 collection_attempt_is_safe()
// If the next generation is too full to accommodate promotion// from this generation, pass on collection; let the next generation// do it.if (!collection_attempt_is_safe()) {log_trace(gc)(":: Collection attempt not safe ::");gch->set_incremental_collection_failed(); // Slight lie: we did not even attempt onereturn;}
第三次 gc, Promotion failed
我们这里主要关注几个东西, alreadyInOld[0], promotionFailed, promotionFailed[0] 这三个引用对应的 oop, 以及这三个引用本身
alreadyInOld 在这里并不是那么重要, 仅仅是一个 占用 old 的 dummy
首先来看一下 promotionFailed
[Lcom.hx.test08.Test01PromotionFailed;
{0x00000007be33f6f8} - klass: 'com/hx/test08/Test01PromotionFailed'[]- length: 2457600- 0 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007be200300}- 1 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007bed22ef8}- 2 : NULL- 3 : NULL
结合日志 发现这里的地址是对上的
alreadyInOld : 33270017464
alreadyInOld[0] : 33266216696------------ alreadyInOld ------------
promotionFailed : 33255847672
promotionFailed[0] : 33254540032
我们再来看一下 对于 promotionFailed 的处理
promotionFailed 的 age 为 0, to 里面分配不了空间, 因此尝试 promotion 到 old, old 里面也分配不了空间, 然后 记录了一下 "Promotion failed ", 最后返回的是 promotionFailed 对应的 oop 的地址, 所以 young gc 之后 promotionFailed 对应的 oop 是没有变化的
promotionFailed 这个引用本身, 也没有变化, 也还是 0x00000007be33f6f8

再来看一下 promotionFailed[0]
com.hx.test08.Test01PromotionFailed
{0x00000007be200300} - klass: 'com/hx/test08/Test01PromotionFailed'- ---- fields (total size 2 words):- private 'identStr' 'Ljava/lang/String;' @12 "promotionFailed[0]"{0x00000007be200310} (f7c40062 5)
再来看一下 promotionFailed[0] 的处理, 通过 刚才 "Promotion failed " 的 promotionFailed 找到了 promotionFailed[0]
吧 promotionFailed[0] 复制到了 to, 因此 promotionFailed[0] 被复制到了 to
promotionFailed[0] 这个引用 也指向了 新的地址

再来看一下 alreadyInOld[0]/promotionFailed[1]
com.hx.test08.Test01PromotionFailed
{0x00000007bed22ef8} - klass: 'com/hx/test08/Test01PromotionFailed'- ---- fields (total size 2 words):- private 'identStr' 'Ljava/lang/String;' @12 "alreadyInOld[0]"{0x00000007becea2e0} (f7d9d45c d)
再来看一下 alreadyInOld[0] 的处理, 通过 刚才 "Promotion failed " 的 promotionFailed 找到了 alreadyInOld[0]
吧 alreadyInOld[0] 复制到了 to, 因此 alreadyInOld[0] 被复制到了 to
alreadyInOld[0] 这个引用 也指向了 新的地址

最后, 来到这一次 gc 的末尾, 我们看一下 各个地址的情况
可以看懂 promotionFailed 最后还是在该对象原来的位置, promotionFailed[0], promotionFailed[1] 指向的是 这两个 oop 复制之后的位置
promotionFailed[0], promotionFailed[1] 这两个 oop 之前的位置的数据还在, 因为 "Promotion failed " 不能清理空间, 但是已经没有 引用引用 这两个 oop 了
[1145.114s][info ][gc,promotion ] Promotion failed
[Lcom.hx.test08.Test01PromotionFailed;
{0x00000007be33f6f8} - klass: 'com/hx/test08/Test01PromotionFailed'[]- length: 2457600- 0 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007bee70000}- 1 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007bfb680a8}- 2 : NULL- 3 : NULL- 省略掉预览的其他 251 个 oop 的展示- <2457344 more elements, increase MaxElementPrintSize to print>
com.hx.test08.Test01PromotionFailed
{0x00000007be200300} - klass: 'com/hx/test08/Test01PromotionFailed'- ---- fields (total size 2 words):- private 'identStr' 'Ljava/lang/String;' @12 "promotionFailed[0]"{0x00000007be200310} (f7c40062 5)
com.hx.test08.Test01PromotionFailed
{0x00000007bed22ef8} - klass: 'com/hx/test08/Test01PromotionFailed'- ---- fields (total size 2 words):- private 'identStr' 'Ljava/lang/String;' @12 "alreadyInOld[0]"{0x00000007becea2e0} (f7d9d45c 5)
com.hx.test08.Test01PromotionFailed
{0x00000007bee70000} - klass: 'com/hx/test08/Test01PromotionFailed'- ---- fields (total size 2 words):- private 'identStr' 'Ljava/lang/String;' @12 "promotionFailed[0]"{0x00000007bee70028} (f7dce005 d)
com.hx.test08.Test01PromotionFailed
{0x00000007bed22ef8} - klass: 'com/hx/test08/Test01PromotionFailed'- ---- fields (total size 2 words):- private 'identStr' 'Ljava/lang/String;' @12 "alreadyInOld[0]"{0x00000007becea2e0} (f7d9d45c 5)
第四次 gc
上面的调试输出是 第三次 gc 期间的运行时的数据
第四次 之后的日志 便是上面的, 当然 我们这里 并不是那么关心, 因此 不多赘述
promotionFailed : 33252442112
promotionFailed[0] : 33262272528
alreadyInOld : 33270017464
alreadyInOld[0] : 33281179816
第四次 gc 触发的时机

完
参考
一次 younggc fullgc 的调试
相关文章:
62 一次 Promotion failed 的调试
前言 最近 有一个想法就是, 调试一下 DefNewGeneration 里面的晋升失败的情况 呵呵 对于这块的代码上面, 看着感觉有一些疑问的地方, 因此想通过 实际的调试, 来验证一下 实际的情况 然后 之前写了一个用例, 但是 和心中的期望差距甚大, 当然 主要的问题 还是自己对于 细…...
Git的基本操作
文章目录1.git的工作流程2.git的工作环境3.git的基本操作(1)git init(2)git status(3)git add(4)git commit4.版本控制(1)git reflog与git log(2)再增加两个版本(3)git reset --hard 版本号(4)两个指针4.分支管理(1)对分支的理解(2)git branch和git branch -v(3)git checkout 分…...
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
目录7 两数之和题目描述:解题思路与代码暴力解法:解法一:二分查找解法二:双指针2 斐波那契数列题目描述:解题思路与代码解法一&…...
测试1:测试相关概念
1.测试相关概念 1.1.测试概念 1.1.1.需求 符合正式文档规定的条件和权能,包括用户需求和软件需求 它们之间的的转换是:沟通 用户需求和软件需求的区别: 能否指导开发人员开发,测试人员编写测试用例 1.1.2.缺陷Bug 与正确的…...
2.19 索引和事务
一.联合查询面试问题:聚合查询与联合查询的区别聚合查询是行与行之间的数据加工聚合函数 :count,sum,avg...group by 进行分组,指定列的值,相同的记录合并到同一个组,每个组又可以分别进行聚合查询分组还可以指定条件筛选,如果分组之前指定条件 用where,如果对分组之后指定条件…...
算法导论【摊还分析】—聚合分析、核算法、势能法
算法导论【摊还分析】—聚合分析、核算法、势能法聚合分析核算法势能法假定我们对一个数据结构执行一个由 n 个操作组成的操作序列,当 i 严格为 2 的幂时,第 i 个操作的代价为 i,否则代价为 1 聚合分析 总共有n个操作,1,2,4.....…...
【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version
题目链接:无题目链接,不知道为啥力扣上找不到这一题。 1. 题目介绍(08. 二叉树的下一个节点) 题目:给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点…...
Python 之 Pandas Series 数据结构
文章目录一、Series 结构二、数据结构 Series 创建1. 创建1.1 列表/数组作为数据源创建 Series1.2 字典作为数据源创建 Series1.3 通过标量创建2. 参数说明2.1 index 参数2.2 name 参数2.3 copy 参数三、Series 的索引/切片1. 下标索引2. 标签索引3. 切片四、Series 数据结构的…...
【java基础】Java常用类———包装类
包装类 wrapper 装箱与拆箱 装箱:基本类型->包装类; 拆箱: 包装类->基本类型 public class Integer01 {public static void main(String[] args) {//演示int <--> Integer 的装箱和拆箱//jdk5前是手动装箱和拆箱//手动装箱 in…...
linux shell 入门学习笔记3 shebang
shebang 计算机程序中,shebang指的是出现在文本文件的第一行前两个字符#! 在Unix系统中,程序会分析shebang后面的内容,作为解释器的指令,例如 以#!/bin/sh 开头的文件,程序在执行的时候会调用/bin/sh,也就…...
写作小课堂:简历模版【A4纸正反两面】(20230219)
文章目录 I 联系方式II 个人信息III 求职意向IV 工作经验2018年-11月-至今全城淘信息技术服务有限公司2017年07月-2018年-11月湖南微流网络科技有限公司2014年06月-2017年07月湖南高阳通联信息技术有限公司V 项目经验2018年11月-至今全城淘淘管家2017年10月-2018年11月ASO(机刷…...
一文搞懂 DevOps
前言 DevOps作为一个热门的概念,近年来频频出现在各大技术社区和媒体的文章中,备受行业大咖的追捧,也吸引了很多吃瓜群众的围观。 那么,DevOps是什么呢? 有人说它是一种方法,也有人说它是一种工具&#…...
深入讲解Kubernetes架构-租约
分布式系统通常需要租约(Lease);租约提供了一种机制来锁定共享资源并协调集合成员之间的活动。 在 Kubernetes 中,租约概念表示为 coordination.k8s.io API 组中的 Lease 对象, 常用于类似节点心跳和组件级领导者选举等…...
微信小程序学习第11天——Vant Weapp组件库、API Promise化、全局数据共享Mobx、分包
目录一、小程序对npm 的限制二、使用Vant Weapp组件库1、安装组件2、使用组件3、定制全局样式三、API Promise化1、下载miniprogram-api-promise2、引入3、使用四、全局数据共享五、分包1、分包概念2、使用分包3、独立分包4、分包预下载一、小程序对npm 的限制 在小程序中使用…...
Python3-基本数据类型
Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号&…...
RPA落地指南:什么是RPA
什么是RPA RPA在企业中起什么作用并扮演什么角色呢?想要充分了解RPA,我们需要知道RPA的相关概念、特点、功能以及能解决的问题。接下来对这些内容进行详细介绍。 1.1 RPA的3个核心概念 RPA的中文译名是“机器人流程自动化”,顾名思义&…...
跨域问题的三种解决办法
我们平时对于前后端联调的项目,以下的错误是经常常见的,我们查看浏览器报错: Access to XMLHttpRequest at http://localhost:63110/system/dictionary/all fromorigin http://localhost:8601 has been blocked by CORS policy: No Access…...
c++提高篇——string容器
一、string基本概念 string是C风格的字符串,而string本质上是一个类。 与c语言不同,string是一个类,类内部封装了char*,管理这个字符串,是一个char型的容器。在根本上与c语言字符串是一致的。 在string类内部封装了很…...
[软件工程导论(第六版)]第6章 详细设计(复习笔记)
文章目录6.1 结构程序设计6.2 人机界面设计6.3 过程设计的工具6.3.1 程序流程图(程序框图)6.3.2 盒图(N-S图)6.3.3 PAD图(问题分析图)6.3.4 判定表6.3.5 判断树6.3.6 过程设计语言6.4 面向数据结构的设计方…...
RabbitMQ核心内容:实战教程(java)
文章目录一、安装二、入门1.分类2.核心概念3.工作原理4.六大模式三、模式一:"Hello World!"1.依赖2.生产者代码3.消费者代码四、模式二:Work Queues1.工作原理2.工具类代码:连接工厂3.消费者代码4.生产者代码5.分发策略不公平分发预…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
