Tag: jvm

如何在没有引用的情况下访问Java堆对象?

我想获得对Java堆中所有对象的引用,即使我没有立即在活动线程中引用这些对象。 我不需要非引用的对象(那些“排队”用于垃圾收集),但是想要得到任何仍在使用的对象。 目标是序列化和存储所有对象,以实现穷人的执行状态持久性。 我意识到兔子洞在涉及不同类型的瞬态时会变深,但简单地持久化对象和加载的类定义对我来说会很有用。 有没有办法访问堆才能实现这一目标? 我是否会忽视更直接的方法?

Java类:匿名vs嵌套vs私有

有人可以解释Java中的匿名类,嵌套类和私有类之间的区别吗? 我想知道与每个相关的运行时成本以及每个的编译器方法,因此我可以掌握哪个最好用于例如性能(编译器优化的可能性),内存使用以及与其他Java的一般可接受性编码器。 匿名类我的意思是那些以奇怪的Java方式在函数中声明内联的类。 这通常出现在Swing代码的示例中,您可以使用它的声明内联编写一个按钮处理程序。 我真的不喜欢匿名类,因为你得到那些有趣的MyClass $ 1.class文件,而且当你发现想要让匿名类成为单例或需要处理它时,你将不得不重构。一些东西。 我也不喜欢你在另一个函数调用的中间以你刚刚编写的东西forms附加处理程序的方式。 这让我觉得很奇怪。 🙂 私有类是您在公共类声明之外完全写入文件底部的类。 我更喜欢私有类,因为它们在源文件和类之间没有强大的1:1关系的其他语言中是有意义的。 我没有那种奇怪的感觉,我知道(或者我认为我知道)Java编译器将如何处理该类的声明。 嵌套类是在公共类的波形内写的。 我真的不知道嵌套类与其他两个相比意味着什么。 🙂

将JVM字节码往返的文本表示和返回的故障安全方法

我正在寻找一种故障安全的方法来在JVM类文件和文本表示之间往返,然后再返回。 一个严格的要求是,只要文本表示保持不变,生成的往返JVM类文件在function上与原始JVM类文件完全等效。 此外,文本表示必须是人类可读和可编辑的。 应该可以对文本表示进行小的更改(例如更改文本字符串或类名等),这些更改会反映在生成的类文件表示中。 最简单的解决方案是使用Java反编译器(如JAD)生成文本表示,在这种情况下,它只是重新创建的Java源代码。 然后使用javac生成字节码。 但是,鉴于免费Java反编译器的状态,这种方法在所有情况下都不起作用。 创建混淆的字节代码相当容易,这些字节代码不能在完整的往返类文件/ java-source / class-file中存活(部分原因是因为JVM字节代码之间没有1:1的映射) Java源代码)。 根据上述要求,是否存在实现JVM类文件/文本表示/类文件往返的故障安全方法? 更新:在回答之前 – 通过阅读上述所有要求节省时间和精力,并具体说明: “JVM字节码的文本表示”并不一定意味着“Java源代码”。

java.lang.OutOfMemoryError:为ChunkPool :: allocate请求了32756个字节。 交换空间?

我正在使用通过WebLogic 10.3部署在HP服务器上的Java应用程序。 版本信息: WebLogic Version 10.3 OS Version B.11.23 $ java -version java version “1.6.0.03” Java(TM) SE Runtime Environment (build 1.6.0.03-jinteg_05_feb_2009_11_19-b00) Java HotSpot(TM) Server VM (build 11.0-b16-jre1.6.0.03-rc2, mixed mode) 我收到此java.lang.OutOfMemoryError并且weblogic托管服务器正在关闭。 它总是在编译器线程上。 错误消息表示检查swap和MAXDSIZ。 我看着他们两个,他们似乎没问题(见下文)。我已经通过论坛,看了很多东西,但似乎没有完全适用。 我已经改变了堆并上下堆叠而没有运气。 此外,我很确定这是惠普应用程序的第一个1.6端口。 # kctune -a -v -q maxdsiz Tunable maxdsiz Description Maximum size of the data segment of a 32-bit process (bytes) […]

Java:输入/使用“try-catch”块的开销?

这个问题说明了一切。 虽然命中率不是很高(我测量它的速度在1.5x到2x之间),但是try-catch的字节代码与没有try-catch的字节代码之间没有区别。 那么是什么让它通常变慢? PL。 请注意,问题不在于抛出exception的开销,而在于进入/离开try块。 编辑:这是代码(在Hotspot 1.6.0_31服务器上运行) static void tryCatch() { int i = 0; long l1 = getTime(); for(int j = 0; j < 100000; j++) { try { i++; } catch(Exception e) { } } long l2 = getTime(); System.out.println("with try-catch: " + (l2 – l1) + ": " + i); } static […]

JVM垃圾收集应用程序停止时间差异

我正在使用以下版本的java运行tomcat的大型实例: java版“1.6.0_20” OpenJDK运行时环境(IcedTea6 1.9.7)(6b20-1.9.7-0ubuntu1~10.04.1 OpenJDK 64位服务器VM(内置19.0-b09,混合模式) 并使用以下参数设置: -Xms13152m -Xmx13152m -Xmn768m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:+DisableExplicitGC 启用GC调试语句。 每隔几个小时我就会看到发生次要GC并且应用程序停止很长时间的行为,但GC本身似乎没有花费那么多时间: {Heap before GC invocations=392 (full 74): par new generation total 707840K, used 698252K [0x00000004bfa00000, 0x00000004efa00000, 0x00000004efa00000) eden space 629248K, 99% used [0x00000004bfa00000, 0x00000004e607de48, 0x00000004e6080000) from space 78592K, 87% used [0x00000004ead40000, 0x00000004ef0a5370, 0x00000004efa00000) to space 78592K, 0% […]

为什么JVM不从数据库加载类?

为什么Java虚拟机没有从数据库加载类(类似于.NET的GAC)? 据我了解,目前它必须在类路径上读取和扫描每个JAR的清单,以便找到类文件。 不会使用数据库(如SQLite)来提升启动时间吗?

有没有办法告诉JVM在处理之前优化我的代码?

我有一个方法,第一次执行需要很长时间。 但经过几次调用后,时间缩短了大约30倍。 因此,为了使我的应用程序更快地响应用户交互,我使用一些关于应用程序初始化的示例数据“预热”此方法(5次)。 但这会增加应用启动时间。 我读过,JVM可以优化并编译我的java代码到本机,从而加快速度。 我想知道 – 也许有一些方法可以明确告诉JVM我希望在启动应用程序时编译这个方法?

使用VM命令行在执行期间查找最大分配堆大小?

我想知道我是否可以使用VM命令行获取已allocated heap的最大大小。 从现在起我可以使用Netbeans Profiler获得它,但我更喜欢获得结果,而无需启动额外的应用程序。 我也在使用这种方法: public void printMemUsage(){ double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024.0)))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024.0))); System.out.println(“Current memory usage in kilobytes :”+currentMemory); } 我想我也可以使用它来获得最大堆大小,但我不确定它是否非常可靠。 我目前使用这些命令行: -verbose:gc -XX:+ PrintGCDetails -XX:+ PrintGCApplicationConcurrentTime -XX:+ PrintGCApplicationStoppedTime 为了获得有关gc活动,年轻一代,老年人和永久性人的良好信息。 但是我可以在收集发生时告诉当前的总堆空间。 那么有没有办法获得使用其他命令行分配的最大堆空间?

在JVM中优化Xms / Xmx / XX:MaxPermSize

获得Xms/Xmx/XX:MaxPermSize优化值的必要步骤是什么Xms/Xmx/XX:MaxPermSize ? 当然我可以设置一个很大的值但是你知道GC需要花费大量时间。 当我可以节省时间进行测试并找到这些价值时 , 一般建议是什么? 例如,以下数字是否有帮助? Eden Space heap usage – 42MB / 62MB (used / committed) Survivor Space heap usage – 8.5MB / 8.5MB (used / committed) CMS Old Gen heap usage – 100MB / 217MB (used / committed) Non-heap memory pool usage – 36MB