当前位置: 首页 > news >正文

广州家电维修网站建设网站永久免费建站

广州家电维修网站建设,网站永久免费建站,wordpress 备案链接,威海网站建设怎么样前几天#xff0c;我发现了这个小问题#xff1a;该服务器运行了一段时间#xff0c;然后掉下来了。 然后通过启动脚本重新启动#xff0c;整个过程重复进行。 这听起来并不那么糟糕#xff0c;尽管对数据的损失很大#xff0c;但对业务的重要性并不重要#xff0c;因此… 前几天我发现了这个小问题该服务器运行了一段时间然后掉下来了。 然后通过启动脚本重新启动整个过程重复进行。 这听起来并不那么糟糕尽管对数据的损失很大但对业务的重要性并不重要因此我决定仔细研究一下找出问题出在哪里。 首先要注意的是服务器通过了所有的单元测试和大量的集成测试。 它在使用测试数据的所有测试环境中都能很好地运行那么生产中出了什么问题 很容易猜到在生产中它的负载可能比测试重或者比设计所允许的负载大因此它用尽了资源但是什么资源在哪里 这是一个棘手的问题。 为了演示如何研究此问题首先要做的是编写一些泄漏的示例代码而我将使用Producer Consumer模式来执行此操作因为我可以演示它的大问题。 为了演示泄漏的代码1我需要像往常一样需要一个高度人为的方案在这种情况下您可以想象您在一个将股票销售量记录在数据库中的系统上的股票经纪人工作。 订单由一个简单的线程接收并放入队列中。 然后另一个线程从队列中获取订单并将其写入数据库。 的 Order POJO非常简单如下所示 public class Order { private final int id; private final String code; private final int amount; private final double price; private final long time; private final long[] padding; /** * param id *            The order id * param code *            The stock code * param amount *            the number of shares * param price *            the price of the share * param time *            the transaction time */ public Order(int id, String code, int amount, double price, long time) { super(); this.id id; this.code code; this.amount amount; this.price price; this.time time; // This just makes the Order object bigger so that // the example runs out of heap more quickly. this.padding new long[3000]; Arrays.fill(padding, 0, padding.length - 1, -2); } public int getId() { return id; } public String getCode() { return code; } public int getAmount() { return amount; } public double getPrice() { return price; } public long getTime() { return time; } } Order POJO是一个简单的Spring应用程序的一部分该应用程序具有三个关键抽象当Spring调用它们的start()方法时它们会创建一个新线程。 其中第一个是OrderFeed 。 它的run()方法创建一个新的虚拟订单并将其放置在队列中。 然后它会休眠一会儿然后再创建下一个订单。 public class OrderFeed implements Runnable { private static Random rand new Random(); private static int id 0; private final BlockingQueueOrder orderQueue; public OrderFeed(BlockingQueueOrder orderQueue) { this.orderQueue orderQueue; } /** * Called by Spring after loading the context. Start producing orders */ public void start() { Thread thread new Thread(this, Order producer); thread.start(); } /** The main run loop */ Override public void run() { while (true) { Order order createOrder(); orderQueue.add(order); sleep(); } } private Order createOrder() { final String[] stocks { BLND.L, DGE.L, MKS.L, PSON.L, RIO.L, PRU.L, LSE.L, WMH.L }; int next rand.nextInt(stocks.length); long now System.currentTimeMillis(); Order order new Order(id, stocks[next], next * 100, next * 10, now); return order; } private void sleep() { try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } 第二类是OrderRecord 它负责从队列中获取订单并将其写入数据库。 问题在于将订单写入数据库要花费的时间要长得多。 我的recordOrder(…)方法中有1秒的长时间睡眠这证明了这一点。 public class OrderRecord implements Runnable { private final BlockingQueueOrder orderQueue; public OrderRecord(BlockingQueueOrder orderQueue) { this.orderQueue orderQueue; } public void start() { Thread thread new Thread(this, Order Recorder); thread.start(); } Override public void run() { while (true) { try { Order order orderQueue.take(); recordOrder(order); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * Record the order in the database * * This is a dummy method * * param order *            The order * throws InterruptedException */ public void recordOrder(Order order) throws InterruptedException { TimeUnit.SECONDS.sleep(1); } } 结果很明显 OrderRecord线程无法跟上队列将越来越长直到JVM用完堆空间并OrderRecord为止。 这是生产者-消费者模式的最大问题消费者必须能够跟上生产者的步伐。 为了证明他的观点我添加了第三类OrderMonitor 该类每隔几秒钟打印一次队列大小以便您可以看到出现问题的地方。 public class OrderQueueMonitor implements Runnable { private final BlockingQueueOrder orderQueue; public OrderQueueMonitor(BlockingQueueOrder orderQueue) { this.orderQueue orderQueue; } public void start() { Thread thread new Thread(this, Order Queue Monitor); thread.start(); } Override public void run() { while (true) { try { TimeUnit.SECONDS.sleep(2); int size orderQueue.size(); System.out.println(Queue size is: size); } catch (InterruptedException e) { e.printStackTrace(); } } } } 为了完成阵容我在下面添加了Spring上下文 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:phttp://www.springframework.org/schema/pxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd default-init-methodstart default-destroy-methoddestroybean idtheQueue classjava.util.concurrent.LinkedBlockingQueue/bean idorderProducer classcom.captaindebug.producerconsumer.problem.OrderRecordconstructor-arg reftheQueue//beanbean idOrderRecorder classcom.captaindebug.producerconsumer.problem.OrderFeedconstructor-arg reftheQueue//beanbean idQueueMonitor classcom.captaindebug.producerconsumer.problem.OrderQueueMonitorconstructor-arg reftheQueue//bean/beans 下一步是启动泄漏的示例代码。 您可以通过转到以下目录来执行此操作 /your-path/git/captaindebug/producer-consumer/target/classes …然后键入以下命令 java -cp /path-to/spring-beans-3.2.3.RELEASE.jar:/path-to/spring-context-3.2.3.RELEASE.jar:/path-to/spring-core-3.2.3.RELEASE.jar:/path-to/slf4j-api-1.6.1-javadoc.jar:/path-to/commons-logging-1.1.1.jar:/path-to/spring-expression-3.2.3.RELEASE.jar:. com.captaindebug.producerconsumer.problem.Main …其中“ path-to ”是您的jar文件的路径 有一两件事我真的很讨厌关于Java的是事实上它是如此难以运行在命令行中的任何程序。 您必须弄清楚什么是类路径需要设置哪些选项和属性以及什么是主类。 当然肯定有可能想到一种简单地键入Java programName的方法并且JVM找出所有内容在哪里特别是如果我们开始使用约定而不是配置它有多难 您还可以通过附加一个简单的jconsole来监视泄漏的应用程序。 如果要远程运行它则需要在上面的命令行中添加以下选项选择您自己的端口号 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port9010 -Dcom.sun.management.jmxremote.local.onlyfalse -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse …如果您查看使用的堆数量您会发现随着队列变大堆逐渐增加。 如果一千字节的内存泄漏了那么您可能永远也找不到它。 如果一千兆字节的内存泄漏问题将很明显。 因此目前要做的只是坐下来等待一些内存泄漏然后再继续进行下一步调查。 下次再说… 1源代码可以在我在GitHub上的Producer Consumer项目中找到 。 参考 调查内存泄漏第1部分–在Captain Debug的Blog博客上由JCG合作伙伴 Roger Hughes 编写泄漏代码 。 翻译自: https://www.javacodegeeks.com/2013/12/investigating-memory-leaks-part-1-writing-leaky-code.html
http://www.pierceye.com/news/548086/

相关文章:

  • 推广网站公司兴义市住房和城乡建设局网站
  • 营销网站建设的公司哪家好创建网站超链接
  • 苏州网站优化排名推广企业网站建设价格
  • 在线制作论坛网站wordpress建立好的网站
  • 网站的功能规范商城网站静态模板下载
  • 双语言网站源码制作网页的软件哪个好
  • 政务网站建设需求网站首页页面代码
  • 网站产品详情页怎么做的用服务器做网站空间
  • 河北网站制作报价长春市建设技工学校网站
  • 盘锦做网站专家常州网站建设企业网站制作
  • 关于建设网站的报告wordpress 视频 广告插件
  • 生态养殖网站模板网赌网站建设多少钱
  • wordpress is长沙百度提升优化
  • 福州网站建设哪个好网页被禁止浏览怎么解决
  • 缩短链接的网站磁力猫引擎
  • 佛山网站到首页排名网站开发招标任务书
  • 网站建设相关专业手机网站建设软件有哪些
  • 做网站编辑累吗平台推广策划
  • 景区网站模板深圳中建南方建设集团网站
  • 深圳市网站建设有补贴吗特殊教育学校网站建设方案
  • 专业电影网站建设建e全景效果图
  • 优惠券网站怎么做的哪里有网站制作
  • 单页网站搭建购买一级域名做网站
  • 优秀设计作品的网站单页网站仿制教程
  • 品牌形象网站有哪些ajs17网站建设
  • 微信公众号手机网站开发文成网站制作
  • 中邮通建设咨询有限公司官方网站网站升级及政务新媒体建设方案
  • 网站建设服务费会计分录宁波市住房与城乡建设部网站
  • 如何申请cn域名做网站wordpress 企业网站主题
  • 网站建设 锋云科技公司东莞有什么比较好的网站公司