從一個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.pswp.cn/news/448686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448686.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu安裝php7.2

1、使用ppa增加源apt-get install python-software-propertiesapt-get install software-properties-commonadd-apt-repository ppa:ondrej/php2、更新apt-get update3、查看源中PHP7.2版本apt list | grep php 列表中已經包含你想要的PHP版本了4、安裝PHP7.2apt-get -y …

會出現 unreachable statement 的可能

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 java編譯器把unreachable statement標記為運行時錯誤&#xff0c;一個unreachable statement就是編譯器決定永遠不會執行它。 下面的幾…

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

JVM原理探究及調優方法論

1 此文目的 本文不準備從盤古開天地開始講述JVM的種種&#xff0c;相關的文章網上太多了&#xff0c;大多也無非轉來轉去&#xff0c;連圖都差不多。筆者只整理個提綱挈領的學習路線指南&#xff0c;并對自己學習過程中遇到的坑和容易混淆和忽視的地方作個總結。 2 JVM內存模型…

超方便、最簡單版本: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…

Q-Dir

Q-dir&#xff0c;可以分界面&#xff0c;分文件夾&#xff0c;快捷選擇等優勢&#xff0c;非常好用的工具&#xff0c;可以替代微軟的File Explorer。 官網&#xff1a;https://www.softwareok.com/?seiteFreeware/Q-Dir轉載于:https://www.cnblogs.com/JTCLASSROOM/p/109719…

一行代碼 實現集合去重

前些天發現了一個巨牛的人工智能學習網站&#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…

PHP商城數據庫安全事務處理方法

現在是一個電商時代&#xff0c;做電商的首先得有一個商城&#xff0c;所以商城的安全也是不容忽視的&#xff0c;一個數據安全的商城離不開數據庫的事務處理&#xff0c;商城在資金、商品、下單、結賬等重要步驟加上事務控制這是不一定不可少的&#xff0c;像市場上的一些開源…

職業規劃之ABZ,未雨綢繆35歲危機

35歲的中年人正面臨著上有老下有小&#xff0c;房貸車貸等生活壓力&#xff0c;然而在職場上又面臨被裁員或在招聘中年齡超限的尷尬局面。那么&#xff0c;我們如何應對此危機呢&#xff1f;ABZ理論為我們打開了一扇天窗。 ABZ理論由著名的創業者投資人&#xff0c;LinkedIn和P…

集合去重 (集合元素為引用類型)--- 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;但提交到碼云時填寫的提交日志是亂碼。 提交到碼云后是這樣的&#…

Box 類

public class Box extends JComponent implements Accessible使用 BoxLayout 對象作為其布局管理器的一個輕量級容器。Box 提供幾個對使用 BoxLayout 的容器&#xff08;甚至非 Box 容器&#xff09;有用的類方法。 Box 類可以創建幾種影響布局的不可見組件&#xff1a;glue、s…

神奇的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…