在interwebs上有各种各样的文章,试图在实践中估计特定JVM实现中java.lang.Object的开销。 例如,我已经看到在一些JVM中, 估计为8字节的裸Object的大小开销。 我想知道的是, extends关系的典型JVM实现是否在类层次结构的每个级别引入了增量大小开销。 换句话说,假设你有一个具有N级子类的类层次结构。 O(1)或O(N)类的内存表示的开销是多less? 我想这是O(1),因为虽然一些隐藏的蓬松的东西的大小,你需要是一个Java Object (Vtable,类的链)将随着inheritance层次增长而增长,他们增长每类,实例,并且JVM实现可以在连接到每个Object的常量大小头中存储指向这些实体的常量大小的指针。 所以从理论上讲,任何Java对象的内存表示直接附加的开销应该是O(1)的inheritance深度N.有谁知道在实践中是否是真的?
我读过Neal Gafter的博客,关于这个问题我还不清楚。 为什么不能创buildCollections API的实现来保存给定Java的当前状态,JVM和现有集合API的types信息? 在未来的Java版本中,这些替代现有的实现是否能够保留向后兼容性? 举个例子: List<T> list = REIList<T>(T.Class); REIList是这样的: public REIList<T>() implements List { private Object o; private Class klass; public REIList(Object o) { this.o = o; klass = o.getClass(); } … the rest of the list implementation … 这些方法使用Object o和Class klass来获取types信息。 为什么要保留generics类信息需要更改语言,而不仅仅是JVM实现的变化? 我不了解什么?
我知道你可以在Dalvik的虚拟机中运行几乎所有的Java,但是这个限制并不是很清楚。 有没有人遇到任何主要的绊脚石? 任何大型图书馆都有麻烦? 任何编译为Java字节码( Scala , Jython等)的语言都不能按预期工作?
我知道如何用java代理启动java程序: java -javaagent:myAgent.jar MyJavaProgram 但是,如果我想添加2个或更多的Java代理来testing我的程序呢? 我不想重新激活java -javaagent:…对于每个必须在JVM中加载的代理。 我试过这样的事情: java -javaagent:agentA.jar, agentB.jar MyJavaProgram 或者像这样的东西: java -javaagent:agentA.jar agentB.jar MyJavaProgram 但是没有成功。 有没有解决我的问题的答案? 谢谢。
垃圾收集的根源是什么? 我已经把root的定义看作“你程序可以访问的任何引用”,live的定义就是一个正在使用的对象,它可以是一个局部variables,静态variables。 我有点混淆区分根和活的物体之间的差异。 什么是根path? 根和活物体如何工作? 有人可以详细说明吗?
我认为在_JAVA_OPTIONS和JAVA_TOOL_OPTIONS之间进行比较会很好。 我一直在寻找一个,但我找不到任何东西,所以我希望我们可以在这里findStackoverflow的知识。 包含JAVA_OPTS的完整性。 它不是JVM的一部分,但是有很多关于它的问题。 我知道的: 到目前为止,我已经发现: JDK不使用JAVA_OPTS ,而是使用其他一些应用程序(请参见本文 )。 JAVA_TOOL_OPTIONS和_JAVA_OPTIONS是将JVM参数指定为环境variables而不是命令行参数的方法。 至less被java和javac拾取 他们有这个优先权: _JAVA_OPTIONS (覆盖其他) 命令行参数 JAVA_TOOL_OPTIONS (被其他人覆盖) 我想知道的 有没有比较JAVA_TOOL_OPTIONS和_JAVA_OPTIONS官方文档 JAVA_TOOL_OPTIONS和_JAVA_OPTIONS之间是否有其他区别(优先级除外)? 哪个可执行文件JAVA_TOOL_OPTIONS和_JAVA_OPTIONS (除了java和javac ) 对JAVA_TOOL_OPTIONS和_JAVA_OPTIONS可以包含什么限制 正式文件 我一直无法find关于_JAVA_OPTIONS任何文档。 JAVA_TOOL_OPTIONS的文档并没有说明差别: 由于不能总是访问或修改命令行,例如在embedded式VM中或者在脚本内部深入启动的VM中,会提供JAVA_TOOL_OPTIONSvariables,以便在这些情况下启动代理。 … 示例脚本 这是我用来解决这个问题的代码。 控制台输出包含在注释中: export JAVA_OPTS=foobar export JAVA_TOOL_OPTIONS= export _JAVA_OPTIONS="-Xmx512m -Xms64m" java -version # Picked up JAVA_TOOL_OPTIONS: # Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m # java version "1.7.0_40" […]
我在Java中得到这个exception: java.io.FileNotFoundException: (Too many open files) 我正在寻找方法来消除这个问题。 这个错误显然表明JVM已经分配了太多的句柄,底层操作系统不会让它有更多的。 要么是因为不正确的closures连接/stream而导致泄漏。 这个过程不停地运行几天,最终抛出exception。 它在正常运行的12-14天之后重复发生。 你怎么打这个? 有没有办法在JVM中获取分配的句柄列表,或者当它达到一定数量时跟踪? 我很乐意让他们印刷,看看它是如何增长和什么时候。 我不能使用分析器,因为它是一个生产系统,在开发过程中难以重现。 任何build议? 我正在监视自由堆栈大小,并在接近-Xmx中指定总数的1%时发出“警报”。 我也知道,如果我的线程数超过500,那么肯定会失去一些东西。 现在, 有没有办法知道我的JVM从操作系统分配了太多的句柄 ,并且不会让它们回来,例如套接字,打开的文件等等。如果我知道,我就知道在哪里看什么时候。
我有一个关于JVM的基本问题:是编译器还是解释器? 如果它是一个解释器,那么JVM中存在的JIT编译器呢? 如果两者都不,那么究竟是什么JVM? (我不希望将字节码转换为机器特定代码的jVM的基本定义等)
我想知道是否使用break语句退出循环而不是执行循环条件是一个“不好的做法”? 我没有足够的了解Java和JVM知道如何处理循环,所以我想知道如果我这样做是忽略了一些重要的东西。 这个问题的重点是:是否有一个特定的性能开销?
我正在阅读这篇关于JVM如何调用方法的文章 ,而且我想我得到了大部分。 但是,我仍然无法理解对invokeinterface的需求。 我理解的方式是,一个类基本上有一个虚拟表的方法,当用invokeinterface或invokeinterface调用一个方法时,这个虚拟表被查阅。 然后,在接口上定义的方法和在基类上定义的方法之间有什么区别? 为什么不同的字节码? 说明的描述也看起来非常相似。 文章似乎声称每次调用方法时,接口的方法表都可以有“不同的偏移量”。 我不明白为什么一个接口将有一个方法表,因为没有对象可以将接口作为它的实际types。 我错过了什么?