我听说过很多关于map/reduce的内容,特别是在谷歌大规模并行计算系统的背景下.究竟是什么?
正如Knuth所说,
我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源.
这是Stack Overflow常常出现的问题,例如"哪个是最有效的循环机制","SQL优化技术?"等问题.(等等).这些优化提示问题的标准答案是分析您的代码并首先查看它是否是一个问题,如果不是,那么您的新技术就不再需要了.
我的问题是,如果某种技术不同但不是特别模糊或混淆,那真的可以被认为是过早的优化吗?
这是Randall Hyde的一篇名为"过早优化的谬误"的相关文章.
我正在开发一个用Java编写的程序,对于某些操作,它使用用户配置的命令行启动外部程序.目前它使用Runtime.exec()并且不保留Process引用(启动的程序是文本编辑器或存档实用程序,因此不需要系统输入/输出/错误流).
但是这有一个小问题,因为当Java程序退出时,在退出所有启动的程序之前它并没有真正退出.
如果启动的程序完全独立于启动它们的JVM,我会更喜欢它.
目标操作系统是多个,Windows,Linux和Mac是最小的,但任何带有JVM的GUI系统都是最理想的(因此实际命令行的用户可配置性).
有谁知道如何让启动的程序完全独立于JVM执行?
编辑以回复评论
启动代码如下.代码可以启动位于特定行和列的编辑器,也可以启动存档查看器.配置的命令行中的引用值被视为ECMA-262编码,并被解码并且引号被剥离以形成所需的exec参数.
这次发射发生在美国东部时间.
static Throwable launch(String cmd, File fil, int lin, int col) throws Throwable {
String frs[][]={
{ "$FILE$" ,fil.getAbsolutePath().replace('\\','/') },
{ "$LINE$" ,(lin>0 ? Integer.toString(lin) : "") },
{ "$COLUMN$",(col>0 ? Integer.toString(col) : "") },
};
String[] arr; // array of parsed tokens (exec(cmd) does not handle quoted values)
cmd=TextUtil.replace(cmd,frs,true,"$$","$");
arr=(String[])ArrayUtil.removeNulls(TextUtil.stringComponents(cmd,' ',-1,true,true,true));
for(int xa=0; xa<arr.length; xa++) {
if(TextUtil.isQuoted(arr[xa],true)) {
arr[xa]=TextDecode.ecma262(TextUtil.stripQuotes(arr[xa]));
}
}
log.println("Launching: "+cmd);
Runtime.getRuntime().exec(arr);
return null; …Run Code Online (Sandbox Code Playgroud) 我想让一些长期运行的服务器应用程序定期输出Java中的常规GC性能数字,比如相当于Runtime.freeMemory()的GC等等.完成循环次数,平均时间等.
我们有在客户机器上运行的系统,其中怀疑错误配置的内存池导致GC频率和长度过多 - 我发现定期报告基本GC活动会很好.
有没有平台独立的方法来做到这一点?
编辑:我特意想在运行时将此数据输出到系统日志(控制台); 这不是我想要连接到JVM的东西,就像JConsole或JVisualVM一样.
Edit2:MX bean看起来像我想要的 - 有没有人有一个工作代码示例获得其中一个?
我似乎不太了解两个OOP概念.你能解释什么是抽象和多态,最好用真实的例子和代码吗?
谢谢.
在值得重用之前,缓冲区需要有多大的缓冲区?
或者,换一种方式:我可以重复分配,使用和丢弃byte []对象或运行池来保存和重用它们.我可能会分配很多经常被丢弃的小缓冲区,或者一些不会被丢弃的大缓冲区.汇集它们的大小比重新分配要便宜,小分配与大分配相比如何?
好的,具体参数.说英特尔酷睿2双核CPU,最新的虚拟机版本,适用于操作系统.这个问题并不像听起来那么模糊......一些小代码和一个图表可以回答它.
你发布了很多很好的一般规则和讨论,但这个问题确实要求数字.发布'em(和代码)! 理论很棒,但证据就是数字.如果各个系统的结果有所不同并不重要,我只是在寻找一个粗略的估计(数量级).似乎没有人知道性能差异是1.1,2,10或100+的因素,这是重要的.对于使用大型阵列的任何Java代码来说都很重要 - 网络,生物信息学等.
建议获得良好的基准:
我知道这是一个模糊且有点苛刻的问题.我会定期查看这个问题,答案会得到评论并持续评分.懒惰的答案不会(见下面的标准).如果我没有任何彻底的答案,我会附上一笔赏金.无论如何,我可能会额外奖励一个非常好的答案.
我正在开发一个库,为Java添加LZF压缩支持.该库通过添加额外的压缩级别(更多压缩)以及与来自C LZF库的字节流的兼容性来扩展H2 DBMS LZF类.我正在考虑的一件事是,是否值得尝试重用用于压缩/解压缩流的固定大小的缓冲区.缓冲器可以是~8kB,或~32kB,并且在原始版本中它们是~128kB.可以为每个流分配缓冲器一次或多次.我正在试图找出我想如何处理缓冲区以获得最佳性能,并着眼于将来可能的多线程.
是的,如果有人有兴趣使用它,库将作为开源发布.
在IBM iSeries系统上,我运行了一个Java程序 - 一个带有Web服务器组件的应用程序服务器,所有这些都是内部开发的.在32位或64位J9 JVM(IBM Technology for Java)上运行时,我有内存泄漏的症状.
请注意,在iSeries经典JVM,多个Sun/Oracle JVM和Linux JVM上运行此软件时,不会出现任何问题.哎呀,我经常在我妻子的入门级笔记本电脑的时间离开周运行相同的软件,而我在我的网站的工作 - 我可以向你保证,如果它是内存泄漏,将那个东西被发现.
如果我刚刚离开一个普通的香草系统运行空闲,没有配置应用程序(基本上就是邮件系统和Web服务器),堆只是继续缓慢增长,导致随着时间的推移被分配更多的内存,每个GC周期不相当于收集到以前的水平.对于没有问题的JVM,模式完全相同,除了那些GC扫描总是将堆减少到之前的GC级别.

但是,如果我在稳定后启动JVM系统转储并在分配的堆显着增长后进行后续转储,则差异比较表明运行一周后不再有可达对象,而不是启动时.最近的一个,一周后显示6个额外的类加载和一些明确相关的对象.对所有活体物体的彻底评论都没有显示出任何让我意想不到的东西.
我已经尝试了优化的吞吐量和世代并发的垃圾收集器.
因此,根据作业的堆大小,我们似乎正在泄漏,并且根据堆转储,没有任何泄漏.
没有调用JNI方法(除了作为核心JVM的一部分运行的本机代码),它肯定是正在增长的堆 - 我可以清楚地看到IBM WRKJVMJOB信息以及在我的控制台中使用JMX bean报告日志文件.
到目前为止,我无法使用JVisualVM之类的JMX工具连接到活动JVM,因为尽管在正确配置时创建了侦听套接字,但是连接被拒绝,显然是在协议级别(TCP/IP堆栈显示已接受的连接,但是JVM反弹它).
我很困惑,不知道下一步该往哪里去.
编辑:只是为了澄清; 这些结果都是使用未经检测的JVM,因为我无法获得对此JVM的JMX访问权限(我们正在与IBM合作).
编辑2011-11-16 19:27:我能够在1823个GC循环中提取GC活动报告,其中包括Soft/Weak/PhantomReference计数的特定计数; 这些数字并没有出现失控增长的迹象.然而,小物体终身空间有显着增长(大物体终身空间是空的).它从9M增长到36M.
java ×4
css ×2
html ×2
optimization ×2
abstraction ×1
exec ×1
ibm-midrange ×1
j9 ×1
mapreduce ×1
memory-leaks ×1
oop ×1
paradigms ×1
performance ×1
polymorphism ×1