Tag:

引起:java.lang.OutOfMemoryError:Java堆空间

我的目标: 我想为1000个用户运行我的应用程序。 现在 我试图为100个用户运行。 在应用程序运行期间,我想为每个用户执行一些过程,每个用户至少需要一个小时,因此我每个用户使用一个线程。 错误 Caused by: java.lang.OutOfMemoryError: Java heap space 我试图找出这意味着什么,但我不确定如何解决它。 有谁能够帮我?

创建动态(增长/缩小)线程池

我需要在Java中实现一个线程池(java.util.concurrent),其空闲时线程数达到某个最小值,当作业提交到它上面的速度超过完成执行时,它会增长到上限(但绝不会更远) ,当完成所有作业并且不再提交作业时,缩小回到下限。 你会如何实现这样的东西? 我想这将是一个相当常见的使用场景,但显然java.util.concurrent.Executors工厂方法只能创建固定大小的池和池,当提交许多作业时,这些池和池会无限增长。 ThreadPoolExecutor类提供了corePoolSize和maximumPoolSize参数,但是它的文档似乎暗示了同时拥有多个corePoolSize线程的唯一方法是使用有界作业队列,在这种情况下,如果你已达到maximumPoolSize线程,你会得到拒绝工作,你必须自己处理? 我想出了这个: //pool creation ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(minSize)); … //submitting jobs for (Runnable job : …) { while (true) { try { pool.submit(job); System.out.println(“Job ” + job + “: submitted”); break; } catch (RejectedExecutionException e) { // maxSize jobs executing concurrently atm.; re-submit new job […]

将给定ID的任务绑定到同一线程的线程池

是否存在线程池(在Java中)的任何实现,以确保在同一线程上执行相同逻辑ID的所有任务? 我所追求的逻辑是,如果已经在给定逻辑ID的特定线程上执行了任务,则在同一线程上调度具有相同ID的新任务。 如果没有线程为同一ID执行任务,则可以使用任何线程。 这将允许并行执行不相关ID的任务,但是同一ID的任务将以串行和提交的顺序执行。 如果没有,是否有任何关于如何扩展ThreadPoolExecutor以获得此行为的建议(如果可能的话)? UPDATE 花了更长时间考虑这个问题,我实际上并不要求在同一个线程上执行相同逻辑ID的任务,只是它们不会同时执行。 这方面的一个例子是处理客户订单的系统,可以同时处理多个订单,但不能同一个客户(并且必须按顺序处理同一客户的所有订单)。 我现在采用的方法是使用标准的ThreadPoolExecutor,使用自定义的BlockingQueue并使用自定义包装器包装Runnable 。 Runnable包装器逻辑是: primefaces地尝试将ID添加到并发“运行”集( ConcurrentHashMap )以查看当前是否正在运行相同ID的任务 如果添加失败,请将任务重新推送到队列的前面并立即返回 如果成功,继续 运行任务 从“正在运行”的集合中删除任务的关联ID 然后队列的poll()方法只返回具有当前不在“运行”集中的ID的任务。 这样做的麻烦在于我确信会有很多我没有想过的极端情况,因此需要进行大量的测试。

要汇集还是不汇集java加密服务提供商

解 MessageDigest =>根据需要经常创建新实例 KeyFactory =>使用单个共享实例 SecureRandom =>使用StackObjectPool Cipher =>使用StackObjectPool 题 在编写安全框架时,我面临着一个常规的困境:“汇集或不汇集” 基本上这个问题分为两个“群体”: 第1组: SecureRandom因为对nextBytes(…)的调用是同步的,它可能成为WebApp /multithreading应用程序的瓶颈 第2组:加密服务提供商,如MessageDigest , Signature , Cipher , KeyFactory ,……(因为getInstance()的成本?) 你有什么意见 ? 你在这些问题上的习惯是什么? 编辑09/07/2013 我终于抽出时间亲自测试@Qwerky Share课程,我发现结果非常……令人惊讶。 这个类缺乏我的主要关注:像GenericObjectPool或StackObjectPool这样的池。 所以我重新修改了这个类以测试所有4种选择: 具有同步gist的单个共享实例 每个循环中的新实例(当你可以在循环外拉动摘要时,我对这种情况不感兴趣) GenericObjectPool: 要点 StackObjectPool: 要点 我不得不将循环次数降低到100000,因为1M花费了太多时间来使用池。 我还在每个循环的末尾添加了一个Thread.yield() ,以便为负载提供更好的形状。 结果(累积运行时): 信息摘要 新实例:420秒 单个实例:550秒 StackObjectPool:800秒 GenericObjectPool:1900年代 的KeyFactory 新实例:400s 单个实例:350秒 StackObjectPool:2900秒 GenericObjectPool:3500秒 的SecureRandom StackObjectPool:1600秒 新实例:2300秒 GenericObjectPool:2300s […]

java中线程池的类型

java中的线程池有哪些类型。 我需要实现一个使用繁重计算的健壮的multithreading应用程序,我应该使用哪个线程池?

在Java ThreadPool上感到困惑

在我遇到这个链接之后,这是我第一次使用Java Thread Pool进行我的新项目http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor .html ,我对此更加困惑,这里是来自页面的代码, package com.journaldev.threadpool; public class WorkerThread implements Runnable { private String command; public WorkerThread(String s){ this.command=s; } @Override public void run() { System.out.println(Thread.currentThread().getName()+’ Start. Command = ‘+command); processCommand(); System.out.println(Thread.currentThread().getName()+’ End.’); } private void processCommand() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString(){ return […]

ExecutorService中的持久变量(Java)

我已经创建了一个包含4个工作线程的池来处理一些文件。 在测试中,大约有200个。 线程池版本已经比顺序执行快3倍,但还有改进的余地。 最大的瓶颈(忽略磁盘I / O)是我需要实例化一个新的MessageDigest对象。 在单线程版本中我只有1.在这个版本中我有200。 我想知道的是,是否有可能在工作池中有一个本地变量? 这样(假设没有线程死亡)只有MessageDigest对象的四个实例而不是200 … 每个任务都需要摘要,所以我不确定是否有更好的方法来做… UPDATE 我试图使用ThreadLocal对象,但我应该在哪里创建它? 如果我在任务本身创建它,我想它在任务完成时就会脱离上下文。 每次创建新实例时。 我的代码是: ThreadLocal tl = new ThreadLocal(); hashMaker = tl.get(); if(hashMaker == null){ hashMaker = new GenerateSHA1(); tl.set(hashMaker); } 这是从任务的构造函数内部完成的。 UPDATE 好吧,让它成为静态的工作,因为对象不会丢失 – 但它现在突出显示了一个不同的问题。 工作“任务”在主线程中创建,然后使用invokveAll()添加到ExecutorService。 关于如何解决这个问题的任何想法?

为什么以下执行程序服务java Thread程序没有关闭?

import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.config.SocketConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import […]

使用ThreadPoolExecutor的活动任务数

我正在使用ThreadPoolExecutor在我的Java应用程序中执行任务。 我有一个要求,我想在执行程序队列中的任何时间点获取队列中的活动任务数。 我查看了ThreadPoolExecutor的javadoc ,发现了两个相关的方法: getTaskCount()和getTaskCount() getCompletedTaskCount() 。 根据文档,我可以分别从上述两种方法中获得计划任务和已完成任务的数量。 但我无法找到在任何时间点获取队列中活动任务数的解决方案。 我可以这样做: getTaskCount() = getCompletedTaskCount() + failed tasks + active tasks 但是,无法直接获得失败任务的数量以达到预期的计算。 我在这里错过了什么吗?

Java从ExecutorService设置回调

我有一个fixedThreadPool,我用它来运行一堆工作线程来实现具有许多组件的任务的并行执行。 当所有线程都完成后,我使用方法(getResult)检索它们的结果(相当大)并将它们写入文件。 最终,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后立即将其结果写入文件,然后释放其内存。 通常,我会在run()方法的末尾添加代码。 但是,此类中的某些其他对象也会调用这些线程,但不要让它们将结果写入文件 – 而是使用其结果执行其他计算,最终将其写入文件。 所以,我想知道是否可以使用ExecutorService将回调函数附加到线程完成事件。 这样,我可以立即检索其结果并在该场景中释放内存,但在其他场景中使用这些线程时不会破坏代码。 这样的事情可能吗?