从一个OutOfMemoryError 学会了分析Java内存泄漏问题
以前都是好好的,最近出现了 oom。
问题
开始是: java.lang.OutOfMemoryError: Java heap space
-- ::41.678 ERROR --- [nio--exec-] c.e.p.s.c.c.core.ELDictionaryController : 系统异常 org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:) ~[spring-webmvc-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:) [spring-webmvc-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:) [spring-webmvc-5.1..RELEASE.jar!/:5.1..RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:) [spring-webmvc-5.1..RELEASE.jar!/:5.1..RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:) [tomcat-embed-websocket-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:) [spring-web-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:) [spring-web-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.filters.RemoteIpFilter.doFilter(RemoteIpFilter.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.filters.RemoteIpFilter.doFilter(RemoteIpFilter.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:) [druid-1.1..jar!/:1.1.]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at com.lkk.platform.system.controller.filter.CORSFilter.doFilter(CORSFilter.java:) [erdp_system_controller-2.0.-GA.jar!/:2.0.-GA]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:) [spring-web-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:) [spring-web-5.1..RELEASE.jar!/:5.1..RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:) [na:1.8.0_212]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:) [na:1.8.0_212]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:) [tomcat-embed-core-9.0..jar!/:9.0.]
at java.lang.Thread.run(Thread.java:) [na:1.8.0_212]
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.jar.Manifest.read(Manifest.java:) ~[na:1.8.0_212]
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:) ~[na:1.8.0_212]
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:) ~[na:1.8.0_212]
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:) ~[na:1.8.0_212]
at java.util.jar.JarVerifier.update(JarVerifier.java:) ~[na:1.8.0_212]
at java.util.jar.JarInputStream.read(JarInputStream.java:) ~[na:1.8.0_212]
at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:) ~[na:1.8.0_212]
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:) ~[na:1.8.0_212]
at java.util.jar.JarInputStream.getNextEntry(JarInputStream.java:) ~[na:1.8.0_212]
at java.util.jar.JarInputStream.getNextJarEntry(JarInputStream.java:) ~[na:1.8.0_212]
at org.apache.catalina.webresources.JarWarResourceSet.getArchiveEntries(JarWarResourceSet.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.webresources.Cache.getResource(Cache.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.findClassIgnoringNotFound(TomcatEmbeddedWebappClassLoader.java:) ~[spring-boot-2.1..RELEASE.jar!/:2.1..RELEASE]
at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.doLoadClass(TomcatEmbeddedWebappClassLoader.java:) ~[spring-boot-2.1..RELEASE.jar!/:2.1..RELEASE]
at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:) ~[spring-boot-2.1..RELEASE.jar!/:2.1..RELEASE]
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:) ~[tomcat-embed-core-9.0..jar!/:9.0.]
at ch.qos.logback.classic.spi.PackagingDataCalculator.loadClass(PackagingDataCalculator.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.spi.PackagingDataCalculator.bestEffortLoadClass(PackagingDataCalculator.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.spi.PackagingDataCalculator.computeBySTEP(PackagingDataCalculator.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.spi.PackagingDataCalculator.populateFrames(PackagingDataCalculator.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.spi.PackagingDataCalculator.calculate(PackagingDataCalculator.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.spi.ThrowableProxy.calculatePackagingData(ThrowableProxy.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:) ~[logback-classic-1.2..jar!/:na]
at ch.qos.logback.classic.Logger.error(Logger.java:) ~[logback-classic-1.2..jar!/:na]
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 exceeded -- ::42.648 WARN --- [erverWorker--] o.a.d.r.exchange.codec.ExchangeCodec : [DUBBO] Fail to encode response: Response [id=, version=2.0., status=, 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., current host: 192.168.11.183 java.lang.OutOfMemoryError: GC overhead limit exceeded -- ::43.907 ERROR --- [-thread-] 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., current host: 192.168.11.183
这就奇怪了! 注意到 出现次数比较多是 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(, , 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 "";
}
而
@Autowired
RedissonManager redissonManager;
分析
由此怀疑这个地方有些问题。 虽然出现了oom, 但是进程没有死, 似乎依然可以响应某些请求,于是把线程dump 下来, 观察一番,发现 redisson-netty 竟然有上千个

就是这个
"redisson-netty-25-32" # prio= os_prio= tid=0x00007f7ec0187800 nid=0x3625 runnable [0x00007f7e77d6c000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:)
- 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:)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:)
at io.netty.util.concurrent.SingleThreadEventExecutor$.run(SingleThreadEventExecutor.java:)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:)
at java.lang.Thread.run(Thread.java:)
太不正常了! 但是 这里的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 的用法好像不太对哦!!! 改一下吧:
@Autowired
RedissonClient redissonClient;
==>
@Autowired
RedissonManager 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 { @Autowired
RedisTemplate<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; @Bean
public 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[]))
.setMasterName(redisSentinelMaster)
.setReadMode(ReadMode.SLAVE)
.setTimeout(Integer.valueOf(redisTimeout));
if(StringUtils.isNotEmpty(redisPassword)){
serverConfig.setPassword(redisPassword);
}
}
return Redisson.create(config);
}
}
改了就好了!!突然自己明白了, 原来就是这个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。 但是又不是绝对的。 因为其他 地方也可以创建大内存对象)
其实只要再多问几个问题就知道了答案: 这个对象为什么出现了这么多次, 占用这么多内存呢?? 这个是正常的吗? 如果能够很早认识到这些问题,并回答之, 那么问题就不是大问题了,就不会浪费很多时间了!
从一个OutOfMemoryError 学会了分析Java内存泄漏问题的更多相关文章
- 如何分析java内存泄漏问题
java中的内存泄漏首先需要dump文件出来,主要包括内存dump.线程dump: 内存dump是指通过jmap -dump <pid>输出的文件,而线程dump是指通过jstack &l ...
- Java内存泄漏分析与解决方案
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
- java内存泄漏的定位与分析
1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...
- (转)java内存泄漏的定位与分析
转自:http://blog.csdn.net/x_i_y_u_e/article/details/51137492 1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测, ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
- Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析
原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...
- Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析
原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...
- Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息
原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...
- Java内存泄漏分析和预防
1. 什么是内存泄漏?有什么危害 书面说法: 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个 ...
随机推荐
- 使用 cAdvisor 主机上的容器
目录 前言 安装测试 安装 docker 安装docker-ce 启动 cAdvisor 容器 访问测试 prometheus 服务端配置 使用 promtool 检查配置文件 重新加载配置文件 前言 ...
- Prometheus PromQL 基础
目录 时序 4 种类型 Counter Gauge Histogram Summary Histogram vs Summary 操作符 时序 4 种类型 Prometheus 时序数据分为 Coun ...
- php 开山篇
由韩顺平老师讲解的 php课程体系 初级课程只能是静态页面开发,不能动态的使用,只是一个界面 学完之后脑海中 应该有的体系~
- 关于python中的列表遍历注意事项
在开发过程中,很容易出现以下的错误: 可以看出:假如删除列表的元素之后直接执行continue,那么遍历的时候就会落下一个元素. 那么怎么解决这个问题呢? 首先 : 我们尝试把continue去掉: ...
- 线程锁&信号量&gil
线程锁 线程锁的主要目的是防止多个线程之间出现同时抢同一个数据,这会造成数据的流失.线程锁的作用类似于进程锁,都是为了数据的安全性 下面,我将用代码来体现进程锁的作用: from threading ...
- c语言I博客专业06
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/8655 我在 ...
- 关于javascript中=的返回值
今天看了一段代码,大概是这样的: function test(){ a=4; b=5; return b=a; } test();//返回? 返回值是多少呢?运行结果是4 这可以理解为将a的值赋给b以 ...
- 洛谷 P2388 阶乘之乘 题解
本蒟蒻又来发题解了QwQ; 看到这个题目,本蒟蒻第一眼就想写打个暴力: 嗯,坏习惯: 但是,动动脑子想一想就知道,普通的的暴力是过不了的: 但是,身为蒟蒻的我,也想不出什么高级的数学方法来优化: 好, ...
- 17.Django学习之django自带的contentType表
通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/aaronthon/article/details/81714496 ...
- JavaScript基础5
字符串操作方法和属性 length 获取字符串的长度 str.chartAt(指定字符的索引) 获取指定位置的字符 返回string类型的值 str.concat(字符串) 链接多个字符串 ...