我们有一个客户端服务器应用,1个服务器,大约10个客户端.它们使用自定义查询通过tcp套接字进行通信.
该系统运行平稳了好几个月,但在某些时候,在每日计划服务器FULL GC耗时约50秒后,我们发现客户端发送的查询与从服务器收到的响应之间的时间很长,> 10-20s.系统恢复3个小时后,一切都恢复正常.
在调查问题时,我们发现:
我们在服务器上进行了一次线程转储:
java.lang.Thread.State: RUNNABLE
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at util.network.BytesBasedSocketConnection$ReadConnectionRunnable.run(BytesBasedSocketConnection.java:293)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)
该FilterInputStream.read()
如下:
public int read() throws IOException {
return in.read();
}
Run Code Online (Sandbox Code Playgroud)
在in
我们的代码是一个BufferedInputStream
.
问题是:为什么大多数连接在完全GC暂停后放慢了?为什么stacktrace结束FilterInputStream.read()
?它不应该BufferedInputStream
在套接字输入流中的某个地方结束吗?这读取会导致服务器上的高负载吗?
我们用于阅读的代码:
int constructLength = _socketDIS.readInt();
ByteArrayOutputStream constructBOAS = new ByteArrayOutputStream(constructLength);
for (int i = 0; i != constructLength; i++) …
Run Code Online (Sandbox Code Playgroud) 我的一台生产机器有一个奇怪的问题.它托管一个执行CMS(并发标记和扫描)的Java应用程序,但它只清理了旧一代的一小部分.我怀疑内存泄漏并尝试了堆转储.但堆转储之前的Full GC几乎清除了所有旧代.发生了什么?我从未见过Java垃圾收集的这种行为.通常CMS和Full GC应该收集大约相同数量的垃圾,现在CMS保持大约10GB以上.
GC日志:
**2016-01-04T07:37:40.196+0000: 431200.698: [GC [1 CMS-initial-mark: 21633423K(27336704K)] 22826703K(30101504K), 4.3910840 secs] [Times: user=4.40 sys=0.01, real=4.39 secs]
2016-01-04T07:37:44.588+0000: 431205.090: [CMS-concurrent-mark-start]
2016-01-04T07:38:08.718+0000: 431229.220: [CMS-concurrent-mark: 18.213/24.131 secs] [Times: user=126.00 sys=2.22, real=24.13 secs]
2016-01-04T07:38:08.718+0000: 431229.220: [CMS-concurrent-preclean-start]
2016-01-04T07:38:08.843+0000: 431229.345: [CMS-concurrent-preclean: 0.118/0.125 secs] [Times: user=0.29 sys=0.00, real=0.12 secs]
2016-01-04T07:38:08.843+0000: 431229.345: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 2016-01-04T07:38:13.906+0000: 431234.408: [CMS-concurrent-abortable-preclean: 4.975/5.063 secs] [Times: user=10.18 sys=0.03, real=5.06 secs]
2016-01-04T07:38:14.001+0000: 431234.503: [GC[YG occupancy: 1312993 K (2764800 K)]2016-01-04T07:38:14.001+0000: 431234.503: [Rescan (parallel) …
Run Code Online (Sandbox Code Playgroud) 我正在研究anorm文档(来自播放框架)并且不清楚它是否支持常见的查询用例:动态过滤器,即用户在10字段搜索表单上填写2或3个搜索条件.
在这种情况下,如何在没有经典字符串操作的情况下动态构造查询?
我已经完成了以下工作:
现在我需要让第4步工作:
任何人都可以给我一个提示吗?我试图了解我在谷歌上发现的东西,但它并没有像预期的那样发挥作用.我是否必须设置内容类型?当我设置应用程序/八位字节流时,只有txt和csv文件才能正确显示(在浏览器中,而不是我想要的下载弹出窗口)其他文件无效...
JSP:
<a4j:commandLink value="Download" action="#{appController.downloadFile}" rendered="#{!file.directory}">
<f:param name="file" value="#{file.absoluteFilename}" />
</a4j:commandLink>
Run Code Online (Sandbox Code Playgroud)
AppController的:
public String downloadFile() {
String filename = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("file");
File file = new File(filename);
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
writeOutContent(response, file, file.getName());
FacesContext.getCurrentInstance().responseComplete();
return null;
}
private void writeOutContent(final HttpServletResponse res, final File content, final String theFilename) {
if (content == null) {
return;
}
try {
res.setHeader("Pragma", "no-cache");
res.setDateHeader("Expires", 0);
res.setHeader("Content-disposition", "attachment; filename=" + theFilename);
FileInputStream fis = new FileInputStream(content);
ServletOutputStream os …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为quartz scheduler编写一个简单的cron表达式.我希望这个工作每个月在凌晨3点凌晨3点运行.
0 0 3 30 JAN-DEC ? *
Run Code Online (Sandbox Code Playgroud)
我想知道二月份会发生什么?工作是否会运行?
我不是在寻找一个月的最后一天解决方案,我需要用户选择作业运行的月份(理想情况是所有月份一次).
我在db中有100个实体.我想通过前20个实体的某些属性得到总和
Criteria cr = getSession().createCriteria(Entity.class);
cr.setFirstResult(0);
cr.setMaxResults(20);
cr.setProjection(Projections.sum("propertyName"));
Double sum = cr.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
但是条件返回所有实体的总和,因为setMaxResults(20)限制和值结果,这是一个对象 - uniqueResult.意味着建筑是完全正确的.如何正确使用标准获得几个实体的总和?
我正在使用一些遗留代码,我需要测试一些昂贵的服务被调用(它会进行网络呼叫,发送电子邮件等).
我可以通过使用的框架(jboss seam 2)注入假服务而不是原始服务.看到这个问题:单元测试的Mock @ org.jboss.seam.annotations.in行为
我现在希望我的假对象是一个更聪明的模拟断言是否已被调用,等等.我希望它是一个Mockito或Easymock或其他一些模拟.但是,由于接缝2和接缝测试处理注射的方式,在测试中构建模拟经典方式然后注入它是不起作用的.请参阅上面的链接.
问题:有没有办法让我的模拟扩展或注释,以成为Mockito或模拟?如何在测试中获得对它的引用?
我正在尝试创建一个ArrayList
(所以java,显然)类型TileEntity
(是的,这是一个Minecraft mod).但我还需要添加的对象ArrayList
来实现某个接口.
想到的第一个选项是创建TileEntity
该实现接口的抽象子类,并将其用作ArrayList
类型.但是考虑到人们通常创建自己的子类TileEntity
并将它们用作通常子类的类,并且我希望人们能够挂钩到我的mod中,我不能指望他们继承子类TileEntity
.
我目前的解决方案是if(object instanceof MyInterface)
在添加之前检查,但这看起来很难看.当然有一种方法可以设置一个类型,ArrayList
要求一个对象既是一个子类TileEntity
又是一个实现者MyInterface
.
我正在寻找guava TreeRangeMap,它似乎非常适合我对项目的需求.java文档说它基于(java标准?)TreeMap,它具有get(put和next)的O(log(n))时间.
但TreeRangeMap应该是某种范围树实现,根据这个SO问题,查询的O(k + log(n))时间复杂度为O(n)空间,k为范围大小?有人可以证实这一点吗?
我对TreeRangeMap.subRangeMap()操作的时间复杂性也很感兴趣.它是否具有相同的O(k + log(n))?
谢谢.
嗨,我正在写一个链表数据类型.我有一个内部类节点,我用它来存储元素和后继者.我目前在节点中的getElement和列表中的get方法遇到问题.这是节点中的getElement
public E getElement(){
return this.element;
}
Run Code Online (Sandbox Code Playgroud)
其中element是E元素声明的实例变量.但是,当我尝试在我的获取方法中返回它时
public E get(int index){
Node current;
if(index < 0 || index >= size)
throw new IndexOutOfBoundsException();
if(index == 0)
return head.getElement();
else{
current = head;
for(int i = 0; i< index; i++){
current = current.getSuccessor();
}
return current.getElement();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误无法从对象转换为类型E.我可以破解它并键入将其转换为E但我觉得有一些关于泛型的基本问题,我缺少.如果您认为这是作业,那么您是对的,并提前感谢您.