在过去的一年里,我在应用程序的Java堆使用方面做了很大的改进 - 减少了66%.为此,我一直在通过SNMP监控各种指标,例如Java堆大小,cpu,Java非堆等.
最近,我一直在监视JVM有多少实内存(RSS,驻留集)并且有点惊讶.JVM消耗的实际内存似乎完全独立于我的应用程序堆大小,非堆,eden空间,线程数等.
堆栈大小由Java SNMP Java堆使用图表测量http://lanai.dietpizza.ch/images/jvm-heap-used.png
以KB为单位的实内存.(例如:1 MB KB = 1 GB) Java堆使用图http://lanai.dietpizza.ch/images/jvm-rss.png
(堆图中的三个凹陷对应于应用程序更新/重新启动.)
这对我来说是一个问题,因为JVM正在消耗的所有额外内存都是"窃取"内存,可供操作系统用于文件缓存.实际上,一旦RSS值达到~2.5-3GB,我开始看到响应时间变慢,应用程序的CPU利用率更高,主要是IO等待.正如某些点对交换分区的分页启动.这都是非常不受欢迎的.
所以,我的问题:
血腥的细节:
相关的JVM参数:
-Xms128m
-Xmx640m
-XX:+UseConcMarkSweepGC
-XX:+AlwaysActAsServerClassMachine
-XX:+CMSIncrementalMode
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+CMSLoopWarn
-XX:+HeapDumpOnOutOfMemoryError
Run Code Online (Sandbox Code Playgroud)
我如何衡量RSS:
ps x -o command,rss | grep java | grep latest | cut -b 17-
Run Code Online (Sandbox Code Playgroud)
这将进入一个文本文件,并定期读入我的监控系统的RRD数据库.请注意,ps输出Kilo Bytes.
虽然最终是ATorras的答案证明最终是正确的,但是kdgregory …
有没有办法让S3默认为index.html页面?例如:我的桶对象列表:
/index.html
/favicon.ico
/images/logo.gif
Run Code Online (Sandbox Code Playgroud)
呼叫到www.example.com/ index.html的伟大工程!但是如果要打电话给www.example.com/,我们要么根据桶级ACL的配置方式获得列出XML文档的403或REST对象.
所以,问题是:有没有办法在S3上托管内容的index.html功能?
我工作的一些SocketChannel至- SocketChannel代码会做最好用直接字节缓冲区- (几十到几百每个连接的兆字节),长寿命,大而散列出具有确切循环结构FileChannelS,我跑了一些微在基准测试ByteBuffer.allocate()与ByteBuffer.allocateDirect()性能.
结果出人意料,我无法解释.在下图中,对于ByteBuffer.allocate()传输实现,在256KB和512KB处有一个非常明显的悬崖- 性能下降了~50%!这似乎也是一个较小的性能悬崖ByteBuffer.allocateDirect().(%-gain系列有助于可视化这些变化.)
缓冲区大小(字节)与时间(MS)

为什么奇数性能曲线ByteBuffer.allocate()与ByteBuffer.allocateDirect()?之间存在差异? 幕后究竟发生了什么?
它很可能取决于硬件和操作系统,所以这里有以下细节:
源代码,按要求:
package ch.dietpizza.bench;
import static java.lang.String.format;
import static java.lang.System.out;
import static java.nio.ByteBuffer.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
public class SocketChannelByteBufferExample {
private static WritableByteChannel target;
private static ReadableByteChannel source; …Run Code Online (Sandbox Code Playgroud) 当我启动我的Erlang模拟器时,第一位有一堆信息性的东西.(稍微重新格式化效果.)
manoa:~ stu$ erl
Erlang (BEAM) emulator version 5.6.5
[source] [smp:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1>
Run Code Online (Sandbox Code Playgroud)
其中一些我可以猜到,可能是准确的,但有些意味着'这里是魔术'.
Erlang (BEAM) emulator version 5.6.5:版本,当然[source]:模拟器是从源代码编译的?[smp:2]:检测到两个CPU核心并且可用[async-threads:0]:[hipe]:?[kernel-poll:false]:?我也想知道是否有其他[foo]项目可能弹出不同的配置,构建或启动参数.
那么,Erlang模拟器信息语句意味着什么呢?
我希望能够记录FFMPEG进程,因为我正在尝试计算一分钟的视频转换为帮助我的视频编码服务器的容量规划.如何启用日志记录以及保存日志文件的位置.我在CentOS LAMP机器上安装了FFMPEG.
如何为资源文件生成ETag HTTP标头?
是否保证通过不同的线程看到以前的?我的期望是,并且阅读JavaDocs似乎表明了这一点,但我99%确信现实是不同的.在我的生产服务器上,下面似乎正在发生.(我已经记录了它.)ConcurrentHashMap.get() ConcurrentHashMap.put()
伪代码示例:
static final ConcurrentHashMap map = new ConcurrentHashMap();
//sharedLock is key specific. One map, many keys. There is a 1:1
// relationship between key and Foo instance.
void doSomething(Semaphore sharedLock) {
boolean haveLock = sharedLock.tryAcquire(3000, MILLISECONDS);
if (haveLock) {
log("Have lock: " + threadId);
Foo foo = map.get("key");
log("foo=" + foo);
if (foo == null) {
log("New foo time! " + threadId);
foo = new Foo(); //foo is expensive to instance
map.put("key", foo); …Run Code Online (Sandbox Code Playgroud) 我在命令行提示符下运行了两天的作业:
find data/ -name filepattern-*2009* -exec tar uf 2009.tar {} ;
Run Code Online (Sandbox Code Playgroud)
它需要永远,然后一些.是的,目标目录中有数百万个文件.(每个文件在一个良好的散列目录结构中只有8个字节.)但是只是运行...
find data/ -name filepattern-*2009* -print > filesOfInterest.txt
Run Code Online (Sandbox Code Playgroud)
......只需要两个小时左右.按照我的工作速度,它将在几周内完成.这似乎是不合理的.这样做有效吗? 也许使用更复杂的bash脚本?
第二个问题是"为什么我目前的做法如此缓慢?"
我想为Web浏览器开发一个小插件,即Chrome和FireFox.哪一个更容易†为第一个项目开发?我对这个空间非常不熟悉,因为我花了大部分时间来编写服务器端Java.
†:在我的上下文中更容易意味着:
如果重要,这是我的插件的目标:
<img src="bobisyouruncle.jpg" findme="found" />非常感谢来自直接经验编码两种浏览器的人的答案.
程序下方打印出符合ISO 4217货币代码的货币符号.
import java.util.*;
public class Currency{
public static void main(String args[]) {
Currency myInstance = Currency.getInstance(args[0]);
System.out.println(myInstance.getSymbol());
}
}
Run Code Online (Sandbox Code Playgroud)
问题:输入字符串USD时工作正常.对于像EUR这样的其他输入,只需返回货币代码.
样本输入,来自程序的输出:
input: java Currency USD
output: $
input: java Currency EUR
output: EUR -> I expect the symbol of Euro here
Run Code Online (Sandbox Code Playgroud)