Tag: jvm

是否有任何工具可以检测不再使用的代码/function?

我们有许多应用程序正在运行(考虑所有这些应用程序都在Java平台上运行),我们需要检查最后一个,比如说3个月使用哪些应用程序,以及在这些活动应用程序中,哪些部分/function(以及频率)是还在使用。 那可能吗? 这里的目标是检测不再与业务相关的应用程序或function并删除它们,这样我们最终可以减少维护和监视的代码。 是否有任何工具可以帮助我们实现这一目标? 我们使用敏捷方法,因此当新应用程序投入生产时,它只具有对业务很重要的function,但有时这个应用程序的某些function会过期(出于不同的原因),所以我们希望有一种识别方法那。

由JVM处理`final`

在对这个问题的评论中,我声称在某些情况下final必须得到JVM的尊重。 已经提出了final变量的安全发布 , 静态最终成员的处理也是如此。 但是如何强制执行最终的类和方法并禁止覆盖最终字段呢? 恕我直言,这可以而且必须在上课时间完成。 我的论点是 因为JVM的安全性至关重要,例如String是final ,所以不得加载扩展它的手工制作的类。 同样适用于public final字段。 虽然reflection可以改变它们,但它会在运行时进行检查。 因此,加载时必须拒绝重新分配最终字段的字节码。 但我找不到证据。 我对吗?

使用+符号进行字符串连接

今天我正在阅读Antonio的博客关于toString()的表现 ,还有一段: 曾经被认为是邪恶的昨天(“不要用+ !!!连接字符串”),已经变得很酷和高效! 今天,JVM将+符号编译为字符串构建器(在大多数情况下) 。 所以,不要犹豫,使用它。 现在我很困惑,因为他说今天JVM将+符号编译成字符串构建器(在大多数情况下) ,但我以前从未听过或看到(代码)这样​​的东西。 有人可以举例说明JVM是做什么的,它会在什么条件下发生 ?

在哪里可以找到如何计算java对象大小的证据

我已经搜索了很长时间的java对象的大小,有很多这样的答案,每个人都告诉我java对象的开销大小,以及如何计算出实际大小。 但他们怎么知道呢? 我没有从官方的oracle文件中找到任何证据。 这个结论有什么证据? 或者数据来自一些基于某些实验的猜测? 另一件事。 在官方文件中提到有一种“近似”的方法来衡量对象 – 仪器方式,任何人都可以向我解释什么是’近似’的意思? 什么时候准确,什么时候不准确。 最好有证据。

Hazelcast可防止JVM终止

我们在遗留Java集群应用程序中使用Hazelcast 2.6.2。 当应用程序停止时,JVM不再终止。 它似乎是由Hazelcast线程没有被标记的守护进程引起的。 我没有找到通过Hazelcast API来标记它们守护进程的方法。 是否有推荐的解决方案来阻止Hazelcast阻止JVM终止? 问候

如何使用Java引用使用Java Unsafe释放内存?

Java Unsafe类允许您按如下方式为对象分配内存,但是使用此方法如何释放完成时分配的内存,因为它不提供内存地址… Field f = Unsafe.class.getDeclaredField(“theUnsafe”); //Internal reference f.setAccessible(true); Unsafe unsafe = (Unsafe) f.get(null); //This creates an instance of player class without any initialization Player p = (Player) unsafe.allocateInstance(Player.class); 有没有办法从对象引用访问内存地址,也许默认的hashCode实现返回的整数可以工作,所以你可以做… unsafe.freeMemory(p.hashCode()); 似乎没有一些如何……

Stacktrace与类名中的数字 – 为什么?

当finalizeOperation运行时(在更大的应用程序中生产): public interface OperationFinalizerHook { void onOperationFinalize(Operation operation, Object context); } private final List operationFinalizeHooks = new ArrayList(); … public void finalizeOperation(Object context) { final Operation operation = getOperation(); operationFinalizeHooks.forEach(hook -> hook.onOperationFinalize(operation, context)); } 跟随调用树/堆栈跟踪构建: 11 at com.company.SomeClass.lambda$finalizeOperation$0 (SomeClass.java:51) 12 at com.company.SomeClass$$Lambda$135/2085968933.accept (Unknown source) 13 at java.util.ArrayList.forEach (ArrayList.java:1249) 14 at com.company.SomeClass.finalizeOperation (SomeClass.java:51) 我对第12行感兴趣 – 这个名字来自哪里? […]

JVM是否会内联对象的实例变量和方法?

假设我有一个非常紧凑的内循环,每次迭代访问并改变一个簿记对象,该对象存储有关算法的一些简单数据,并具有操作它的简单逻辑 簿记对象是私有的和最终的,它的所有方法都是私有的,最终的和@inline。 这是一个示例(在Scala语法中): object Frobnicate { private class DataRemaining(val start: Int, val end: Int) { @inline private def nextChunk = …. } def frobnicate { // … val bookkeeper = new DataRemaining(0, 1000) while( bookeeper.hasData ) { val data = bookkeeper.nextChunk // …… } } } JVM是否会将整个DataRemaining对象内联到Frobnicate.frobnicate ? 也就是说,它会将start和end视为局部变量并将nextChunk代码直接内联到frobnicate吗?

Gradle不尊重JDK9中的–add-modules jvm参数

我正在尝试JDK9(9-ea + 143),并且需要设置–add-modules java.xml.bind 。 我试过了: 设置GRADLE_OPTS=”–add-modules java.xml.bind ‘-Dorg.gradle.jvmargs=–add-modules java.xml.bind'” 设置org.gradle.jvmargs=–add-modules java.xml.bind在gradle.properties中org.gradle.jvmargs=–add-modules java.xml.bind 。 将test { jvmArgs ‘–add-modules java.xml.bind’ }到build.gradle 将tasks.withType(Test) { jvmArgs ‘–add-modules java.xml.bind’ }到build.gradle 将tasks.withType(JavaExec) { jvmArgs ‘–add-modules java.xml.bind’ }到build.gradle 测试仍然失败。 我错过了什么? 我在https://github.com/henrik242/gradle-jdk9-test-problem中有一个示例项目 ✨ ./gradlew build :compileJava /foo/gradle-jdk9-test-problem/src/main/java/SomeClass.java:1: error: package javax.xml.bind does not exist import javax.xml.bind.ValidationException; ^ /foo/gradle-jdk9-test-problem/src/main/java/SomeClass.java:5: error: cannot find symbol public […]

年轻的GC导致Metaspace增加,而不是Old Gen

从JDK7迁移到JDK 8时,我开始看到频繁的Full GC(具有更高的GC延迟)。 在分析了gc之后,发现在年轻的GC之后,元空间的使用增加了,而旧的使用率仍然相同。 我已将最大元空间大小(等于JDK7中的Perm Gen)设置为256MB。 当使用率达到210 MB左右时,将触发完整的GC。 我已经尝试将元空间最大大小设置为512MB,然后我也看到Metaspace Threshold导致Full GC。 为什么Young GC会导致元空间大小增长? JDK8引发了GC延迟。 使用JDK7,GC延迟通常低于100毫秒,而使用JDK8的全GC启动时间为800-1000毫秒。 这会影响我的应用程序性能。 我正在使用并行GC算法。 我怀疑在metaspace上的GC比Old gen GC要耗费更多时间。 有关为JDK8调优JVM的任何建议都将非常有用。 年轻的GC: S0 S1 EOM CCS YGC GCT FGC FGCT GCT LGCC GCC 0.00 40.28 99.78 21.95 56.28 – 149 6.647 2 3.276 9.924 Allocation Failure No GC 54.17 0.00 0.66 21.95 57.63 – 150 […]