面向服务架构~本地轮训服务占用内存过高的问题

对于WEB程序来说,它寄宿在IIS提供的w3wp进程中,这个进程占用的内存大小和你的应用程序的使用有个直接关系,你的程序写的标准,它占用内存就相对低,你的程序写的伪范规,该释放的东西不让系统释放(有些对象GC回收不了),就会造成内存使用过高的情况,对于32位系统来说,最高1.6G,超过后,进程自动挂掉!

对于本地服务来说,一般我们采用windowService,windowform来承载,它会自己有一个进程,而最近,我的windowService占用内存过高的问题真的出现了,不到5分钟,进程已经达到500多兆了,而且还在处理递增长的趋势,当我们review代码后,发现了一个大问题,看下面代码您是否也发现了呢,代码里的坏味道

   public class User_SendMessageJob : JobBase, IJob
    {
        private static object lockObj = new object();
        private object IBigRepository = new object();
        public void Execute(IJobExecutionContext context)
        {
            lock (lockObj)
            {
                #region 需要处理的任务
                //Logger.Info(context.JobDetail.Key.Name + DateTime.Now);
                #endregion
            }
        }
    }

上面的代码,声明了两个全局变量lockObj和IBigRepository,其中这个IBigRepository在方法Execute被调用,并用是轮训调用,为了避免并发冲突,采用了lock进行排它锁的设计,当这个全局对象本应该在程序运行结束后,就被释放,但是,我们去想,如果线程1正在执行lock里的代码,而线程2这种由于轮训服务,也开始进入方法,这时IBigRepository对象没有被释放,线程2又产生了一个新的对象,这时,我们的IBigRepository对象就越来越多,导致你的内存消耗越来越大!

正确的作法应该是,将IBigRepository对象声明在Execute方法里,作为局部变量,当lock结束后,就会被系统自动加收,下一个线程2进来后,才会建立新的IBigRepository对象,这样,我们就保存了,在轮训服务中,始终只有一个IBigRepository对象被建立,这种设计才是正确的.

看一下修改后的代码

 public class User_SendMessageJob : JobBase, IJob
   {
        private static object lockObj = new object();
        public void Execute(IJobExecutionContext context)
        {
            lock (lockObj)
            {
                object IBigRepository = new object();

                #region 需要处理的任务
                //Logger.Info(context.JobDetail.Key.Name + DateTime.Now);
                #endregion
            }
        }
   }

在修改了程序之后,再看一下内存,只有200M,而且没有递增的趋势,这才是正确的程序,所以说,有些基础知识很重要,我们不应该去忽视它,就像老赵说过一句话:学好操作系统才能写出好的windows程序,学习IIS运行机制,才能写出好的WEB程序!

面向服务架构~本地轮训服务占用内存过高的问题

时间: 2024-11-09 14:16:14

面向服务架构~本地轮训服务占用内存过高的问题的相关文章

升级微服务架构2:服务注册

微服务架构中,服务是最小的可伸缩的独立部署的单位,同一个服务提供可以有多个实例,这些实例都会注册到服务注册中心(Eureka Server)上进行统一的管理及调用的负载均衡. 因Spring Cloud的是已Java为主要开发语言,本文会先讲Java语言的服务怎么注册到服务中心,然后按照这个逻辑移植到.net版本上. 1.创建java版服务,并注册到服务中心 1.1创建一个Eureka Client的Maven项目 操作模式和上一篇使用Maven创建Eureka Server一样,模块名:use

用windbg+sos找出程序中谁占用内存过高,谁占用CPU过高(转载)

原文地址: http://www.cnblogs.com/Lawson/archive/2011/01/23/1942692.html 很早看到windbg+sos方面的知识,一直没仔细学习,也许因为自己做的系统还不够复杂,也没线上真实环境查看的权限,一直没学习这方面的知识,最近几天仔细找了这方面的资料,自己也写了个可能造成高CPU高内存的测试web页面,发现确实不错,即使一个生手,也可以用工具连蒙带骗的猜出哪里出了问题,当然对一些命令和内部标示更熟悉了后,可以更好的找出问题所在,非常值得学习.

微服务架构下的服务发现

编者的话]这是关于使用微服务架构创建应用系列的第四篇文章.第一篇介绍了微服务架构的模式,讨论了使用微服务架构的优缺点.第二和第三篇描述了微服务架构内部的通讯机制.这篇文章中,我们将会探讨服务发现相关问题. 为什么要使用服务发现? 我们设想一下当正在写代码时,使用了提供REST API或者Thrift API的服务,为了完成一次服务请求,代码需要知道服务实例的网络位置(IP地址和端口).传统应用都运行在物理硬件上,服务实例的网络位置都是相对固定的.例如,代码可以从一个经常变更的配置文件中读取网络位

微服务架构 - 解决Docker-Compose服务编排启动顺序问题

基于Docker Compose进行服务编排时,一定碰到服务启动顺序的问题,例如:B服务启动之前,A服务要已经启动并且可以正常对外服务. 这个启动顺序的问题,Docker Compose本身它是无法解决的,即使定义了depends_on或者links,它只能保证该服务依赖这些服务,启动本服务时会将依赖的服务也启动,但是启动顺序无法得到保证. 目前本人实验比较好的方案有两种: 基于wait-for-it.sh实现,前提条件是本镜像要支持bash 对于自己构建的镜像时,让工程本身带一个监听类,用于监

Spring Cloud云服务架构 - commonservice-config配置服务搭建

1. 介绍 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用.随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切.服务器存储后端的默

(九)整合spring cloud云服务架构 - commonservice-config配置服务搭建

1. 介绍 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spring应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用.随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切.服务器存储后端的默

spring cloud微服务架构 服务提供者和服务消费者

服务提供者和服务消费者 下面这张表格,简单描述了服务提供者/消费者是什么: | 名词 | 概念 | | ----- | ----------------------- | | 服务提供者 | 服务的被调用方(即:为其他服务提供服务的服务) | | 服务消费者 | 服务的调用方(即:依赖其他服务的服务) | 服务提供者代码示例 这是一个稍微有点复杂的程序.我们使用spring-data-jpa操作h2数据库,同时将该服务注册到注册中心Eureka中. 1.创建一个Maven工程,并在pom.xml

win7的svchost.exe占用内存过高如何解决

有的时候我们会发现win7系统的svchost.exe占用大量的内存和CPU,导致电脑卡顿,就算是重新做系统也无法避免. 工具/原料 windows7 方法/步骤 1 在我的电脑上点击鼠标右键,选择[管理] 2 选择右侧[服务和应用程序]下的[服务]选项 3 找到名称我Superfetch的服务,双击鼠标左键. 4 选择启动类型为[手动]方式. 5 点击[确定]按钮,完成设置 6 重新启动电脑后,进入任务管理器查看svchost.exe进程的情况,此时可以看到占用的内存和CPU资源已经大幅度降低

Win Tomcat8 占用内存过高

1.解压版 找到tomcat/bin/catalina.bat 文件,修改对应参数 2.安装版 windows服务执行的是bin/tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置. 修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Tomcat Service Manager/Tomcat5/Parameters/JavaOptions原值为-Dcatalina.home="C:/ApacheGr