Tag: jvm

JVM GC能否在参考比较的中间移动对象,即使双方都指向相同的对象,也会导致比较失败?

众所周知,GC有时会在内存中移动对象。 而且据我的理解,只要所有的引用在对象被移动的时候(在任何用户代码被调用之前)都被更新,这应该是完全安全的。 但是,我看到有人提到参考比较可能是不安全的,因为GC在参考比较的中间移动了对象,即使两个参考都指的是同一个对象,比较也会失败。 也就是说,有什么情况下下面的代码不会打印“真”? Foo foo = new Foo(); Foo bar = foo; if(foo == bar) { System.out.println("true"); } 我试着用googlesearch,缺乏可靠的结果让我相信说这个的人是错误的,但是我find了一个似乎表明他是正确的论坛post( 就像这个 )。 但是这个线程也有人说,不应该是这样的。

Sun的javac产生了奇怪的exception表条目

鉴于这个计划: class Test { public static void main(String[] args) { try { throw new NullPointerException(); } catch (NullPointerException npe) { System.out.println("In catch"); } finally { System.out.println("In finally"); } } } Sun的javac (v 1.6.0_24)生成以下字节码: public static void main(java.lang.String[]); // Instantiate / throw NPE 0: new #2; // class NullPointerException 3: dup 4: invokespecial #3; // Method […]

我如何正确设置permgen大小?

我有这个虚拟机与tomcat,Java和Grails的。 我已经得到permgen错误,所以我四处张望,发现解决scheme: set JAVA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m" 我使用SSH访问虚拟机并键入上面的参数。 我想这会解决这个问题。 事情是,我想确保我做对了。 所以我再次search如何检查当前permSize,这是我得到的解决scheme: jinfo -flag MaxPermSize 6444 6444是pid,作为回应,我得到了这个。 -XX:MaxPermSize=85983232 问题:maxPermSize的值是以字节为单位的吗? 因为,如果是这样,那就意味着java_opts命令不起作用。 我期望得到512米,但85983232字节= 82 MB ..或者我看到错误..? 有人可以启发我吗? d:

Jasper Reports的JVM不支持字体

我试图用DynamicJasper生成报告,但我得到以下错误: net.sf.jasperreports.engine.util.JRFontNotFoundException: Font 'Arial' is not available to the JVM. msttcorefonts被安装,但我猜JVM没有使用任何字体。 我使用Ubuntu 10.04。 我怎样才能解决这个问题?

支持压缩string在HotSpot JVM中被丢弃?

在这个Oracle页面的Java HotSpot VM选项上,默认情况下它列出-XX:+UseCompressedStrings作为可用的。 但是,在Java 6更新29中,默认情况下是closures的,而在Java 7更新2中,它会报告警告 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0 有谁知道删除这个选项背后的思想? 在java中sorting巨大的file.txt的行 使用-mx2g ,这个例子花费了4.541秒,在Java 6更新29中花了5.206秒。很难看出它会影响性能。 注意:Java 7 update 2需要2.0 G,而没有压缩string的Java 6 update 29需要1.8 GB,压缩string只需要1.0 GB。

JVM堆参数

在阅读了关于这个主题的已经被问及的问题之后,我仍然无法清楚地看到-Xms选项 我的问题是: java -Xms=512m -Xmx=512m和java -Xms=64m -Xmx=512m什么区别? 现在我有以下答案: 唯一的区别是在我的应用程序运行期间将运行的垃圾回收数量以及内存分配的数量。 我对吗 ? 这是我的这个答案的原因: 将-Xms选项设置为512m不会导致我的应用程序在启动后使用真正的512M物理内存。 我想这与现代操作系统虚拟内存pipe理和懒惰页面分配有关。 (我注意到,将-Xms设置为512M或64M并不会改变Linux上的顶层或Windows上的任务pipe理器报告的最初使用的内存) 有人可以帮我理解这个Xms选项的影响,或者指向我的链接,这将有助于我理解它吗? 提前致谢 马努

Java类文件可以使用保留的关键字作为名称吗?

我知道,Java编译语言不是Java-byte-code-format-for-JVM-execution。 在.class格式中有一些有效的例子,但不在.java源代码中,例如无构造函数的类和合成方法。 如果我们用一个保留的Java语言关键字(例如int , while ) 手工制作一个.class文件作为类,方法或字段名称,Java虚拟机是否会接受它加载? 如果加载类,是否意味着访问此类或成员的唯一方法是通过Javareflection,因为Java编程语言中的名称在语法上是非法的?

Java SE 6的Sun JVM的默认最大堆大小是多less?

Java SE 6的Sun JVM的默认最大堆大小(即相当于设置-Xmx)是多less? 看起来像使用服务器级机器的Java SE 5, 就是这样 较小的物理内存的四分之一或1GB。 奖金问题:看起来像IBM的JVM,你可以问它 java -verbose:sizes -version 你同样可以问Sun的JVM吗? 编辑 : 我使用了Runtime.getRuntime()。maxMemory来确认min(物理内存/ 4,1G),在Sun文档中引用。

64位JVM限于300GB的内存?

我试图在集群计算环境(运行CentOS 6.2版本的IBM LSF)上运行一个Java应用程序,它可以提供高达1TB的RAM空间。 我可以创build一个高达300GB的最大内存(Xmx)的JVM,尽pipe我需要更多(如果需要,我可以提供详细信息)。 但是,使用Xmx选项创build具有超过300GB最大内存的JVM似乎是不可能的。 更具体地说,我得到了经典的错误信息: VM初始化期间发生错误。 无法为对象堆预留足够的空间。 我的(64位)JVM的细节如下: OpenJDK运行时环境(IcedTea6 1.10.6)(rhel-1.43.1.10.6.el6_2-x86_64) OpenJDK 64位服务器虚拟机(内置20.0-b11,混合模式) 我也尝试过使用Java 7 64位JVM,但是我遇到了完全相同的问题。 此外,我试图创build一个JVM来运行HelloWorld.jar,但是如果您要求超过-Xmx300G,仍然会导致JVM创build失败,所以我不认为它与特定的应用程序有任何关系。 有没有人有任何想法,为什么我不能创build超过300G的最大内存的JVM? 任何人都可以请build议一个解决scheme/解决方法?

Android Gradle无法为对象堆预留足够的空间

我已经安装了Android Studio 1.1.0。 我还没有做任何事情,像开始新的Android应用程序或导入任何东西。 不知何故,它试图build立一些东西,并引发同步错误。 错误:无法启动守护进程。 这个问题可能是由于守护进程的configuration不正确造成的。 例如,使用无法识别的jvm选项。 有关守护进程的用户指南章节,请参阅http://gradle.org/docs/2.2.1/userguide/gradle_daemon.html 请阅读以下过程输出以了解更多信息: 虚拟机初始化期间发生错误无法为对象堆预留足够的空间无法创buildJava虚拟机。 我已经在gradle.org/…/gradle_daemon.html检查,但找不到任何帮助我解决问题的东西。 这不是一个内存问题,因为我有8GB的物理内存,没有其他程序运行。