标签: jvm-hotspot

Java Class.getSimpleName()和.getName()在Cacao与Sun Java上的行为不同

有没有人知道为什么会发生这种情况?

这是来自Java DBus绑定的一些修改行(2.6)

  // don't let people import things which don't have a
  // valid D-Bus interface name
  System.out.println("type.getName: " + type.getName() + "   type.getSimpleName: " + type.getSimpleName() );
  if (type.getName().equals(type.getSimpleName()))  {
      throw new DBusException(_("DBusInterfaces cannot be declared outside a package: " + "type.getName: " + type.getName()
              + "   type.getSimpleName: " + type.getSimpleName() ));
  }      
Run Code Online (Sandbox Code Playgroud)

现在看看Cacao(0.99.4)与Su​​n 1.5的输出差异

@ubuntu:~/tmp/cacao$ java -version
java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)
Java HotSpot(TM) Client VM (build 1.5.0_16-b02, mixed mode, sharing) …
Run Code Online (Sandbox Code Playgroud)

java jvm-hotspot

3
推荐指数
1
解决办法
3万
查看次数

为什么Java在这种情况下比C更快(和更慢)?

一些人刚刚开始通过阅读K&R来学习C,并在第一页上打印出了华氏到细胞的转换循环:

#include <stdio.h>

main ()                                                                                                                                                       
{
  int fahr;                                                                                                                                                    

  for (fahr = 0; fahr<= 200000000; fahr = fahr + 20)                                                                                                                                                                                
    printf("%d\t%6.2f\n", fahr, (5.0 / 9.0) * (fahr-32));                                                                                                                                                                                       
}   
Run Code Online (Sandbox Code Playgroud)

他被告知Java很慢.所以,告诉他Java现在非常具有竞争力,但C在这个简单的情况下可能会更快.想要证明他并且基本上添加了"System.out".在printf()前面.

它慢了10倍.方式太多了.我很困惑.想到String对象创建,GC,-server,yada,yada,yada.

当我发现几乎100%的时间实际上用在printf()(PrintSteam.write()输出管道到/ dev/null)时,我感到更加困惑.

在一些摆弄之后我想出了这个(现在不做%f的四舍五入):

public static void main(String... args) throws Exception {                                                                                                       
   int fahr=0;                                                                                                                                                    

    PrintWriter out = new PrintWriter(Channels.newWriter(Channels.newChannel(System.out), "US-ASCII") );                                                                                                

    int max = 2000000000;                                                                                                                                         
    for (fahr = 0; fahr<= max; fahr = fahr + 20)
      // out.printf("%d\t%6.2f\n", fahr, (5.0 / 9.0) * (fahr-32));                                                                                                       
      out.println( fahr + "\t" + f(((5.0 …
Run Code Online (Sandbox Code Playgroud)

java performance gcc jvm jvm-hotspot

3
推荐指数
1
解决办法
1075
查看次数

客户端/服务器JVM选项的差异

在Java Hotspot编译器中,初始化Java与之-client相反的是-server什么,以及每个的优缺点/注意事项是什么?

java jvm jvm-hotspot

3
推荐指数
1
解决办法
963
查看次数

有什么方法可以像 -XX:+PrintCompilation 一样重定向本机 JVM 输出的输出

一些热点 JVM 标志,例如-XX:+PrintCompilation,会导致输出出现在 stdout 或 stderr 上。GC 相关的输出,例如由 -verbose:gc 启用的输出,可以使用 重定向-Xloggc:<path>,但我找不到任何方法重定向其他本机输出,除了重定向整个过程(出于某些原因,这可能是不可取的,例如以及捕获所有 System.out 输出)。

java debugging sun jvm-hotspot

3
推荐指数
1
解决办法
650
查看次数

原始线程与非原始线程的区别

在 Open JDK note 中,我发现了这个精确的注释

在新创建的线程(非原始线程)中使用 JNI_CreateJavaVM 创建 VM。注意:在原始线程中创建 VM 会大大降低自定义 VM 的能力,例如 Windows 上的堆栈大小以及许多其他限制

在谷歌上找不到太多关于这方面的文献!!:O。请赐教。

java operating-system jvm jvm-hotspot

3
推荐指数
1
解决办法
863
查看次数

与Java 7相比,运行相同递归代码的相同线程似乎在Java 8中消耗更多堆栈内存

我在"stackoverflow"网站上问一个关于"java堆栈溢出"的问题:)

对于特定输入进行一些递归函数调用的特定线程在Oracle Java 7(64位)中运行良好,配置的堆栈大小为228k(-Xss228k).

但是,为同一输入运行相同递归代码的同一线程会抛出Oracle Java 8(64位)中的java.lang.StackOverflowError,其堆栈大小为228k.如果堆栈大小增加到512k(-Xss512k),它在Java 8中运行良好.

知道为什么会这样吗?与Java 7相比,在Java 8(Hotspot JVM)中是否进行了任何更改,这可能会增加递归函数调用的堆栈内存消耗?如果需要,我可以提供更多细节.

(编辑)注意:相同的递归深度在Java 7中"始终"起作用,但在Java 8中"始终"失败,堆栈大小为228k.

memory stack-overflow recursion jvm-hotspot java-8

3
推荐指数
1
解决办法
251
查看次数

JVM堆栈大小规范

我有一个常规的64位热点JVM,其堆栈大小为1 MB.现在我试图序列化一个具有3022个父级的层次结构的对象,这给了我SO(反讽)异常.

这是一些代码:

while(epc.getParent()!=null){

      epc=epc.getParent();
      count++;
     }
     print(count);//3022
Run Code Online (Sandbox Code Playgroud)

上面的代码只是告诉层次结构,但当我尝试将epc对象序列化到ObjectOutputStream 时,会发生实际问题.

问题,JVM中1 MB堆栈大小的状态是什么,因为我不知道堆栈帧的大小是多少?我确定每个堆栈帧不是1KB,因为我在-Xss3000k成功运行了代码.

还有一个问题,如果我放置-Xss3000k的JVM选项,每个线程的堆栈大小是否为3000k?

java jvm jvm-hotspot

3
推荐指数
1
解决办法
5260
查看次数

设置非标准 java vm 选项 -Xms 不带 -X

Oracle文档说非标准 vm 选项(如启动堆大小和最大堆大小)是通过在它们前面加上 -X 来设置的。因此,要将启动堆大小设置为 128 MB,您可以使用 -Xms128m。

但是, -ms 和 -mx 似乎也有效。这是真的还是使用 -ms 代替 -Xms 有其他影响?

这是否记录在任何地方,要么 -X 不是必需的,要么它们是标准选项?

是否还有其他类似的选项,不需要以 -X 为前缀?

java jvm heap-memory jvm-hotspot

3
推荐指数
1
解决办法
918
查看次数

Java是否曾经偏重单个锁

这个问题是关于偏向锁定的启发式Java使用之一。下一段是给将来的读者的。我怀疑任何可以回答这个问题的人都可以安全地跳过它。

据我了解,曾几何时,人们注意到Java有许多线程安全的类,但是它们的实例往往仅由一个线程使用,因此Sun引入了偏向锁以利用这一点。问题是,如果您“猜错了”并尝试从两个线程中偏向需要使用的锁,则即使没有争用,也需要撤消(“撤销”)偏见,这太昂贵了,以至于JVM会尽力避免这种情况,即使这意味着有时在偏向锁定可能会最终获胜的情况下也会错过这一机会。

我也知道有时JVM会决定执行“批量”重新偏置,并将许多某种类型的所有锁迁移到另一个线程。这个问题不是关于这个的。出于这个问题的目的,假设我只有两个线程和一个锁。(实际情况更加复杂,并且涉及线程池,但现在暂时不考虑它。确实,假装我没有提到它。)进一步假设线程A沿着“睡眠几秒钟”的方式运行无限循环。 ,在锁定下递增整数,然后重复”。(并不是真的没什么用,但这应该足以使观点明白。)同时,线程B运行类似的循环,但是睡眠时间是几小时而不是几秒钟。进一步假设调度程序是不可思议的,并保证永远不存在任何争用。

现在,假设我们关心线程A唤醒和成功递增其整数之间的平均延迟。据我了解,JVM最初会将锁定偏向A,然后在线程B第一次唤醒时取消偏向。

我的问题是:JVM是否会认识到其最初的猜测基本上是正确的,从而再次将锁重新分配给线程A?

multithreading jvm synchronized jvm-hotspot biased-locking

3
推荐指数
1
解决办法
300
查看次数

vmovdqu在这做什么?

我有一个Java循环,如下所示:

public void testMethod() {
    int[] nums = new int[10];
    for (int i = 0; i < nums.length; i++) {
        nums[i] = 0x42;
    }
} 
Run Code Online (Sandbox Code Playgroud)

我得到的组件是这样的:

0x00000001296ac845: cmp    %r10d,%ebp
0x00000001296ac848: jae    0x00000001296ac8b4
0x00000001296ac84a: movl   $0x42,0x10(%rbx,%rbp,4)
0x00000001296ac852: inc    %ebp               
0x00000001296ac854: cmp    %r11d,%ebp
0x00000001296ac857: jl     0x00000001296ac845  

0x00000001296ac859: mov    %r10d,%r8d
0x00000001296ac85c: add    $0xfffffffd,%r8d
0x00000001296ac860: mov    $0x80000000,%r9d
0x00000001296ac866: cmp    %r8d,%r10d
0x00000001296ac869: cmovl  %r9d,%r8d
0x00000001296ac86d: cmp    %r8d,%ebp
0x00000001296ac870: jge    0x00000001296ac88e
0x00000001296ac872: vmovq  -0xda(%rip),%xmm0                                                    
0x00000001296ac87a: vpunpcklqdq %xmm0,%xmm0,%xmm0
0x00000001296ac87e: xchg   %ax,%ax

0x00000001296ac880: vmovdqu %xmm0,0x10(%rbx,%rbp,4)  
0x00000001296ac886: add    $0x4,%ebp …
Run Code Online (Sandbox Code Playgroud)

x86 assembly jvm-hotspot avx java-bytecode-asm

3
推荐指数
2
解决办法
1089
查看次数