Tag: jvm

对字节码和对象的澄清

我正在写一个字节码指导员。 现在,我试图找出在对象存在的情况下如何做到这一点。 我想对我在JVMS中阅读的两行(第4.9.4节)做一些澄清: 1)“validation者在初始化之前拒绝使用新对象的代码。” 我的问题是,“使用”在这里意味着什么? 我猜这意味着:将它作为方法属性传递,在其上调用GETFIELD和PUTFIELD ,或者调用它上面的任何实例方法。 他们的其他禁止用途? 我相信它可以遵循其他指令,如DUP , LOAD和STORE 。 2)“在该方法调用myClass的另一个实例初始化方法或其直接超类之前,该方法可以对此执行的唯一操作是分配在myClass中声明的字段。” 这意味着在方法中,在调用另一个之前允许GETFIELD和PUTFIELD。 但是,在Java中,在调用super()或this()之前对实例字段执行任何操作都会导致编译错误。 有人可以澄清一下吗? 3)我还有一个问题。 对象引用何时初始化,因此可以自由使用? 通过阅读JVMS,我想出了一个对象是否被初始化的答案,取决于每种方法。 在某个时间点,可以为方法初始化对象,但不能为另一个方法初始化对象。 具体来说,当该方法调用的返回时,对象的方法被初始化。 例如,考虑main()方法创建了一个对象并调用了 ,然后调用了超类的 。 从super()返回后,该对象现在被认为是由初始化的,但尚未为main()初始化。 这是否意味着,在super()之后的 ,我可以将对象作为参数传递给方法,甚至在返回到main()之前。 有人可以证实这整个分析是真的吗? 感谢您的时间。 ps:我实际上已经向Sun论坛发布了相同的问题,但回复。 我希望我能在这里有更多的运气。 谢谢。 更新 首先感谢您的答案和时间。 虽然我没有得到一个明确的答案(我有很多问题,其中一些有点模糊),但你的答案和例子,以及随后的实验,对于我更深入地了解JVM如何工作非常有用。 我发现的主要问题是Verifier的行为因不同的实现和版本而不同(这使得字节码操作的工作变得更加复杂)。 问题在于不符合JVMS,或者validation者的开发人员缺乏文档,或者JVMS在validation者的区域中有一些微妙的模糊性。 最后一件事,SO Rocks !!! 我在官方的Sun JVM规范论坛上发布了同样的问题,直到现在我仍然没有回答。

执行GC后,为什么分配的永久代的大小会增加?

以下是我从jvisualvm 执行GC后拍摄的快照。 和 第一张图片是Heap stats,第二张图片是perm gen stats。 我无法理解我何时使用 GC 使用堆大小减少(如预期的那样)但是永久代的分配大小增加(尽管使用的permgen大小保持不变)。 What could be the possible explanation of such behavior? 使用JVM参数 -Xbootclasspath/p:../xyz.jar -Xbootclasspath/a:../abc.jar -Djava.endorsed.dirs=../resolver -Djava.library.path=../framework -Djavax.management.builder.initial=JBeanServerBuilder -Djavax.net.ssl.trustStore=../certs -Dorg.mortbay.log.class=JettyLogger -Xms128m -Xmx256m -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=2000 注意:出于正当原因,我更改了名称(ex xyz.jar)。 JVm信息: JVM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04, mixed mode) Java: version 1.7.0_11, vendor Oracle Corporation Java Home: /home/aniket/jdk1.7.0_11/jre JVM Flags:

是否吞噬了UncaughtExceptionHandler中抛出的错误?

Thread.UncaughtExceptionHandler声明当处理未捕获的exception的方法本身抛出exception时,该exception将被忽略: void uncaughtException (Thread t,Throwable e): 当给定线程由于给定的未捕获exception而终止时调用的方法。 Java虚拟机将忽略此方法抛出的任何exception。 但是当我测试它时,JVM没有忽略未捕获的exception处理程序处理的exception: public static void main(final String args[]) { Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread arg0, Throwable arg1) { throw new java.lang.RuntimeException(“e2”); } }); throw new RuntimeException(“e1”); } Eclipse控制台输出(JRE 1.7): exception:从线程“main”中的UncaughtExceptionHandler抛出java.lang.RuntimeException 我发现的另一个奇怪的是我得到的输出不是来自System.err 。 它似乎完全来自另一个流。 我通过将System.err重定向到System.out来validation这一点,但我仍然得到“红色”输出: public static void main(final String[] args) { System.setErr(System.out); System.out.println(System.err == System.out); System.err.println(“this […]

通过-Xmx分配更多内存时,Sun JVM是否会变慢?

当更多内存可用并通过-Xmx使用时,Sun JVM是否会变慢? (假设:机器有足够的物理内存,因此虚拟内存交换不是问题。) 我问,因为我的生产服务器要接收内存升级。 我想把-Xmx值提升到颓废的东西。 我的想法是防止由于我自己的编程错误而不时出现任何堆空间耗尽故障。 罕见的事件,但如果我有一个淫秽-Xmx值,如2048mb或更高,我可以通过快速发展的webapp避免它们。 应用程序受到严密监控,因此会注意到JVM内存消耗的exception峰值并修复任何缺陷。 可能的重要细节: Java 6(以64位模式运行) 4核Xeon RHEL4 64位 spring,Hibernate 高磁盘和网络IO 编辑 :我试图避免发布我的JVM的配置,但显然这使得问题可笑地开放结束。 所以,这里我们使用相关的配置参数: -Xms256m -Xmx1024m -XX:+UseConcMarkSweepGC -XX:+AlwaysActAsServerClassMachine -XX:MaxGCPauseMillis=1000 -XX:MaxGCMinorPauseMillis=1000 -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError

-Djava.library.path中的多个目录

我如何在eclipse项目中指向两个不同的java.library.path – 运行配置? 我需要这两个库: -Djava.library.path=/opt/hdf-java/build/bin -Djava.library.path=/opt/opencv-2.4.10/build/lib 问候。

在Java中推断方法的堆栈内存使用

我正在尝试确定每个方法在运行时消耗的堆栈内存量。 为了完成这项任务,我设计了这个简单的程序,只强制StackOverflowError , public class Main { private static int i = 0; public static void main(String[] args) { try { m(); } catch (StackOverflowError e) { System.err.println(i); } } private static void m() { ++i; m(); } } 打印一个整数,告诉我m()被调用了多少次。 我手动将JVM的堆栈大小( -Xss VM参数)设置为不同的值(128k,256k,384k),获得以下值: stack i delta 128 1102 256 2723 1621 384 4367 1644 delta由我计算,它是最后一行i和当前行之间的值。 […]

Intellij Idea使用什么JVM启动?

我是最近决定尝试Intellij Idea的Eclipse用户。 我的操作系统是Ubuntu 12。 使用Eclipse,可以通过在eclipse.ini(http://wiki.eclipse.org/Eclipse.ini#Specifying_the_JVM)中指定它来轻松选择用于启动Eclipse的JVM。 但我无法为Intellij Idea 12找到这样的东西。 因此,我有两个问题: Intellij Idea如何确定用于启动自身的JVM? 有没有办法覆盖这种默认行为? 谢谢。

-Xss和-XX有什么区别:ThreadStackSize?

我只想控制Java(groovy)应用程序中所有线程的堆栈大小。 对于Hotspot Oracle VM,我知道有两个参数可以做到这一点( -Xss和XX:ThreadStackSize )。 哪个是首选? 它们之间有什么区别吗? 关于Open JDK 7, 有人在邮件列表上询问 ,说明-Xss对于Hotpot VM来说与-XX:ThreadStackSize 。 关键是,我正在测量可以在我的系统上启动多少个线程。 我的groovy脚本执行此操作看起来像: int count = 0 def printCountThreads = { println(“XXX There were started $count threads.”) } try { while(true){ new Thread({Thread.sleep(Integer.MAX_VALUE)}).start() count++ if(count % 1000 == 0){ printCountThreads() } } } catch (Throwable e){ printCountThreads() throw e } 有趣的是,我只使用XX:ThreadStackSize来减少线程数量。 […]

如果只有一个完全限定的名称,如何获取java类的二进制名称?

reflection类和方法以及类加载器等需要使用所谓的“二进制”类名。 问题是,如果一个人只有一个完全限定的名称,即一个人在源代码中使用的名称,那么如何获得二进制名称。 例如: package frege; public static class RT { …. public static class X { …. } } 该类的完全限定名称为frege.RT.X 。 然而,要获得类对象,需要编写: Class.forName(“frege.RT$X”) 并不是 Class.forName(“frege.RT.X”) // fails with ClassNotFoundException 因为X恰好是frege.RT的内部类。 一种可能但又笨拙的解决方案是替换. 使用$来自后退,一个接一个,直到Class.forName()不再抛出ClassNotFoundException或者没有更多. 取代。 有没有更好/众所周知/标准的解决方案? 我查看了API文档中的Class , CLassLoader和java.lang.reflect但没有找到任何可用的东西。

Java:方法挂钩和查找对象实例

情况 嗨,我有2个问题。 情况是我正在为Windows编写Java API ,它还提供了将代码注入进程然后操作目标的工具。 我已经实现了注射部件 ,例如将一个jar子注入另一个jar子里。 此时我的jar被调用(目标已经在运行时),并在完整的静态上下文中启动。 目标和问题 从这里我有两个目标: 我想与目标对象进行交互 ,因此我需要引用 。 对于许多对象,这已经成为可能,因为它们提供对其实例的静态访问。 例如, awt.Frames #getFrames()提供对所有创建的Frame对象的访问。 但如果有可能访问堆上的任意对象 ,那将是非常棒的。 像’ Heap#getAllObjectInstances() ‘之类的东西。 给定一个对象实例,我想连接到这个对象的任意函数 。 例如,每当调用BufferStrategy#show()时,我希望它首先调用另一个方法。 所以我总结了以下问题: 如何从静态上下文中获取任意对象引用? 如何连接到任意函数? 备注 到目前为止我所做的,评论和想法: JDI (Java调试器接口)通过VirtualMachine#allClasses() – > ReferenceType#instances(0)提供这样的方法。 但是JDI需要使用额外的调试参数来启动目标JVM ,这对我来说是没有选择的 。 可以使用内存工具进行低级分析并分析堆,但我希望有人知道更高级的方法 。 使用Windows API对我来说是一个选项,因为我熟悉JNA / JNI ,但我不知道这样的工具。 最后一种方法是使用IAT挂钩 C-Code,这是一种非常低级的方法,我想避免这种情况 。 我可以假设此时有一个对象引用,也许Reflection API提供了一种更改对象方​​法的方法? 或者至少简单地提供挂钩机制? 请注意,更改目标代码当然不适合我。 并且它已经在运行时,因此ByteCode-Manipulation也可以是一个选项。 脚本 这会派上用场: […]