问题内容: 我正在阅读JVM调优,我发现JVM在执行GC时会不断移动对象。但是Java对象之间有相互引用,可以假定它们是作为指针实现的,但是JVM每次移动对象并更新所有引用后,都不可能遍历整个堆。当然,这将永远。那么,如果引用不变,但对象的物理位置却发生变化,它将如何解析引用? 我已经阅读了很多有关JVM的文章,但是从来没有在任何地方解释甚至暗示过它。 [编辑]我的观点是引用是单向的。从指针到指针
问题内容: 我试图使用命令行中的说明这篇文章。 似乎多数民众赞成在(https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly)上可用。 如何在Oracle JDK7和JVM HotSpot中使用这些选项(或类似的选项)? 问题答案: 这些说明适用于Linux(Ubuntu 10.04.4 LTS),但应适用于您的OS。在下载Or
问题内容: 我简要阅读了有关Maxine的信息,这是一个用Java编写的开源JVM实现。这对我来说听起来很圆。如果java要求运行虚拟机,那么如何用Java编写虚拟机本身(VM代码是否需要运行VM的虚拟机,依此类推?)。 编辑 :好的,所以我看到我忽略了Java不必在VM中运行的事实。那如何解释如何用LISP编写LISP编译器呢?还是这完全是一个新问题? 问题答案: 最初,您认为Java需要虚拟机
问题内容: 更新: 这看起来像是内存问题。一个3.8 Gb Hprof文件表明,发生此“阻塞”时,JVM正在对其堆进行转储。我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了实例。我相信他们在堆转储完成之前就关闭了该站点。日志中 没有 错误/异常/问题证据-可能是因为JVM在生成错误消息之前就被杀死了。 最初的问题我们最近遇到了一种情况,该应用程序对最终用户似乎挂起了。在应用程序重新启动
问题内容: 我的问题: 在本地运行的两个或多个JVM实例之间进行通信应该/应该采用哪种方法? 问题的一些描述: 我正在为一个项目开发系统,该项目需要单独的JVM实例以完全将某些任务彼此隔离。 在运行时,“父” JVM将创建期望执行的“子” JVM,然后将结果返回给它(以相对简单的POJO类或结构化XML数据的格式)。这些结果不应使用SysErr / SysOut / SysIn管道进行传输,因为子
问题内容: 我认真研究了Java类加载器。现在,我想编写一个与rt.jar中的类之一具有相同的包名称和类名称的类。例如,我自己编写一个java.lang.String类,以及如何打破父级委托模型以使jvm加载我的java.lang.String而不是rt.jar中的类。 重新编辑 Thx,尝试过。还有↓↓↓ 问题答案: 您可以使用JVM启动时的选项来执行此操作: 代表“前置”。 注意:这不是标准的
问题内容: 我有一个问题:在Java中,我们声明了int,long,double等(原始数据)或非原始(对象数据),未使用默认值初始化,但在运行时它将采用默认值。现在我的问题是哪个分配默认值:java编译器或Java虚拟机(JVM)? 例如: 问题答案: Java中有三种不同类型的声明变量。它们是实例,类和局部变量。 实例变量 实例变量是类的非静态字段,通常简称为字段。 原始数字字段初始化为0。这
问题内容: 是否可以在Java中编写我们自己的标记接口。我正在写类似的代码 那是标记界面吗? 如果有可能,那么我如何让JVM知道该接口是我自己创建的标记器接口? 问题答案: 是的,那是标记界面。您将测试对象是否“实现”它的方法很简单: 对于特定的 类 (而不是对象),您想要 不过,您应该考虑使用注释而不是标记界面。它们并非总是直接替换,但在许多情况下,它们用于相同的目标,并且注释(IMO)更干净。
问题内容: 在编译C 时,您当然会为要编译的目标平台使用编译器。是否有针对JVM的C 编译器(因此,不是使用Java“本机”接口,而是将C ++代码编译为Java字节码)? 问题答案: NestedVM为Java字节码提供二进制转换。这是通过让GCC编译为MIPS二进制文件然后将其转换为Java类文件来完成的。因此,任何用C,C ++,Fortran或GCC支持的任何其他语言编写的应用程序都可以在
问题内容: 我正在具有8个核心CPU和6 GB内存的Linux 64bit上运行应用程序服务器。 服务器必须具有高响应能力。 经过检查,我发现服务器上运行的应用程序会创建大量的短期对象,并且只有大约200〜400 MB的长期对象(只要没有内存泄漏) 阅读http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html之后, 我使
问题内容: 我想在我的JVM上尝试CompressedOops。不,我不知道默认情况下是否可以启用它。我在debian / squeeze上运行此jvm: 有人说它是默认启用的,有人说没有启用: 来自:http : //forums.yourkit.com/viewtopic.php?f=3&t=3185 是的,您是对的,我也选中了它,并且在Java6u21 64位中默认情况下未激活Compres
问题内容: 我可以从命令行检查正在运行的JVM的堆使用情况,我的意思是实际使用情况,而不是Xmx分配的最大数量。 我需要将其作为命令行,因为我无权访问窗口环境,并且我希望基于该值的脚本,该应用程序正在Jetty应用程序服务器中运行 问题答案: 您可以使用jstat,例如: 完整的文档在这里:http : //docs.oracle.com/javase/7/docs/technotes/tools
问题内容: 无论如何,当JVM崩溃时,是否有生成内核/堆转储文件的信息?由于这些文件通常对于查找代码中的错误非常有帮助。 问题答案: 使用以下JVM选项: JVM会将堆的内容转储到指定目录中的文件中。请注意,这仅在引发时发生,因为如果JVM因其他原因而崩溃,则确实不需要转储。 编辑:“布尔选项用-XX:+打开,而用-XX:-关闭。” docs
问题内容: 最近,我对Java中的这种功能感兴趣,因为它具有可变数量的参数。这是一个非常酷的功能。但是我很感兴趣: 如何在运行时级别上实际实现呢?我想到的是,当我们打来电话时: 最后两个参数在内部转换为数组,然后传递给方法。我对此是否正确,或者JVM实际上将堆栈引用插入了字符串,而不仅仅是对数组的引用? 问题答案: 它在编译时级别实现。您的方法被编译为字节码为 相当于 与标志。 和 编译为
问题内容: 我正在学习Java,记得在某个地方读过Java对象,但JVM内部有一些开销,JVM出于虚拟机的管理原因而使用了这些开销。所以我的问题是,有人可以告诉我是否以及如何在HotSpot JVM中获得对象的总大小以及它可能带来的任何开销吗? 问题答案: 您无法直接获得开销。开销量取决于实现方式,并且可以根据多种因素(例如,精确的JVM版本以及您使用的是32位还是64位JVM)而有所不同。 但是