从一个OutOfMemoryError 学会了分析Java内存泄漏问题

从一个OutOfMemoryError 学会了分析Java内存泄漏问题
以前都是好好的,最近出现了 oom。

问题


开始是: java.lang.OutOfMemoryError: Java heap space
2019-06-14 11:02:41.678 ERROR 13789 --- [nio-8082-exec-3] c.e.p.s.c.c.core.ELDictionaryController  : 系统异常org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap spaceat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1053) ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) [spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) [spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) [spring-webmvc-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) [spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.filters.RemoteIpFilter.doFilter(RemoteIpFilter.java:845) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.filters.RemoteIpFilter.doFilter(RemoteIpFilter.java:902) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.1.5.jar!/:1.1.5]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at com.lkk.platform.system.controller.filter.CORSFilter.doFilter(CORSFilter.java:55) [erdp_system_controller-2.0.0-GA.jar!/:2.0.0-GA]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.1.5.RELEASE.jar!/:5.1.5.RELEASE]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:679) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_212]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_212]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.16.jar!/:9.0.16]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.lang.OutOfMemoryError: Java heap spaceat java.util.jar.Manifest.read(Manifest.java:270) ~[na:1.8.0_212]at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:276) ~[na:1.8.0_212]at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:263) ~[na:1.8.0_212]at java.util.jar.JarVerifier.processEntry(JarVerifier.java:318) ~[na:1.8.0_212]at java.util.jar.JarVerifier.update(JarVerifier.java:230) ~[na:1.8.0_212]at java.util.jar.JarInputStream.read(JarInputStream.java:212) ~[na:1.8.0_212]at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:140) ~[na:1.8.0_212]at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:118) ~[na:1.8.0_212]at java.util.jar.JarInputStream.getNextEntry(JarInputStream.java:142) ~[na:1.8.0_212]at java.util.jar.JarInputStream.getNextJarEntry(JarInputStream.java:179) ~[na:1.8.0_212]at org.apache.catalina.webresources.JarWarResourceSet.getArchiveEntries(JarWarResourceSet.java:117) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:253) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:281) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.webresources.Cache.getResource(Cache.java:62) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:216) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:225) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2299) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:863) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.findClassIgnoringNotFound(TomcatEmbeddedWebappClassLoader.java:121) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.doLoadClass(TomcatEmbeddedWebappClassLoader.java:86) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:68) ~[spring-boot-2.1.3.RELEASE.jar!/:2.1.3.RELEASE]at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1186) ~[tomcat-embed-core-9.0.16.jar!/:9.0.16]at ch.qos.logback.classic.spi.PackagingDataCalculator.loadClass(PackagingDataCalculator.java:204) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.spi.PackagingDataCalculator.bestEffortLoadClass(PackagingDataCalculator.java:228) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.spi.PackagingDataCalculator.computeBySTEP(PackagingDataCalculator.java:135) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.spi.PackagingDataCalculator.populateFrames(PackagingDataCalculator.java:100) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.spi.PackagingDataCalculator.calculate(PackagingDataCalculator.java:58) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.spi.ThrowableProxy.calculatePackagingData(ThrowableProxy.java:142) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:122) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:419) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383) ~[logback-classic-1.2.3.jar!/:na]at ch.qos.logback.classic.Logger.error(Logger.java:538) ~[logback-classic-1.2.3.jar!/:na]
View Code
512M 不够吗? 很有可能啊...
增加内存到1G 后仍然出现问题:Failed to mark a promise as failure because it has failed already: [DefaultChannelPromise@33a99639(failure: io.netty.handler.codec.EncoderException: java.lang.OutOfMemoryError: GC overhead limit exceeded), io.netty.handler.codec.EncoderException: java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded2019-06-17 09:00:42.648  WARN 1993 --- [erverWorker-8-3] o.a.d.r.exchange.codec.ExchangeCodec     :  [DUBBO] Fail to encode response: Response [id=319633, version=2.0.2, status=20, event=false, error=null, result=RpcResult [result=null, exception=org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded]], send bad_response info instead, cause: GC overhead limit exceeded, dubbo version: 2.7.1, current host: 192.168.11.183java.lang.OutOfMemoryError: GC overhead limit exceeded2019-06-17 09:00:43.907 ERROR 1993 --- [20884-thread-52] o.a.dubbo.rpc.filter.ExceptionFilter     :  [DUBBO] Got unchecked and undeclared exception which called by 192.168.11.183. service: com.elead.platform.system.domain.service.ELCommonCodeRegulationService, method: GetCode, exception: java.lang.OutOfMemoryError: GC overhead limit exceeded, dubbo version: 2.7.1, current host: 192.168.11.183
View Code

 

这就奇怪了! 注意到 出现次数比较多是 com.lkk.platform.system.domain.service.ELCommonCodeRegulationService, method: GetCode,

    @Transactional(readOnly = false)public String GetCode(String name){RLock rlock = redissonManager.getRedisson().getLock(name);boolean getLock = false;try{getLock = rlock.tryLock(3, 20, TimeUnit.SECONDS);if (getLock){ELCodeDef elCodeDef = findCommonCode(name);super.updateById(elCodeDef);return elCodeDef.getCode();}}catch (Exception ex){ex.printStackTrace();}finally {if (getLock) {rlock.unlock();}}return "";}

而@AutowiredRedissonManager redissonManager;
 

 

分析

由此怀疑这个地方有些问题。 虽然出现了oom, 但是进程没有死, 似乎依然可以响应某些请求,于是把线程dump 下来, 观察一番,发现 redisson-netty 竟然有上千个

就是这个

"redisson-netty-25-32" #808 prio=5 os_prio=0 tid=0x00007f7ec0187800 nid=0x3625 runnable [0x00007f7e77d6c000]java.lang.Thread.State: RUNNABLEat sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)- locked <0x00000000e90b27a0> (a io.netty.channel.nio.SelectedSelectionKeySet)- locked <0x00000000e90b27f8> (a java.util.Collections$UnmodifiableSet)- locked <0x00000000e90b2708> (a sun.nio.ch.EPollSelectorImpl)at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:62)at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:786)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:434)at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.lang.Thread.run(Thread.java:748)

太不正常了!  但是 这里的redisson-netty- 仍然是 RUNNABLE 状态, 看起来也不是问题啊!  仔细检查了下, 也没发现死锁啊!!

那就不是线程问题吗?

 

redisson 的bug 吗? redisson 的官网 的issue 搜索一番,无果。 郁闷了! 而且我的 redisson 版本是 3.1.1, 已经很新的了吧!!

 

堆栈分析吧!!把java 的heap 拔下来,

 

jps -l,  然后 jmap -dump:format=b,file=dumpFileName pid 

 

看到有些异常:

肯定不是 spring 的classloader 吧。

 

 

 

 

看到 netty 的PoolThreadCache 比较可疑啊, 还有 mybatis。

 

 

 

 

Biggest Top-Level Dominator Packages 跟之前一样的提示, 一个是netty的 PollThreadCache, 一个是netty 的epoll, 还有是redision, 还有是sun 的EPollArrayWrapper, 还有mybatis,其他 也看不出什么来啊!

 

分析只能到此为止了吗? io.netty.buffer.PoolThreadCache 是什么东东? 我不熟悉啊!  看过netty 源码, 已经全忘了!

是内存泄漏吗?  好像也看不出来。 不太确定。 网上搜索看看吧!!

 

还是从redision 入手吧。  咦, redision 的用法好像不太对哦!!! 改一下吧:

    @AutowiredRedissonClient redissonClient;
==>@AutowiredRedissonManager redissonManager;RLock rlock = redissonClient.getLock(name); ==>         RLock lock = redissonManager.getRedisson().getLock(name);

RedissonManager如下:

import org.apache.commons.lang3.StringUtils;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.ReadMode;
import org.redisson.config.SentinelServersConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;@Component
public class RedissonManager {@AutowiredRedisTemplate<String, Object> redisTemplate;@Value("${spring.redis.password}")private String redisPassword;@Value("${spring.redis.port}")private String redisPort;@Value("${spring.redis.host}")private String redisHost;@Value("${spring.redis.timeout}")private String redisTimeout;@Value("${spring.redis.sentinel.node}")private String redisSentinelNode;@Value("${spring.redis.sentinel.master}")private String redisSentinelMaster;@Beanpublic RedissonClient getRedisson() {Config config = new Config();if (StringUtils.isNotEmpty(redisPort)) {config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort).setPassword(redisPassword);} else if (StringUtils.isNotEmpty(redisSentinelNode)) {String[] nodes = redisSentinelNode.split(",");List<String> newNodes = new ArrayList(nodes.length);Arrays.stream(nodes).forEach((index) -> newNodes.add(index.startsWith("redis://") ? index : "redis://" + index));SentinelServersConfig serverConfig = config.useSentinelServers().addSentinelAddress(newNodes.toArray(new String[0])).setMasterName(redisSentinelMaster).setReadMode(ReadMode.SLAVE).setTimeout(Integer.valueOf(redisTimeout));if(StringUtils.isNotEmpty(redisPassword)){serverConfig.setPassword(redisPassword);}}return Redisson.create(config);}
}
View Code

 

改了就好了!!突然自己明白了, 原来就是这个redision 用法错误导致的!!

 

不信? 重新拔下来heap dump 分析一下:

最大的 com.mysql.cj.jdbc.AbandonedConnectionCleanupThread 才占用2m, 不是什么问题。 可见已经没有了什么

PoolThreadCache 已经下滑到了第七位, 总占用7M ,38个对象,看起来正常了许多!! :

 

 

 

总结

花了2天时间终于搞定!!

其实上面的 thread dump 和 heap dump 已经给出了比较明显的答案了!! 就是 PoolThreadCache 占用了 过多的内存, 其原因就是 PoolThreadCache 错误的创建了 太多!————  本来应该是单例的 对象, 被搞成了 prototype, 你说是不是引起了大错!!! 一个 PoolThreadCache占用内存差不多196,000byte, 921个就 是 180516000 byte 也就是 差不多 下图的180M, 一类对象就 180M, 总共才1G, 当然会不够用!!

其实 从错误日志也可以 分析出来一些, 在创建需要比较大的内存的对象的时候, 就会出现 oom, 因为内存确实已经不够了啊!! (这也是为什么 ELCommonCodeRegulationService 的 GetCode 方法调用的时候,出现了很多oom。 但是又不是绝对的。 因为其他 地方也可以创建大内存对象)

其实只要再多问几个问题就知道了答案:  这个对象为什么出现了这么多次, 占用这么多内存呢??  这个是正常的吗? 如果能够很早认识到这些问题,并回答之, 那么问题就不是大问题了,就不会浪费很多时间了!

 

posted on 2019-06-19 15:19 CanntBelieve 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/FlyAway2013/p/11051514.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop+GPU强强联手的性能探索

摘要&#xff1a;Hadoop并行处理可以成倍地提高性能&#xff0c;GPU也日益成为计算任务的重要分担者&#xff0c;Altoros Systems研发团队一直致力于探索HadoopGPU的可能性&#xff0c;以及在实际的大规模系统中的实现&#xff0c;这篇文章就是他们的部分研究成果。 Hadoop并行…

Vue Google浏览器插件 Vue Devtools无法使用的解决办法

1.插件安装不必多说 一定要用Vue.js 开发版 Vue.min.js 在控制面板就不会显示 2.本地调试 用的是file://协议 修改插件允许访问文件网址 打上对勾 转载于:https://www.cnblogs.com/116970u/p/11052987.html

超方便、最简单版本:java 邮件发送 (半分钟写完代码)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. jar 和 邮箱设置 <!--邮件--><dependency><groupId>org.simplejavamail</groupId><artifactId>simpl…

OpenCL(CUDA5.0) + Visual Studio 2010 环境配置

1.安装步骤 1&#xff09;安装CUDA5.0本文默认的安装目录为&#xff1a;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA \v5.0 CUDA SDK的默认安装目录为&#xff1a;C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0 其他路径请自行修改路径&#xff01;2&#xff…

一行代码 实现集合去重

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 代码写法&#xff1a;&#xff08;这是针对元素为基本数据类型的集合&#xff09; 针对引用类型元素去重&#xff0c;可根据元素内多…

《Mali OpenCL SDK v1.1.0》教程样例之一“Hello World”

1、算法简述 实现矩阵相加&#xff1a;Cn An Bn。这个例子虽然很简单&#xff0c;但是由于矩阵元素之间相互独立&#xff0c;每个元素可以非常容易地进行并行计算&#xff0c;可以非常理想地在OpenCL中实现。 2. C/C实现 [cpp] view plaincopyprint?/* * This confidential…

集合去重 (集合元素为引用类型)--- java 8 新特性 --- 根据元素单属性、多属性实现去重

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 代码写法&#xff1a; &#xff08;要求 JDK 1.8 或 1.8 以上&#xff09; package gentle.entity;import lombok.Data; /**** auth…

Django--Forms组件使用

Forms组件的使用 在html表单验证中&#xff0c;需要通过各种信息的验证&#xff0c;比如注册界面的姓名、密码、邮箱、电话等的验证&#xff0c;是否符合定义好的规则&#xff0c;不可能每次都要取出对应的字段一一判断&#xff0c;django内置了Forms组件&#xff0c;可以方便的…

yii2关联表

asArray()这个方法很好用&#xff0c;返回数组是1版本想要的形式&#xff0c;这种方式有种tp框架的感觉转载于:https://www.cnblogs.com/peipeiyu/p/10974487.html

详细程序注解学OpenCL一 环境配置和入门程序

本专栏是通过注解程序的方法学习OpenCL&#xff0c;我觉得一个一个地去抠原理也不是办法&#xff0c;干脆直接学习程序&#xff0c;然后把相关原理都直接注解到程序语句当中。 原创地址&#xff1a;http://blog.csdn.net/kenden23/article/details/14101657 一开始要配置好环境…

解决 IDEA 在 commit 代码时 git 日志乱码 (提交时填写的中文说明乱码)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.问题描述&#xff1a; idea 开发代码中的 中文正常&#xff0c;但提交到码云时填写的提交日志是乱码。 提交到码云后是这样的&#…

神奇的pdfkit工具——将字符串保存为pdf文件

神奇的pdfkit工具——将字符串保存为pdf文件 1、安装工具包 pip install pdfkit 2、上干货 import pdfkitdef create_pdf(str_data, to_file):将字符串生成pdf文件 # &#xff08;需下载wkhtmltox&#xff09;将程序路径传入config对象config pdfkit.configuration(wkhtmltopd…

OpenCL结构

原标题&#xff1a;从零开始学习OpenCL开发&#xff08;一&#xff09;架构 1 异构计算、GPGPU与OpenCL OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算&#xff08;heterogeneous&#xff09;的标准&#xff0c;它是跨平台的。旨在充分利用GP…

docker-compose 使用小例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 只是一个很简单的小例。 1. 原本有的容器 2. docker-compose.yml 写法&#xff1a; gentle 处可以任意写&#xff0c;gentle 是我的项…

AMD GPU+VS2010的OpenCL配置

安装开发环境可以参照DE4-530的OpenCL开发环境搭建&#xff08;最终版&#xff09;&#xff0c;这篇文章的大部分内容转载自&#xff1a;http://www.verydemo.com/demo_c92_i226325.html AMD的Heterogeneous Computing有很多AMD的OpenCL资料&#xff0c;包括各种分析工具&#…

ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

在前面两篇随笔《ABP开发框架前后端开发系列---&#xff08;7&#xff09;系统审计日志和登录日志的管理》和《ABP开发框架前后端开发系列---&#xff08;8&#xff09;ABP框架之Winform界面的开发过程》开始介绍了权限管理的内容&#xff0c;其中只是列出了内部的权限系统的审…

GIL , 线程池 , 同步 , 异步 , 队列 , 事件

一.什么是GIL 官方解释:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (Howev…

在Windows下使用OpenCL配置

前言 目前&#xff0c;NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL&#xff08;NVIDIA 的正式版 driver 是从自195.62 版开始&#xff0c;而 AMD则是从9.11 版开始&#xff09;。NVIDIA 的正式版 driver 中包含 OpenCL.dll&#xff0c;因此可以直接使用。AMD 到目前为止…

CVE-2019-0708 BlueKeep的扫描和打补丁

2019独角兽企业重金招聘Python工程师标准>>> 简介 CVE-2019-0708 BlueKeep是一个Windows远程桌面服务的远程代码执行漏洞&#xff0c;其危害程度不亚于CVE-2017-0143 EternalBlue&#xff0c;该漏洞影响了某些旧版本的Windows系统。此漏洞是预身份验证&#xff0c;无…

《OpenCL异构计算》新版中译本派送中!

《OpenCL异构计算1.2》新鲜出炉&#xff0c;目前市面上仍一书难求&#xff01;我们已向清华出版社订购到第一批新书。关注异构开发社区&#xff0c;积极参与&#xff0c;就有可能免费获取新书&#xff01; 1.如果您异构社区的老朋友&#xff0c;请关注&#xff1a;10.1假期后我…