Tag: jvm

Java JVM分析,线程状态 – “Monitor”状态是什么意思?

我用visualVM连接一个multithreading的Java应用程序,线程有4个状态,分别是running,sleeping,wait,monitor。 这个监测状态是什么意思? 等待和监视器有什么区别?

一个简单的“Hello World”需要64位机器上的10G虚拟内存与32位上的1G虚拟内存?

在我们的生产机器上运行一个简单的Java程序,我注意到这个程序吃了更多的10G virt。 我知道虚拟内存是不相关的,但至less我想明白为什么这是必要的。 public class Main { public static void main(String[] args) { System.out.println("Hello World!"); try { Thread.sleep(10000); } catch(InterruptedException e) { /* ignored */ } } } 下面是什么当我运行这个小程序时说的: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 18764 myuser 20 0 10.2g 20m 8128 S 1.7 0.1 0:00.05 java 有谁知道这是为什么发生? uname […]

Java:<init>和<clinit>有什么区别?

我无法理解下面的文本…是否意味着<clinit>是空的构造函数? 为什么重要的是有两个不同的版本? https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html 2.9. Special Methods 在Java虚拟机的层面上,每个构造函数(§2.12)都作为一个具有特殊名称<init>的实例初始化方法出现。 这个名字是由编译器提供的。 由于名称<init>不是有效的标识符,因此不能直接在用Java编程语言编写的程序中使用。 实例初始化方法只能在invokespecial指令的Java虚拟机中调用,并且只能在未初始化的类实例上调用它们。 一个实例初始化方法承担了派生它的构造函数的访问权限(第2.7.4节)。 一个类或接口至多有一个类或接口的初始化方法,并通过调用该方法初始化(§2.17.4)。 类或接口的初始化方法是静态的,不需要参数。 它有一个特殊的名字<clinit> 。 这个名字是由编译器提供的。 由于名称<clinit>不是有效的标识符,因此不能直接在用Java编程语言编写的程序中使用。 类和接口初始化方法由Java虚拟机隐式调用; 它们不会直接从任何Java虚拟机inw2tru中调用,而只是间接作为类初始化过程的一部分被调用。

什么是ReservedCodeCacheSize和InitialCodeCacheSize?

有人可以请解释什么JVM选项ReservedCodeCacheSize和InitialCodeCacheSize是什么? 具体何时/为什么要改变它? 我如何确定合适的尺寸是多less? 这是文档所说的: -XX:ReservedCodeCacheSize = 32m预留代码caching大小(以字节为单位) – 最大代码caching大小。 [Solaris 64位,amd64和-server x86:2048m; 在1.5.0_06及更早版本中,Solaris 64位和64位:1024m。]

安装Android Studio时,不会指向有效的JVM安装错误

我刚刚下载了Android Studio。 当试图运行它时,我不得不修改环境variables并添加 JAVA_HOME 和 C:\ PROGRA〜2 \的Java \ jdk1.6.0_22 一旦我完成了这个障碍,现在我收到另一个错误: The environment variable JAVA_HOME (with the value of *C:\Progra~2\Java\jdk1.6.0_22*) does not point to a valid JVM installation. 我看了其他类似的问题,我被要求检查版本,所以我做了以下CMD: C:\Users\Andre>java -version java version "1.6.0_22" Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing) C:\Users\Andre>javac -version javac 1.6.0_22 从结果看来,我似乎有JVM。 我也为JAVA_HOME尝试了这些path,每次closures并重新打开一个新的CMD窗口 […]

这是一个JVM的错误或“预期的行为”?

我注意到一些意想不到的行为(与我个人的期望相关),我想知道如果JVM中有一个错误,或者这是一个附带案例,我不明白什么是什么细节应该会发生。 假设我们在主要方法中有以下代码: int i; int count = 0; for(i=0; i < Integer.MAX_VALUE; i+=2){ count++; } System.out.println(i++); 一个天真的期望是,这将打印Integer.MAX_VALUE-1 ,最大的偶数可表示的int 。 不过,我相信整数算术应该在Java中“滚动”,所以将1加到Integer.MAX_VALUE应该导致Integer.MIN_VALUE 。 由于Integer.MIN_VALUE仍然小于Integer.MAX_VALUE ,所以循环会持续迭代负整数。 最终它会回到0,这个过程应该重复为一个无限循环。 当我真的运行这个代码时,我得到了非确定性的结果。 打印的结果往往是五十万的数量级,但确切的数值是变化的。 所以当我相信它应该是一个无限循环时,不仅循环终止,而且似乎随机终止。 这是怎么回事? 我的猜测是,这是JVM中的一个错误,或者有很多时髦的优化,使得这种预期的行为。 这是哪个?

-XX:UseParallelGC和-XX之间的区别:+ UseParNewGC

他们是年轻一代垃圾收集的algorithm。 第二个(UseParNewGC)通过并发生成的垃圾收集(请参见Java并发和并行GC )自动激活,但两种并行algorithm之间是否有区别?

CATALINA_OPTS vs JAVA_OPTS – 有什么区别?

我试图找出Apache Tomcatvariables – CATALINA_OPTS和JAVA_OPTS之间的差异,并惊讶地发现这里没有问题/答案。 所以我想在找出差异之后在这里分享(回答)。 检查下面的答案/差异。 注意:在本文发布时,我们在CentOS5 64位版本上运行带有JDK 6u32的Apache Tomcat v6.0.10。

如何从程序中findJVM版本?

我想写一个示例Java文件,我想知道该类正在运行的JVM版本。 有没有办法?

使用debugging参数debuggingJava应用程序而不启动JVM

通常要将debuger附加到正在运行的jvm上,您需要使用以下参数启动jvm: > java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n 现在,如果我想debugging一个在debugging模式下未启动的进程,我该怎么办? 当一个生产系统(即没有debugging参数的情况下启动)呈现出一个“随机”(我使用术语松散)错误时,这种情况就出现了。 所以我不能用适当的参数重新启动jvm,因为没有人知道如何重现错误。 在这种情况下,不能附加到JVM吗? 只是澄清它是不可能使用像jdb这样的工具附加到已经运行的JVM,除非它们是以debugging模式启动的 从JVM手册页 另一种使用jdb的方法是将其附加到已经运行的Java VM上。 要用jdbdebugging的虚拟机必须使用以下选项启动: