标签: jvm-hotspot

如何理解Java热点错误

当JVM崩溃时,他会写一个错误日志hs_err_pid.log.我想找出导致JVM崩溃的原因?如何理解这些日志,是否记录了日志的排列方式.我试图在网上搜索但无济于事:-(

指出相关的URL将不胜感激.谢谢.

java crash jvm jvm-hotspot

8
推荐指数
1
解决办法
7946
查看次数

我可以通过编程方式找出实例生成的GC生成吗?

此问题的范围仅限于HotSpot代.有没有办法以编程方式找出特定实例所在的生成.数据如:

  • 年轻还是老一代?
  • 如果年轻,哪个幸存者空间?
  • 里面的TLAB?哪个帖子?

任何技术(例如,BTrace,JVMTI)都可以工作,只要我可以这样做:

Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
Run Code Online (Sandbox Code Playgroud)

乞丐不能挑肥拣瘦,但最好我也能学到当目标实例正在从一代转移到另一个在它发生的那一刻(即事件回调基础-在时延和轮询开销隐含不感兴趣)

对没有理由的只是说"不"的答案不感兴趣:)

java garbage-collection jvm jvm-hotspot jvmti

8
推荐指数
1
解决办法
602
查看次数

Jvm JIT和Hotspot - 有什么区别

我听说这些术语正在使用,但我似乎无法在Java框架中找到它们在一起的最佳位置.我知道JIT是一个编译机制,但它是JVM的一部分吗?什么是热点?它是一种新型VM吗?

java compiler-construction jit jvm jvm-hotspot

8
推荐指数
3
解决办法
5988
查看次数

是什么导致JVM进行重大垃圾回收?

我有一个Java应用程序,它在不同的环境中显示不同的GC行为.在一个环境中,堆使用图是一个缓慢的锯齿,每10个小时左右就有一个主要的GC,只有当堆大于90%时才会填满.在另一个环境中,JVM每小时在点上执行主要GC(在这些时间堆通常在10%到30%之间).

我的问题是,导致JVM决定执行主要GC的因素是什么?

显然它会在堆几乎满了时收集,但是还有一些其他原因在起作用,我猜这与我应用程序中的每小时计划任务有关(尽管此时内存使用没有峰值).

我假设GC行为在很大程度上取决于JVM; 我在用:

  • Java HotSpot(TM)64位服务器VM 1.7.0_21 Oracle Corporation
  • 没有特定的GC选项,因此使用64位服务器的默认设置(PS MarkSweep和PS Scavenge)

其他信息:

  • 这是在Tomcat 6中运行的Web应用程序.
  • Perm gen在两种环境中都徘徊在10%左右.
  • 具有锯齿行为的环境具有7Gb最大堆,另一个具有14Gb.

拜托,没有猜测.JVM必须具有用于决定何时执行主要GC的规则,并且这些规则必须在源中深处编码.如果有人知道它们是什么,或者它们被记录在哪里,请分享!

java garbage-collection jvm jvm-hotspot

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

bootstrap类路径未与-source 1.6一起设置

我正在将我的应用程序从java 1.6升级到1.7.当我尝试使用Maven 3.2.1进行构建时,我的构建失败并出现以下错误消息:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project my-app5: Compilation failure: Compilation failure:
[ERROR] could not parse error message: warning: [options] bootstrap class path not set in conjunction with -source 1.6  
Run Code Online (Sandbox Code Playgroud)

我正在使用java 1.7热点,之前我使用的是1.6 jrockit.我的应用程序是多模块,很少有模块像往常一样编译和构建,这个模块失败了.

我已正确设置java home并且mvn --version显示在输出下方:

Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T23:07:52+05:30)
Maven home: C:\Users\me\Maven3\apache-maven-3.2.1-bin\apache-maven-3.2.1\bin\..
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: C:\Program Files\jdk17051\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"  
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

classpath jvm-hotspot maven-3

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

从JVM访问令牌端点时出现Google身份验证错误

我们使用JVM后端运行Web应用程序(Java 7更新75;代码在Scala中,但我不相信这是相关的).我们使用Google通过Oauth进行身份验证.

在过去的几个月中,我们一直在间歇性地无法对用户进行身份验证.

重定向,并从谷歌是成功的,但是当我们试图打电话给token_endpointhttps://www.googleapis.com/oauth2/v4/token验证验证我们有时出现以下情况例外:javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation.

这个关于另一个问题的评论让我发现了一个JDK错误,它可以表现为这个异常(什么意思是"javax.net.ssl.SSLHandshakeException:服务器证书更改在重新协商期间受到限制"以及如何防止它?).

我的工作假设是:

该错误(https://bugs.openjdk.java.net/browse/JDK-8072385)表示仅检查主题备用名称(SAN)列表中的第一个条目.当验证的主机名在SAN列表中但不在列表顶部时,抛出上述异常.

昨天(2015年5月27日)我们看到两个不同的证书是间歇性地从www.googleapis.com提供的.第一个(串行67:1a:d6:10:cd:1a:06:cc)有一个SAN列表,DNS:*.googleapis.com, DNS:*.clients6.google.com, DNS:*.cloudendpointsapis.com, DNS:cloudendpointsapis.com, DNS:googleapis.com而第二个(串行61:db:c8:52:b4:77:cf:78)有一个SAN列表:DNS:*.storage.googleapis.com, DNS:*.commondatastorage.googleapis.com, DNS:*.googleapis.com.

由于JVM中的错误,我们可以验证第一个证书,但是第二个证书会抛出异常(尽管完全有效),因为*.googleapis.com它不是SAN列表中的第一个条目.

修复程序尚未发布7u85(没有提及何时可用).

我已经将我们集群的一个节点降级到7u65,但是证书似乎在我们这样做的时候就已经恢复了(我们看到的最后一个错误是22:20GMT)所以很难确定肯定的解决方案.

有没有其他人经历过这个或类似的东西,除了降级之外还有其他任何解决方法(降级会删除各种其他SSL/TLS检查)?

java jvm-hotspot ssl-certificate google-authentication google-oauth

8
推荐指数
1
解决办法
891
查看次数

moderm JVM可以不同地优化同一类的不同实例吗?

假设我有2个相同类的实例,但它们的行为不同(遵循不同的代码路径)基于构造时设置的最终布尔字段.像这样的东西:

public class Foo {
   private final boolean flag;

   public Foo(boolean flagValue) {
      this.flag = flagValue;
   }

   public void f() {
      if (flag) {
         doSomething();
      } else {
         doSomethingElse();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

理论上,2个Foo具有不同值的实例flag可以由2个不同的程序集支持,从而消除了if的成本(对于人为的例子,这是我能想到的最简单的例子).

所以我的问题是 - 任何JVM实际上都这样做吗?或者是一个总是由单个程序集支持的单个类?

java optimization jvm bytecode jvm-hotspot

8
推荐指数
2
解决办法
112
查看次数

-XX:+ PrintCompilation输出中的新列是什么?

-XX:+PrintCompilation最近使用(JDK 8r111)来检查方法编译时,我注意到一个新列,它没有出现在我可以在该主题上找到文档中:

          this column
               |
               |
               v
600    1  s    3       java.util.Hashtable::get (69 bytes)
601    4       3       java.lang.Character::toLowerCase (6 bytes)
601    8       3       java.io.UnixFileSystem::normalize (75 bytes)
602   12       3       java.lang.ThreadLocal::get (38 bytes)
602   14       3       java.lang.ThreadLocal$ThreadLocalMap::getEntry (42 bytes)
602   18       2       java.lang.String::startsWith (72 bytes)
602   10       4       java.lang.String::equals (81 bytes)
602    2 %     4       java.lang.String::hashCode @ 24 (55 bytes)
602   16  s!   3       sun.misc.URLClassPath::getLoader (197 bytes)
603   23     n 0       java.lang.System::arraycopy (native)   (static)
604 …
Run Code Online (Sandbox Code Playgroud)

java optimization jvm-hotspot java-8

8
推荐指数
1
解决办法
762
查看次数

为什么JVM不在Windows x86上发出预取指令

正如标题所述,为什么OpenJDK JVM不会在Windows x86上发出预取指令?请参阅OpenJDK Mercurial @http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c49dcaf78a65/src/os_cpu/windows_x86/vm/prefetch_windows_x86.inline.hpp

inline void Prefetch::read (void *loc, intx interval) {}
inline void Prefetch::write(void *loc, intx interval) {}
Run Code Online (Sandbox Code Playgroud)

没有评论,我发现除了源代码之外没有其他资源.我问,因为它对Linux x86这样做,请参阅http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/c49dcaf78a65/src/os_cpu/linux_x86/vm/prefetch_linux_x86.inline.hpp

inline void Prefetch::read (void *loc, intx interval) {
#ifdef AMD64
  __asm__ ("prefetcht0 (%0,%1,1)" : : "r" (loc), "r" (interval));
#endif // AMD64
}

inline void Prefetch::write(void *loc, intx interval) {
#ifdef AMD64

  // Do not use the 3dnow prefetchw instruction.  It isn't supported on em64t.
  //  __asm__ ("prefetchw (%0,%1,1)" : : "r" (loc), "r" (interval));
  __asm__ …
Run Code Online (Sandbox Code Playgroud)

java x86 assembly jvm jvm-hotspot

8
推荐指数
2
解决办法
356
查看次数

如何在JVM内部发生java对象锁定和监视器创建

假设我有以下代码片段,其中两个线程访问具有两个关键部分(同步语句)的相同方法.这些同步语句中的每一个都被赋予不同的锁定对象.代码如下:

public class MyWorker {
private Random random = new Random();

private Object lock1 = new Object();
private Object lock2 = new Object();

private List<Integer> list1 = new ArrayList<>();
private List<Integer> list2 = new ArrayList<>();

private void stageOne() {

    synchronized (lock1) {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        list1.add(random.nextInt(100));
    }

}

private void stageTwo() {

    synchronized (lock2) {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        list2.add(random.nextInt(100));
    }

}

private void process() {
    for …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading jvm-hotspot

8
推荐指数
1
解决办法
867
查看次数