JVM专题九:JVM分代知识点梳理
今天开始,咱们开始剖析JVM内存划分的原理细节,以及我们创建的那些对象在JVM中到底是如何分配,如何流动的,首先解决第一个问题:JVM内存的一个分代模型:年轻代、老年代、永久通过之前的专题我们知道,那就是我们在代码里创建的对象,“都”会进入到Java堆内存。
为什么需要分代
JVM需要分代的主要原因是优化垃圾回收(Garbage Collection, GC)的效率。以下是分代垃圾回收模型的几个关键优势:
-
对象生命周期的统计特性: 大多数对象都是朝生夕死,即它们被创建后很快就会变得不再被使用。分代模型利用了这一特性,将新创建的对象放在年轻代,这样大部分短暂的对象可以快速被回收,而不需要频繁地对整个堆进行垃圾回收。
-
垃圾回收效率: 年轻代的垃圾回收(Minor GC)通常比老年代的垃圾回收(Major GC或Full GC)要快得多,因为年轻代的对象数量多,但存活率低。通过在年轻代进行频繁的垃圾回收,可以快速清理大量不再使用的对象,减少对老年代的影响。
-
减少Full GC的频率: 由于大部分对象在年轻代就会被回收,因此进入老年代的对象相对较少,这减少了对整个堆进行垃圾回收(Full GC)的需要,Full GC通常成本更高,因为它需要扫描整个堆内存。
-
内存分配的局部性优化: 年轻代的内存分配通常具有很好的局部性,因为新对象倾向于在相近的内存地址上创建。这有助于现代CPU缓存的利用,从而提高内存访问效率。
-
对象老化的自然过程: 对象在年轻代中经过多次GC后,如果仍然存活,说明它们可能是长时间存活的对象。将这些对象移动到老年代可以减少年轻代中对象的老化检查,从而提高GC效率。
-
不同的垃圾回收算法: 年轻代和老年代可以使用不同的垃圾回收算法。例如,年轻代通常使用复制算法,因为它简单且高效,而老年代可能使用标记-清除或标记-清除-整理算法,因为老年代的对象存活率更高,需要更复杂的算法来处理碎片问题。
-
内存空间的合理分配: 通过分代,JVM可以根据对象的生命周期特性合理分配内存空间。年轻代通常分配较小的内存空间,因为大多数对象都是短暂存在的,而老年代则分配较大的空间,用于存放长期存活的对象。
-
适应不同的应用场景: 不同的应用可能有不同的对象生命周期特性。通过分代,JVM可以更灵活地适应不同的应用场景,通过调整年轻代和老年代的大小,以及垃圾回收算法,来优化性能。
通过上述分代模型的优势,JVM能够更高效地管理内存,减少垃圾回收的开销,从而提高Java程序的整体性能。
新生代是如何进入老年代的?
新生代对象进入老年代的过程,通常被称为"晋升"(Promotion)。以下是对象从新生代晋升到老年代的几个关键步骤和机制:
-
对象分配: 当一个新对象在Java程序中创建时,它首先被分配到新生代的Eden区。
-
Minor GC: 新生代会定期进行Minor GC,以回收Eden区和Survivor区中不再被引用的对象。存活的对象会被复制到另一个Survivor区(S0或S1)。
-
对象年龄: 在Minor GC之后,存活的对象会有一个年龄计数器,每次在Survivor区之间复制时,对象的年龄会增加。
-
年龄阈值: 对象的年龄达到一定的阈值(默认是15,但可以通过
-XX:MaxTenuringThreshold
参数调整),对象就会被认为足够"老",应该被晋升到老年代。 -
动态年龄调整: JVM会根据Survivor区的使用情况动态调整对象晋升到老年代的年龄阈值。如果Survivor区空间不足,JVM可能会降低年龄阈值,使对象更快地晋升到老年代。
-
空间分配担保: 当一个对象在Survivor区存活多次后,JVM会检查老年代的可用空间。如果老年代有足够的空间,对象会被晋升;如果没有,JVM会尝试进行一次Full GC来清理老年代的空间,然后再尝试晋升对象。
-
晋升到老年代: 一旦对象的年龄达到阈值,或者Survivor区空间不足,对象就会被复制到老年代。在老年代,对象不需要像在新生代那样频繁移动,因为老年代的垃圾回收频率较低。
-
空间分配担保的实现: 晋升过程中,JVM会使用一种称为"空间分配担保"(Space Accounting Guarantee)的策略,确保老年代有足够的空间来接收新生代晋升的对象。如果老年代空间不足,JVM会尝试压缩老年代,或者触发Full GC。
-
TLABs: 为了进一步优化内存分配,JVM还使用线程本地分配缓冲区(Thread Local Allocation Buffers, TLABs)。每个线程有自己的TLAB,用于分配对象,这样可以减少线程之间的内存分配竞争。
通过这些机制,JVM能够根据对象的生命周期特性,有效地将对象从新生代晋升到老年代,同时保持垃圾回收的效率和性能。
什么时候触发新生代垃圾回收
新生代垃圾回收(Minor GC)的触发时机如下:
-
内存分配限制:当新生代的Eden区内存耗尽,无法满足新对象的内存分配请求时,将触发Minor GC以释放内存空间。
-
内存使用监控:JVM内部监控新生代内存使用情况,当达到预设的内存使用阈值时,可能触发Minor GC。
-
GC算法实现:根据JVM所采用的垃圾回收算法实现,可能存在特定的条件或时间间隔来触发Minor GC。
-
显式GC请求:尽管
System.gc()
方法的调用并不保证立即执行GC,但它提供了一个显式的GC请求,JVM可能会响应此请求并触发Minor GC。 -
自适应调整:JVM可能采用自适应算法根据应用程序的内存分配模式和垃圾回收效率来动态决定Minor GC的触发时机。
-
内存分配速率:如果对象的内存分配速率持续超过GC回收速率,JVM可能会触发Minor GC以避免内存溢出。
-
堆内存压力:在堆内存使用接近其最大容量时,JVM可能会增加Minor GC的频率,以防止内存耗尽。
-
JVM参数配置:特定的JVM启动参数,如
-XX:+UseAdaptiveSizePolicy
,允许JVM根据当前的内存分配和回收效率自适应地调整新生代的大小和Minor GC的触发策略。 -
外部系统因素:操作系统的内存压力或资源限制也可能间接影响JVM对Minor GC的触发决策。
-
GC日志和性能监控:通过监控GC日志和性能指标,JVM可以分析对象生命周期和内存分配模式,以优化Minor GC的触发时机。
Minor GC是JVM内存管理的关键机制之一,其触发机制的设计旨在平衡内存回收的效率和应用程序的性能需求。
什么情况会进入老年代
在JVM中,对象从新生代晋升到老年代的条件主要包括以下几点:
-
年龄阈值:对象在Survivor区存活的次数达到JVM设置的年龄阈值(
-XX:MaxTenuringThreshold
参数,默认为15),该对象将被晋升到老年代。 -
空间分配担保:如果Survivor区的空间不足以容纳经过Minor GC后存活的对象,JVM会检查老年代的可用空间。如果老年代有足够的空间,这些对象将被直接晋升到老年代。
-
动态年龄调整:JVM可能会根据当前内存分配和回收的统计信息,动态调整对象晋升到老年代的年龄阈值。
-
老年代空间充足:即使对象的年龄未达到最大年龄阈值,如果老年代有足够的空间,JVM也可能将对象提前晋升到老年代。
-
Full GC后的存活对象:在执行Full GC(老年代GC)后,新生代中所有存活的对象可能被直接晋升到老年代,以减少跨代引用的问题。
-
大对象直接分配:对于占用大量连续内存的大对象(如大型数组),JVM可能会直接将其分配到老年代,以避免在新生代中分配时产生过多的内存碎片。
-
长期存活对象:某些对象由于其生命周期较长,经过多次Minor GC后仍然存活,这些对象最终会被晋升到老年代。
-
JVM参数配置:JVM参数如
-XX:TargetSurvivorRatio
(目标Survivor区使用率)和-XX:PretenureSizeThreshold
(直接分配到老年代的对象大小阈值)可以影响对象晋升到老年代的行为。 -
内存分配策略:JVM的内存分配策略,如TLAB(Thread Local Allocation Buffer)的使用,也可能影响对象是否直接在老年代分配。
-
垃圾回收器的选择:不同的垃圾回收器可能有不同的晋升策略和内存管理机制。
对象晋升到老年代是一个动态的过程,JVM会根据当前的内存使用情况和垃圾回收效率来做出最合适的决策。
分别怎么进行垃圾回收
VM中的垃圾回收(Garbage Collection, GC)主要针对新生代和老年代采用不同的策略,以下是两种区域垃圾回收的基本方法:
新生代垃圾回收(Minor GC或Young GC)
-
复制算法:新生代通常使用复制算法(Copying)。该算法将Eden区和Survivor区(S0)中存活的对象复制到另一个Survivor区(S1)。复制完成后,Eden区和S0中的所有对象都会被清理。
-
对象年龄:每次Minor GC后,存活的对象年龄会递增。当对象的年龄达到
-XX:MaxTenuringThreshold
参数设定的阈值时,对象会被晋升到老年代。 -
清理过程:Minor GC主要涉及Eden区和Survivor区的清理,不涉及老年代。
-
内存分配:新创建的对象首先分配到Eden区,或者直接分配到TLAB(如果启用)。
-
触发条件:当Eden区被填满,或者Survivor区无法容纳从Eden区复制过来的存活对象时,会触发Minor GC。
老年代垃圾回收(Major GC或Full GC)
-
标记-清除算法:老年代的垃圾回收通常从标记所有存活的对象开始,然后清除未被标记的对象。
-
标记-清除-整理:为了防止内存碎片化,清除之后可能会进行一次整理,将存活的对象移动到堆的一端,以便于连续内存分配。
-
并发收集:老年代的垃圾回收可能采用并发收集算法,以减少GC暂停时间。
-
分代收集:老年代的GC可能与新生代的GC同时进行,这种GC被称为Full GC。
-
压缩技术:为了减少内存碎片,老年代的GC可能采用压缩技术,如G1 GC的Region重排。
-
触发条件:老年代GC可能由以下条件触发:
- 老年代空间不足。
- 显式调用
System.gc()
。 - 达到某些JVM参数设定的内存使用阈值。
-
内存分配:老年代用于存放长期存活的对象,以及从新生代晋升上来的对象。
-
性能影响:由于老年代GC涉及整个堆或大部分堆的内存,它通常比Minor GC有更长的暂停时间和更大的性能影响。
总结
- 新生代GC(Minor GC)通常更频繁,使用复制算法,回收速度快,影响较小。
- 老年代GC(Major GC或Full GC)较少见,使用标记-清除(可能伴随整理)算法,回收速度慢,可能引起较长时间的暂停。
JVM的垃圾回收策略和算法可以根据具体的垃圾回收器和JVM参数进行调整,以适应不同的应用场景和性能要求。
什么是永久代?
在JVM中,永久代(Permanent Generation,简称PermGen)是方法区的一种实现,主要用于存储类信息、常量、静态变量等数据。以下是对您提供内容的扩展和澄清:
永久代(PermGen)的角色
- 类信息存储:永久代存储了类的元数据,包括类的字段、方法、构造函数等信息。
- 常量池:存储编译期就已经确定的字面量和符号引用。
- 静态变量:存储类的静态变量。
- ClassLoader数据:存储类加载器的引用。
方法区垃圾回收的条件
方法区中的类信息并不是一直存在的,它们也可以被垃圾回收。以下是类信息可以被回收的条件:
- 实例对象的回收:类的所有实例对象已经被垃圾回收,即Java堆中不存在该类的任何实例。
- ClassLoader的回收:加载该类的ClassLoader已经被垃圾回收。
- 无引用的Class对象:堆中不存在任何对该Class对象的引用。
垃圾回收机制
- 条件触发:只有当上述三个条件同时满足时,类信息才会变成垃圾,被JVM的垃圾回收机制处理。
- 回收过程:JVM在进行垃圾回收时,会检查类是否满足回收条件,如果满足,就会在下一次的Full GC中被清除。
元空间
- 元空间(Metaspace):在Java 8中,永久代被元空间所取代。元空间使用的是本地内存(Native Memory),而不是虚拟机内存(Heap Memory),这样做的好处是可以避免永久代空间不足的问题。
永久代是JVM中用于存储类信息的重要内存区域,但它并不是永久存储的。类信息在满足特定条件后可以被垃圾回收,这是JVM内存管理的一部分,有助于释放不再使用的类信息,优化内存使用。随着Java 8的发布,元空间取代了永久代,提供了更为灵活的类信息存储方式。
今天介绍了很多很多概念相关的知识点,让大家有个大概的印象,后续会一个一个剖析。
专题汇总
JVM专题一:深入分析Java工作机制
JVM专题二:Java如何进行编译的
JVM专题三:Java代码如何运行
JVM专题四:JVM的类加载机制
JVM专题五:类加载器与双亲委派机制
JVM专题六:JVM的内存模型
JVM专题七:JVM垃圾回收机制
JVM专题八:JVM如何判断可回收对象
JVM专题九:JVM分代知识点梳理
JVM专题十:JVM中的垃圾回收机制
JVM专题十一:JVM 中的收集器一
JVM专题十二:JVM 中的收集器二
JVM专题十三:总结与整理(面试常用)
相关文章:
JVM专题九:JVM分代知识点梳理
今天开始,咱们开始剖析JVM内存划分的原理细节,以及我们创建的那些对象在JVM中到底是如何分配,如何流动的,首先解决第一个问题:JVM内存的一个分代模型:年轻代、老年代、永久通过之前的专题我们知道,那就是我…...
wireshark常用过滤命令
wireshark常用过滤命令 wireshark抓包介绍单机单点:单机多点:双机并行: wireshark界面认识默认布局调整布局(常用)显示FCS错误 wireshark常见列Time回包数据报对应网络模型 wireshark基本操作结束抓包再次开始抓包 **wireshark常用过滤命令**…...
「全新升级,性能更强大——ONLYOFFICE 桌面编辑器 8.1 深度评测」
文章目录 一、背景二、界面设计与用户体验三、主要新功能亮点3.1 高效协作处理3.2 共同编辑,毫无压力3.3 批注与提及3.4 追踪更改3.5 比较与合并3.6 管理版本历史 四、性能表现4.1 集成 AI 工具4.2 插件强化 五、用户反馈与使用案例 一、背景 Ascensio System SIA -…...
线程版服务器实现(pthread_server)
用到的所有方法所需要的参数可以在wrap.c文件中查询,wrap中找不到的直接通过man手册查询 1.首先介绍一下我自己写的包裹文件,里面有各种在可能要用到的方法 wrap.c: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #…...
js异常处理方案
文章目录 异常处理方案同步代码的异常处理Promise 的异常处理async await 的异常处理 感谢阅读,觉得有帮助可以点点关注点点赞,谢谢! 异常处理方案 在JS开发中,处理异常包括两步:先抛出异常,然后捕获异常。…...
C++文件路径处理2 - 路径拼接路径解析
1. 关键词2. filesystem.h3. filepath.cpp6. 测试代码7. 运行结果8. 源码地址 1. 关键词 关键词: C 文件路径处理 路径拼接 获取父目录的路径 获取文件名 获取拓展名 跨平台 应用场景: 路径的拼接路径的解析 2. filesystem.h #pragma once#include…...
数据结构5---矩阵和广义表
一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 (1)对称矩…...
jquery使用infinitescroll无线滚动+自定义翻页
jquery版本 jquery-1.8.3.js infinitescroll版本 2.0.0 如果infinitescroll版本最新的jquery版本也要用新的 接口用nodejs jquery.infinitescroll.js官网地址 前端代码《接口返回JSON数据》 <!DOCTYPE html> <html lang"en"> <head><meta cha…...
【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞
声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 锐捷统一上网行为管理与审计系统naborTable/static_convert.php…...
通义灵码上线 Visual Studio 插件市场啦!
通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。 通义灵…...
GESP 四级急救包(2):客观题真题集
客观题真题集 一、选择题1. 真题梳理2. 真题答案3. 重难点点播(1) 指针和地址(2) 时间复杂度 二、判断题1. 真题梳理2. 真题答案 一、选择题 1. 真题梳理 若函数声明为 void f(int &a, int b, const int &c),且在主函数内已经声明了 x , y , z x,y,z x,y,…...
VERYCLOUD睿鸿股份确认参展2024年ChinaJoy BTOB商务洽谈馆,期待与你相聚
作为在全球数字娱乐领域兼具知名度与影响力的年度盛会,2024年第二十一届ChinaJoy将于7月26日至7月29日在上海新国际博览中心盛大召开,本届展会主题为:初心“游”在,精彩无限!(Stay True, Game On.ÿ…...
Java面试题:讨论Spring框架的核心组件,如IoC容器、AOP、事务管理等
Spring框架是一个功能强大且灵活的Java企业级应用开发框架,其核心组件包括以下几个主要部分: 1. IoC容器(Inversion of Control Container) IoC容器是Spring框架的核心部分,用于管理应用程序的依赖注入(D…...
【方案】基于5G智慧工业园区解决方案(PPT原件)
5G智慧工业园区整体解决方案旨在通过集成5G通信技术、物联网、大数据和云计算等先进技术,实现园区的智能化、高效化和绿色化。 该方案首先构建高速、稳定的5G网络,确保园区内设备、人员与物流的实时连接和高效沟通。其次,通过工业物联网技术&…...
使用System.currentTimeMillis获取当前时间
使用System.currentTimeMillis获取当前时间 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨Java中如何使用System.currentTimeMillis()方法来获取…...
手机远程控制另一台手机的全新使用教程(安卓版)
看完这篇文章,你可以了解到安卓手机如何远程控制安卓手机,以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机,或者苹果手机远程管控另一台苹果手机,请点击查看视频《手机远程管控另一台手机的全新使用教程…...
商城积分系统的代码实现(上)-- 积分账户及收支记录
一、背景 上一系列文章,我们说了积分的数模设计及接口设计,接下里,我们将梳理一下具体的代码实现。 使用的语言的java,基本框架是spring-boot,持久化框架则是Jpa。 使用到的技术点有: 分布式锁…...
【C++进阶9】异常
一、C语言传统的处理错误的方式 终止程序,如assert 如发生内存错误,除0错误时就会终止程序返回错误码 需要程序员自己去查找对应的错误 z如系统的很多库的接口函数都是通 过把错误码放到errno中,表示错误 二、C异常概念 异常:函…...
RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper
XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…...
突破SaaS产品运营困境:多渠道运营如何集中管理?
随着数字化时代的到来,SaaS(软件即服务)产品已成为企业日常运营不可或缺的工具。然而,在竞争激烈的市场环境下,SaaS产品运营越来越重视多渠道、多平台布局,以更广泛地触及潜在用户,然而…...
智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代
一、热水器语音识别芯片开发背景 在科技的今天,人们对于生活品质的追求已不仅仅满足于基本的物质需求,更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分,其智能化转型势在必行。 在传统热水器使用中&#…...
Redis集群部署合集
目录 一. 原理简述 二. 集群配置 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一: 实验二: 实验三: 实验四: 添加节点 自动分配槽位 提升节点为master: 实验…...
【HDFS】关于Hadoop的IPC.Client类的一些整理
org.apache.hadoop.ipc.Client 类是IPC服务的一个客户端。 IPC请求把一个Writable对象当做参数,返回一个Writable对象当做结果value。 一个IPC服务运行在某个端口上,并且由参数class和value class定义。 Router里的IPC.Client对象就两个 有这样一个类:ClientCache 看名字就…...
Swoole v6 能否让 PHP 再次伟大?
现状 传统的 PHP-FPM 也是多进程模型的的运行方式,但每个进程只能处理完当前请求,才能接收下一个请求。而且对于 PHP 脚本来说,只是接收请求和响应请求,并不参与网络通信。对数据库资源的操作,也是一次请求一次有效&am…...
C++ STL Iterator Adapter
1. std::back_insert_iterator 使用 // back_insert_iterator example #include <iostream> // std::cout #include <iterator> // std::back_insert_iterator #include <vector> // std::vector #include <algorithm> // std::copy…...
android-aidl5
aidl类是实现Manager和Service通信的桥梁。 例如在修改Android Wifi功能的时候看到WifiManager管理WifiService; AIDL是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。 比如onclick(),用oneway修…...
day01-项目介绍及初始化-登录页
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 day01-项目介绍及初始化-登录页一、人力资源项目介绍1.1项目架构和解决方案主要模块解决的问题 二、拉取项目基础代码1.引入库2.升级core-js版本到3.25.5按照完整依…...
华为开发者大会:全场景智能操作系统HarmonyOS NEXT
文章目录 一、全场景智能操作系统 - HarmonyOS NEXT1.1 系统特性1.2 关于架构、体验和生态 二、应用案例2.1 蚂蚁mpaas平台的性能表现 三、新版本应用框架发布3.1 新语言发布3.2 新数据库发布3.3 新版本编译器的发布 四、CodeArts和DataArts4.1 CodeArts4.2 DataArts 五、总结 …...
深度学习二分类评估详细解析与代码实战
深度学习二分类的实战代码:使用 Trainer API 微调模型. https://huggingface.co/learn/nlp-course/zh-CN/chapter3/3 如果你刚接触 自然语言处理,huggingface 是你绕不过去的坎。但是目前它已经被墙了,相信读者的实力,自行解决吧。…...
c++笔记容器详细介绍
C标准库提供了多种容器来存储和管理数据。这些容器属于<vector>, <list>, <deque>, <map>, <set>, <unordered_map>, <unordered_set>等头文件中。这些容器各有优缺点,适用于不同的场景。下面详细介绍几种主要的容器及其…...
网站建设七点/百度快照是干什么的
Clipboard API Clipboard API的接口提供了一种读写操作系统剪贴板的方式,它有四个方法,分别是: read,从剪贴板读取数据,比如图片readText,从剪贴板读取文本write,写入数据(比如图片…...
免费jsp源码分享网站/定制化网站建设
一、引言 JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等。本文主要讲解gson的使用。 …...
做房产抵押网站需要什么手续费/免费发布软文广告推广平台
随着Android系统的日益发展和日渐成熟,各种平台的合作就日渐频繁。现在主要互联网公司,都退出了各种各样的插件功能。如第三方支付,第三方联合登陆和微博分享等等功能。 近期由于业务的需要,公司提出将项目的功能打成jar包&#…...
网站建设工具的实验心得/电商关键词seo排名
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 在对数组进复制时,我们可以编写一个for循环实现,但是比较麻烦,我们可以使用System类的静态方法arraycopy()。 arraycopy()方…...
推广网站怎样做/app开发多少钱
图像梯度与轮廓Sobel算子Scharr算子laplacian算子Canny边缘检测图像金字塔图像轮廓傅里叶变换滤波Sobel算子 如果出现负数则默认为0 img cv2.imread(data/pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.waitKey() cv2.destroyAllWindows()dst cv2.Sob…...
网站建设合同印花税/青岛seo经理
在我们开发中,往往需要加入一些jar包,但是有时候会莫名其妙的报一些找不到类的异常,如: 这个是我在做消息推送的时候遇到的,其实我们在发开地图应用的时候也会遇到过,这是为什么呢,其实就是因为…...