首先,我必须承认这些是非常基本和原始的问题......我想在Java中演示不同的算法,用于排序和搜索,以及获取运行时的值.有些问题我无法解决:
有热点编译 - 这是我需要停用的运行时优化(我猜).
如何获取运行时的时间值(秒)?在执行之前启动计时器并在之后停止...似乎有点原始.而timer-object本身也会消耗运行时...我需要避免这种情况.
Java API中有什么可以用来解决这些问题吗?
谢谢,克劳斯
我还不清楚JIT编译器将字节码编译成机器码的概念.我想知道为什么它产生比非JIT解释器更快的代码.有人能给我一个关于如何完成这个过程的好例子吗?
我正在阅读以下文章:http://java.sun.com/docs/hotspot/gc1.4.2/example.html并且无法理解以下几行:
Young generation size is too small
The young generation heap size in this first example is about 4 Mbytes with an overall heap size of about 32 Mbytes.
[GC [DefNew: 4032K->64K(4032K), 0.0429742 secs] 9350K->7748K(32704K), 0.0431096 secs]
[GC [DefNew: 4032K->64K(4032K), 0.0403446 secs] 11716K->10121K(32704K), 0.0404867 secs]
[GC [DefNew: 4032K->64K(4032K), 0.0443969 secs] 14089K->12562K(32704K), 0.0445251 secs]
This output seems reasonable from the point of view of the time spent in garbage collection but note that although the occupancy of …
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我通过线程池多次调用一个函数.在这个函数中,我通过名为FastestMemory的全局属性跟踪函数的最快执行.
但是,当我打印出值时,在线程池循环之后,我被赋予原始值,就好像全局变量与每次循环迭代更新的变量不同.当我知道FastestMemory的值被分配给(例如)253475时,我只有2000000000返回.
1)我是否需要重新构造此代码以便能够跟踪最快的迭代?
2)我似乎能够非常快地执行此代码,它在四个Xeon x7550上每次迭代采用(ob平均值)小于1毫秒.这是正常的还是我的时间错误?C#平均需要大约400毫秒?!?
public class PoolDemo {
static long FastestMemory = 2000000000;
static long SlowestMemory = 0;
static long TotalTime;
static long[] FileArray;
static DataOutputStream outs;
static FileOutputStream fout;
public static void main(String[] args) throws InterruptedException, FileNotFoundException {
int Iterations = Integer.parseInt(args[0]);
int ThreadSize = Integer.parseInt(args[1]);
FileArray = new long[Iterations];
fout = new FileOutputStream("server_testing.csv");
// fixed pool, unlimited queue
ExecutorService service = Executors.newFixedThreadPool(ThreadSize);
ThreadPoolExecutor executor = (ThreadPoolExecutor) service;
for(int i = 0; i<Iterations; i++) {
Task t = …
Run Code Online (Sandbox Code Playgroud) JVM的"-server"选项是否需要成为第一个选项?我在某处读到了这种情况,我再也找不到文档了.另一方面,Oracle给出的每个"示例"都表明情况就是如此.有谁知道答案,知道链接是什么证明它?
Hotspot JVM允许使用-Xloggc:选项将GC输出记录到特定文件.
问题是我有几个运行所有JVM实例的JVM实例从一个公共XML配置文件读取相同的配置选项,所以我只能看到其中一个实例的输出.
为了避免这种行为,我希望每个人都能记录到包含文件名中PID的不同文件.就像是:
-Xloggc:/var/log/jvm_gc_<PID>.log
Run Code Online (Sandbox Code Playgroud)
其中<PID>将是JVM实例的PID.
我不知道HotSpot是否能够插入这个,例如带有$$的linux bash shell.
有没有人知道是否有办法从Java返回两个值(接近)零开销?我只是在寻找两个值 - 我有几个用例来处理一个字节数组(需要返回值和下一个起始位置)来尝试返回一个带有错误代码的值来做一些丑陋的修复 - 点计算并需要整个和小数部分.
我不低于一些非常丑陋的黑客.功能很小,Hotspot很高兴地介绍它.所以现在,我只需要让Hotspot基本上忽略任何对象创建或位移.
如果我将我的返回值限制为整数,我已经尝试将它们打包成长,但即使在内联之后,Hotspot似乎也无法弄清楚所有的位移和掩码都没有真正做任何事情而且它很乐意打包并解压缩注入相同的值(显然,Hotspot的窥孔优化器需要帮助的地方).但至少我不是在创造一个对象.
我更难的情况是,当我需要返回的项目之一是引用而另一个是长引用或另一个引用时(对于int情况,我认为我可以压缩OOP并使用上面描述的位填充).
有没有人试图让Hotspot为此生成无垃圾代码?现在最糟糕的情况是我必须携带一个物体然后传递它,但我想保持它自包含.线程本地是昂贵的(哈希查找),它需要是可重入的.
例如,JDK方法java.lang.Integer.numberOfLeadingZeros(int):
public static int numberOfLeadingZeros(int i) {
// HD, Figure 5-6
if (i == 0)
return 32;
int n = 1;
if (i >>> 16 == 0) { n += 16; i <<= 16; }
if (i >>> 24 == 0) { n += 8; i <<= 8; }
if (i >>> 28 == 0) { n += 4; i <<= 4; }
if (i >>> 30 == 0) { n += 2; i <<= 2; }
n -= i …
Run Code Online (Sandbox Code Playgroud) ...
if (GCLocker::check_active_before_gc()) {
return false;
}
...
Run Code Online (Sandbox Code Playgroud)
如您所见,如果GCLocker::check_active_before_gc()
为true
,则它不会调用次要GC,即PSScavenge::invoke_no_policy()
。为什么?
bool GCLocker::check_active_before_gc() {
assert(SafepointSynchronize::is_at_safepoint(), "only read at safepoint");
if (is_active() && !_needs_gc) {
verify_critical_count();
_needs_gc = true;
log_debug_jni("Setting _needs_gc.");
}
return is_active();
}
Run Code Online (Sandbox Code Playgroud)
// Accessors
static bool is_active() {
assert(SafepointSynchronize::is_at_safepoint(), "only read at safepoint");
return is_active_internal();
}
Run Code Online (Sandbox Code Playgroud)
static bool is_active_internal() {
verify_critical_count();
return _jni_lock_count > 0;
}
Run Code Online (Sandbox Code Playgroud)
static volatile jint _jni_lock_count; // number of jni active instances.
Run Code Online (Sandbox Code Playgroud)
该 …
我只带一个简单的问题.根据java文档和许多关于java内存对象布局的文章,如果我们有一个带有一个int
变量的类,那么该对象的总内存消耗将是:
public class Ab {
int b;
}
Run Code Online (Sandbox Code Playgroud)
public static void main(String args[]) throws InterruptedException {
Ab ab = new AB();
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,当我使用Visual vm并查看堆转储来观察这个理论方法时,我注意到该对象的内存消耗是20字节而不是16字节?为什么会这样?有人可以向我解释一下吗?
java ×10
jvm-hotspot ×10
jvm ×6
algorithm ×1
concurrency ×1
interpreter ×1
jit ×1
memory ×1
openjdk ×1
performance ×1
runtime ×1