当前位置: 首页 > news >正文

java服务内存说明及配置详解

java进程内存

JVM内存分布图:
java mem

【java进程内存】=【堆外内存】 + 【jvm堆内存】
【堆外内存】= 【Metaspace】+ 【Direct Memory】+【JNI Memory】+【code_cache】+ …
堆外内存泄漏的排查在于【本地内存(Native Memory)】=【Direct Memory】+【JNI Memory】

一般堆内存比较好理解,而对于堆外内存,了解比较少。

什么是堆外内存

Non-Heap Space 翻译为非堆内存,也被称为Off-Heap(堆外内存),大家习惯于叫这部分内存为堆外内存。查看了很多国内外文章,对于这块内存,没有很统一的定义。
较可信的是分为下面两种定义:

  1. 广义上的Non-Heap
    除开Heap以外的所有内存,包括MetaSpace、NativeMemory(JNI Memory、Direct Memory等)、Stack、Code Cache等。
    下面讲解的Non-Heap是针对于广义的定义。
  2. 狭义上的Non-Heap
    只包含Metaspace、code_cache。

注意:
监控系统里会有Non-Heap的监控,例如SkyWalking、Arthas的Non-Heap指标,都是通过JDK自带的MemoryMXBean方法获取的。
所以一般监控系统采集的Non-Heap只是Heap以外的一部分内存!还需要留意NativeMemory等等内存。
对应的代码:

@Override
public long getNonHeapMemoryMax() {return memoryMXBean.getNonHeapMemoryUsage().getMax();
}@Override
public long getNonHeapMemoryUsed() {return memoryMXBean.getNonHeapMemoryUsage().getUsed();
}

JNI Memory内存

JNI (Java Native Interface) memory是指Java应用程序与本地代码交互时使用的内存。Java Native Interface (JNI) 是 Java 与本地(如 C 或 C++)代码进行交互的桥梁。出了问题所以需要使用C、C++的思路去解决。
在这里插入图片描述

在这里插入图片描述

ptmalloc2在高并发分配内存时,会存在较多内存碎片无法释放的情况,碎片积压到一定程度甚至会导致进程内存不够用,最终堆外内存泄漏。因此MySQL、TFS、Tair、Redis这些中间件部署时,指定jemlloc内存分配器替代ptmalloc2可更好地管理内存。

内存排查工具

java内存查看相关工具

在这里插入图片描述

实例:

  1. 确定到底是哪个进程占用内存高

ps aux --sort=-%mem

  1. 通过pmap命令可以看到最真实的JVM heap的物理内存的占有量

pmap -X 27045 | head -2; pmap -X 27045 | awk ‘NR>2’ | sort -nr -k6 | head -10

堆外内存相关工具

不同的内存区域可以使用不同的命令进行排查,同时也留意合理设置对应内存区域的参数。
在这里插入图片描述

JVM内存使用量过大问题排查思路

在这里插入图片描述
参考: 【JVM内存】系统性排查JVM内存问题的思路

JVM参数设置说明

  • -Xms4g

初始堆大小 默认物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。初始和最大最好设置成一样,避免堆内存在应用运行过程中自动扩容而影响服务稳定性

  • -Xmx4g

最大堆大小 默认物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。初始和最大最好设置成一样,避免堆内存在应用运行过程中自动扩容而影响服务稳定性
另外一般的应用,XMX可以设置为物理内存的1/2到2/3,较充分地去利用内存。
需要较多地使用Heap外内存应用,物理内存不要超过1/2,例如ElasticSearch、RocketMQ-broker、Kafka等中间件,需要大量读写文件,操作系统需要大量的Page Cache,才能有足够的缓存提高性能,所以JVM Heap不要过大,以预留给非Heap的其他内存。

  • -Xmn

年轻代大小(1.4or lator) 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。尽量设置小一点

  • -Xss128k

每个线程的堆栈大小 JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。

  • -XX:SurvivorRatio=8

Eden区与Survivor区的大小比值 Eden区与Survivor区的大小比值 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

  • -XX:AlwaysPreTouch

(1) 如果未配置了-XX:AlwaysPreTouch,则实际是使用的是虚拟内存,给了一张空头支票,只在首次访问时,例如存放一批新的Java对象数据,但原来申请的内存不够用了,需要新的内存来,这时才需要分配物理内存,也就是通过缺页异常进入内核中,再由内核来分配内存,再交给JVM进程使用。一般情况,不会配置-XX:AlwaysPreTouch。
(2) 如果配置了-XX:AlwaysPreTouch,则JVM启动时,则不仅分配Xms的大小的虚拟内存,还会使用物理内存、填充整个堆。
提前申请好物理内存,减少程序运行过程中发生的物理内存分配带来的延迟,可以提升性能。例如部署elasticsearch节点时,可以指定该参数,提升性能。

  • -XX:+UseG1GC

选择使用G1垃圾收集器,G1日志解析参考:G1日志解析

  • -XX:MetaspaceSize=128M

元数据空间的扩容临界值,元数据空间的内存commited指超过256M,将会发生mixed GC和扩容

  • -XX:MaxMetaspaceSize=256M

一般大小256M足够,因为默认值无限大,如果出现频繁加载class等情况,容易打满系统内存。报错:java.lang.OutOfMemoryError: Metaspace。

  • -XX:MaxDirectMemorySize=1G

默认值等于-Xmx,这个参数直接干预sun.nio.MaxDirectMemorySize这个属性,会限制nio可用的最大直接内存为1G,最好配置直接内存,因为堆外内存一旦泄漏可能会打满整个系统内存,并且很难排查。Netty等框架会用到DirectMemory,且一般设置1G足够。报错:java.lang.OutOfMemoryError: Direct buffer memory。

  • -XX:InitialBootClassLoaderMetaspaceSize=256M

给每个classloader分配的元数据空间初始值是256M

  • -XX:+PrintGCDetails

打印GC日志

  • -XX:+PrintGCDateStamps

打印GC日志附带时间戳

  • -XX:+PrintHeapAtGC

GC之前和GC之后的堆的内存使用情况要打印出来

  • -Xloggc:/data/logs/java/gc.log

GC日志的存储路径(前缀)

  • -XX:+UseGCLogFileRotation

GC日志文件开启滚动存储
-XX:NumberOfGCLogFiles=5
GC日志文件最多保留5个

  • -XX:GCLogFileSize=30M

每个GC日志文件最大30M,超过30M,生成新的文件

  • -XX:+HeapDumpOnOutOfMemoryError

当发生内存溢出时dump堆转储文件

  • -XX:HeapDumpPath=/data/logs/java/heap_dump_%p.hprof

堆转储文件的存放地址

JVM方法区(元空间)大小设置

-XX:MetaspaceSize设置元空间初始大小
-XX:MaxMetaspaceSize最大可分配大小
解释JDK8及以后:可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置元空间初始大小以及最大可分配大小。
例子:设置初始大小是100M,最大可分配空间也是100M。-XX:MetaspaceSize=100m -XX:MaxMetaspaceSize=100m。
如果不指定元空间的大小,默认情况下,元空间最大的大小是系统内存的大小,元空间一直扩大,虚拟机可能会消耗完所有的可用系统内存。如果元空间内存不够用,就会报OOM。默认情况下,对应一个64位的服务端JVM来说,其默认的-XX:MetaspaceSize值为21MB,这就是初始的高水位线,一旦元空间的大小触及这个高水位线,就会触发Full GC并会卸载没有用的类,然后高水位线的值将会被重置。如果初始化的高水位线设置过低,会频繁的触发Full GC,高水位线会被多次调整。所以为了避免频繁GC以及调整高水位线,建议将-XX:MetaspaceSize设置为较高的值, -XX:MaxMetaspaceSize,一般大小256M足够,因为默认值无限大,如果出现频繁加载class等情况,容易打满系统内存,出现系统风险。

Heap Dump文件生成

heap dump进行分析工具

事先需要准备软下软件包:

  • JDK 11+(目前MAT最新版本1.13.0要求使用)
  • Memory Analyzer Tool (MAT)

MAT官方下载页面:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

软件包准备就绪后,解压JDK和MAT到任意目录,无需其他安装操作。

使用命令可以立刻获取某个Java进程的heap dump。

使用jmap命令:

jmap -dump:live,format=b,file=/path/to/heapdump.hprof [pid]

使用jcmd命令:

jcmd [pid] GC.heap_dump /path/to/heapdump.hprof

其中为需要分析的Java进程的pid。/path/to/heapdump.hprof为生成的heap dump文件所在的路径。

在特定时间点生成

考虑到如下场景:我们需要获取Java程序出现异常的时候(例如OOM)的heap dump。这种场景下我们无法使用上面讲解的命令,Java进程出现问题的时候可能已经被系统kill掉。因此我们需要配置JVM,让他能够在特定时间点自动生成heap dump。

下面列出生成heap dump的时间点和对应的JVM参数。

在OOM的时候生成heap dump:

-XX:+HeapDumpOnOutOfMemoryError

在full GC前生成heap dump:

-XX:+HeapDumpBeforeFullGC

在full GC后生成heap dump:

-XX:+HeapDumpAfterFullGC

在按下ctrl+break的时候生成heap dump:

-XX:+HeapDumpOnCtrlBreak

注意: 指定heap dump文件生成的路径需要配置-XX:HeapDumpPath=/path/to/heapdump.hprof。

Heap Dump分析

对于不是很大的heap dump文件(不大于MAT分析机器内存的1.2倍),我们可以将heap dump文件压缩后下载到本地,使用MAT图形界面方式分析。操作方法比较直观(File -> Open Heap Dump…),这里不再赘述。

生产环境中可能遇到特别大的heap dump。比如我们要分析一个30G的heap dump。将其在服务器上压缩之后,空间占用仍有大约10G,下载到本地耗时很长。本地开发机器一般也很少见32G内存机器,分析的时候会出现内存溢出问题。这种情况下我们需要使用MAT提供的命令行功能,在服务器上进行分析并输出分析报告。这些分析报告是静态的web页面,只有几百KB大小。需要在本地做的仅仅是将这些报告下载下来用浏览器打开,这样完美避免了本地开发环境配置不足的问题。

在服务器上使用MAT命令行分析的方法很简单。在MAT安装目录中执行:

./ParseHeapDump.sh xxx.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

其中xxx.hprof在实际使用的时候需要替换为hprof文件的路径。运行完毕后在hprof文件所在目录会生成一系列的index/threads文件和3个压缩文件。这3个压缩文件是我们重点关注的分析报告,分别为:

  • xxx_Leak_Suspects.zip:报告包含怀疑造成内存泄漏的地方,报告中包含了class层级图。对于OOM的场景能够很容易的定位到是哪个对象占用了大量内存不释放。
  • xxx_System_Overview.zip:包含heap dump基本信息,dump进程JVM的相关配置和线程信息等。
  • xxx_Top_Components.zip:查看占用空间最大的几个object/class/classloader/package等。报告以饼图和表格的形式展示。通过这个报告可以定位出Java程序运行时哪些对象占用内存较多,对问题排查和程序优化很有帮助。

这三个报告是分析问题的关键。我们通过报告找出内存占用过大的对象,然后结合日志和项目源代码分析程序逻辑,逐步定位出问题。

jvm配置实例

  1. demo1
export JAVA_OPTS="-Xmx2048m -Xms2048m -Xss128k -XX:SurvivorRatio=8 -XX:MetaspaceSize=256m \
-XX:MaxDirectMemorySize=1G \
-XX:+UseG1GC -XX:MaxGCPauseMillis=300 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/data/heapdump.hprof \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC \
-Xloggc:/export/Data/gc-%t.log -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100M -XX:NumberOfGCLogFiles=20"echo "环境变量:"
echo "JAVA_OPTS:$JAVA_OPTS"
echo "JAVA_OPTS_EXT:$JAVA_OPTS_EXT"echo "应用启动命令:"
echo "java   $JAVA_OPTS $JAVA_OPTS_EXT -jar $MAIN_JAR >/dev/null 2>&1"java ${PFINDER_AGENT:-}  $JAVA_OPTS $JAVA_OPTS_EXT -jar $MAIN_JAR >/dev/null 2>&1

相关文章:

java服务内存说明及配置详解

java进程内存 JVM内存分布图: 【java进程内存】【堆外内存】 【jvm堆内存】 【堆外内存】 【Metaspace】 【Direct Memory】【JNI Memory】【code_cache】 … 堆外内存泄漏的排查在于【本地内存&#xff08;Native Memory&#xff09;】【Direct Memory】【JNI Memory】 一般…...

Mybatis-MyBatis的缓存

Mybatis-MyBatis的缓存 一、MyBatis的一级缓存二、MyBatis的二级缓存二级缓存的相关配置 三、MyBatis缓存查询的顺序 一、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession查询的数据会被缓存&#xff0c;下次查询相同的数据&#xff0c;就 会从…...

计算机组成原理之硬件的基本组成,深入介绍两大计算机结构体系,从底层出发认识计算机。

大家好&#xff0c;欢迎阅读《计算机组成原理》的系列文章&#xff0c;本系列文章主要的内容是从零学习计算机组成原理&#xff0c;内容通俗易懂&#xff0c;大家好好学习吧&#xff01;&#xff01;&#xff01; 更多的优质内容&#xff0c;请点击以下链接查看哦~~ ↓ ↓ ↓ …...

二十五、MySQL事务的四大特性和常见的并发事务问题

1、事务的四大特性 2、常见的并发事务问题 &#xff08;1&#xff09;并发事务问题分类&#xff1a; &#xff08;2&#xff09;脏读&#xff1a; 一个事务正在对一条记录做修改&#xff0c;在这个事务完成并提交前&#xff0c;这条记录的数据就处于不一致的状态&#xff1b;…...

辨析常见的医学数据分析(相关性分析回归分析)

目录 1 常见的三种分类结果&#xff1f; 2 什么是相关性分析&#xff1f; 相关性分析的结果怎么看&#xff1f; 3 什么是回归分析&#xff1f; 1&#xff09;前提 2&#xff09;常见的回归模型 4 对于存在对照组实验的医学病例如何分析&#xff1f; 1&#xff09;卡方检验…...

SpringBoot项目中只执行一次的任务写法

SpringBoot项目中只执行一次的任务写法 有时候我们需要进行初始化工作&#xff0c;就说明只要进行一次的工作&#xff0c;那么&#xff0c;在Springboot项目中如何做到任务只进行一次呢 利用定时任务 在Spring Boot项目中&#xff0c;你可以使用Spring框架提供的Scheduled注解…...

TCK、TMS、TDI、TDO的含义

这四个信号是JTAG&#xff08;Joint Test Action Group&#xff09;界面的一部分。JTAG是一种用于测试和验证集成电路和印刷电路板的技术&#xff0c;也用于进行设备编程和调试。这四个信号分别是&#xff1a; TCK (Test Clock)&#xff1a; 意义&#xff1a;测试时钟&#xff…...

R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...

全文链接&#xff1a;http://tecdat.cn/?p24456 如果你正在进行统计分析&#xff1a;想要加一些先验信息&#xff0c;最终你想要的是预测。所以你决定使用贝叶斯&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 但是&#xff0c;你没有共轭先验。你…...

【PowerShell】PowerShell的Core版本的额外配置

在PowerShell 7.1 安装完成后,默认情况下打开PowerShell 会直接进入到系统内置的PowerShell,如果希望通过远程连接或者PowerShell Web Access 进入到PowerShell 7环境的界面,就需要进行环境的再配置才能实现PowerShell 7.1 的环境连接。需要为外部的环境提供连接的话需要按照…...

数据结构----链式栈

目录 前言 链式栈 操作方式 1.存储结构 2.初始化 3.创建节点 4.判断是否满栈 5.判断是否空栈 6.入栈 7.出栈 8.获取栈顶元素 9.遍历栈 10.清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法&#xff0c;&#xff08;链接&#xff1a;线性表-----栈&#xff08;栈…...

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是&#xff0c;过去以为AI智能化、大模型技术是很高深的事情。但现在&#xff0c;我们通过RPA等数字化工具&#xff0c;自主根据自己的工作岗位&#xff0c;完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…...

upload-labs文件上传1-5关

第一关 编写一句话木马1.php&#xff0c;编写完成后将后缀名修改为png 将1.png上传&#xff0c;上传时使用bp抓包 抓包后将后缀名修改为png 连接蚁剑 第二关 上传1.php&#xff0c;显示文件类型不正确 使用bp抓包发送重发器&#xff0c;修改文件后缀名后点击发送&#xff0c;…...

git的基本使用

查看当前分支 git branch //查看本地分支 git branch -a // 查看本地和远程的分支切分支 git checkout -b 分支的名字从当前分支切换到其他分支 拉取远程分支到本地 拉取远程develop分支代码到本地develop分支 git checkout -b develop origin/developgit merge B分支合并…...

Mac台式电脑内存清理方法教程

对于一些小白用户&#xff0c;如果觉得以上的清理方法比较复杂却又想要更好的优化Mac电脑内存&#xff0c;专业的系统清理软件是一个不错的选择。比起花几个小时时间浏览文件夹、删除临时文件、缓存和卸载残留。Cleanmymac X&#xff0c;只需单击几下即可完成所有内存清理工作&…...

FL Studio怎么破解?2023年最新FL Studio 21图文安装激活教程?FL 21中文版下载 v21.1.1.3750 汉化 版

fl studio21中文解锁特别破解版是一款功能强大的编曲软件&#xff0c;也就是众所熟知的水果软件。它可以编曲、剪辑、录音、混音&#xff0c;让您的计算机成为全功能录音室。除此之外&#xff0c;这款软件功能非常强大&#xff0c;为用户提供了许多音频处理工具&#xff0c;包含…...

Zookeeper高级_四字命令

之前使用stat命令来验证ZooKeeper服务器是否启动成功&#xff0c;这里的stat命令就是ZooKeeper 中最为典型的命令之一。ZooKeeper中有很多类似的命令&#xff0c;它们的长度通常都是4个英文字母&#xff0c;因此我们称之为“四字命令”。 添加配置 vim zoo.cfg 4lw.commands…...

/usr/bin/ld: cannot find -lmysqlcllient

文章目录 1. question: /usr/bin/ld: cannot find -lmysqlcllient2. solution 1. question: /usr/bin/ld: cannot find -lmysqlcllient 2. solution 在 使用编译命令 -lmysqlclient时&#xff0c;如果提示这个信息。 先确认一下 有没有安装mysql-devel 执行如下命令 yum inst…...

折线图geom_line()参数选项

往期折线图教程 图形复现| 使用R语言绘制折线图折线图指定位置标记折线图形状更改 | 绘制动态折线图跟着NC学作图 | 使用python绘制折线图 前言 我们折线的专栏推出一段时间&#xff0c;但是由于个人的原因&#xff0c;一直未进行更新。那么今天&#xff0c;我们也参考《R语…...

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展&#xff0c;越来越多的企业开始意识到网站优化的重要性&#xff0c;其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn 百度SEO优化是指针对百度搜索引擎…...

2023 ICPC 网络赛 第一场 部分题解 (待完善)

D Transitivity 题解: 根据题意可以推出结论: 如果存在连通块,那么这个连通块要满足条件,必然是满连通块. 一共有两种情况 1. 存在一个连通块不是满连通块 设cnt表示连通块的节点个数, num表示连通块边的个数 一个连通块的贡献 cnt*(cnt-1)/2 - num; 那么最终答案 连…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...