Tag: jvm

如何在现代JVM实现中实现instanceof?

由于在其他线程中完成了基准测试(参见https://stackoverflow.com/a/397617/1408611 ),因此可以看出Java 6中的instanceof实际上非常快。 这是如何实现的? 我知道对于单inheritance,最快的想法是有一些嵌套的间隔编码,其中每个类维持一个[低,高]间隔,而instanceof只是一个区间包含测试,即2个整数比较。 但它是如何制作接口的(因为区间包含仅适用于单inheritance)? 如何处理类加载? 加载新的子类意味着必须调整很多间隔。

java.util.date bug?

java.util.Date有错误吗? 在进行一些测试时,我将毫秒设置为2147483647,这应该给我一个2038-01-19 03:14:07的日期,但它返回1970-01-25 20:31:23。 也尝试了4294967295并得到1970-02-19 17:02:47的错误答案。 有谁知道一个工作 import java.util.*; import java.io.*; /* centos 6.3 x64 java version “1.7.0_13” Java(TM) SE Runtime Environment (build 1.7.0_13-b20) Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode) */ public class Test { static public void main(String args[]) { long ms = 2147483647L; java.util.Date d = new java.util.Date( ms ); […]

在Java中激活其他进程的窗口

我有两个Java swing应用程序(意味着在两个JVM中运行)。 有没有办法在它们之间切换? 通过Java代码激活另一个应用程序的窗口?

从Java运行程序或转储中获取死锁检测

我有一个运行的java软件被卡住了。 我想在里面看到一个视图,但不知道该怎么做。 是否有一些工具可以给出一个PID,它会告诉我每个线程当前位于何处以及可能还有一些变量值? 我正在运行linux。 我或多或少知道导致问题的原因,但仍有一些可能的情况,因此确定它会很好。 我无法重现错误,因为它每隔几天才会出现,并且在调试时从未出现过,所以这是了解敌人的独特变化。 有任何想法吗?

Java字节码是否与不同版本的Java兼容?

如果我使用Java 5代码将应用程序编译成字节码, 那么生成的.class文件是否能够在Java 1.4下运行? 如果后者可以工作,我正在尝试在我的Java 1.4应用程序中使用Java 5框架,那么我应该注意什么?

JCMD的代码/内部部分包含哪些内容?

为基于JVM的服务标注docker容器的方法很棘手(众所周知)。 我很确定我们对容器的尺寸略微不足,并希望清除我在监控时看到的与特定jcmd(本机内存跟踪器)输出相关的一些问题。 问题: 是否由jcmd报告的“内部”包含直接字节缓冲区? 除了jcmd报告的“代码”之外还有什么代码缓存? 是否有一种很好的方法来限制jcmd报告的“代码”部分。 我阅读了https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm,但这仅涵盖了代码缓存限制,建议保持JVM默认不变。 JCMD输出在这里。 直接字节缓冲区 JMX属性在这里。 一些背景细节: 设置: 基于Spring引导的应用程序 JVM选项: -server -Xms1792m -Xmx1792m -XX:MetaspaceSize = 128M – XX:MaxMetaspaceSize = 192M -XX:+ UseG1GC -XX:+ UseStringDeduplication – XX:MaxDirectMemorySize = 256m -XX:NativeMemoryTracking = detail Docker容器2500MiB在AWS / EC2中运行

JVM GC问题

在过去的几周里,我一直在为Glassfish服务器测试不同的JVM设置。 堆(以及其他)的主要设置是:-Xms512m,-Xmx512m,-XX:NewRatio = 2。 我尝试了不同的GC设置,但是在启动服务器几天后我仍然遇到长时间暂停的问题。 我发现以下情况: 1. -XX:+ UseParallelGC -XX:+ UseParallelOldGC – 每分钟都会发生次要GC,主要GC每18小时发生一次。 我对次要GC没有任何问题,但5天后主要GC出现问题。 起初主要的GC停顿持续约100-200ms,但最后一次停顿持续70秒。 2. -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC – 与上面几乎相同。 次要GC很好,但主要的GC(不完整)停顿时间很长。 我注意到GC(CMS Final Remark)阶段的高级卸载问题已经停止了世界阶段。 3. -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC和-XX:MaxGCPauseMillis = 5000。 我只测试了一天,因为第二个主要的GC最后(不完整)已经持续了大约20秒,所以我认为还有其他错误。 4. -XX:+ UseG1GC,-XX:MaxGCPauseMillis = 5000,-XX:+ UseStringDeduplication,不带-XX:NewRatio = 2选项 – 主要GC(未满)每12小时发生一次,我已经注意到了一些问题: 2015-05-31T18:25:25.145+0200: 83383.897: [GC concurrent-mark-start] 2015-05-31T18:25:35.563+0200: 83394.312: [GC concurrent-mark-end, 10.4145795 secs] 2015-05-31T18:25:35.563+0200: […]

字符串的plus运算符的线程安全性,包括优化

这篇文章说a += b相当于 a = new StringBuilder() .append(a) .append(b) .toString(); 假设我有这个代码: public class MultiThreadingClass extends SomeThirdPartyClassThatExtendsObject{ public void beginmt(String st) throws IOException { //st is a thread number st = new File(“c:\\somepath”).getCanonicalPath()+”\\”+st; System.out.println(st); } } 假设beginmt在MultiThreading类的单个实例上同时运行多次(线程号为1到15500)。 可能有这样的情况,它可以打印以下,即一些线程数丢失,一些数字加倍? c:\somepath\2 c:\somepath\1 c:\somepath\1 c:\somepath\4 c:\somepath\5 c:\somepath\6 c:\somepath\7 c:\somepath\8 c:\somepath\8 c:\somepath\10 … 编辑: 是否安全地说+运算符不会进入某些不安全的发布问题? 我认为StringBuilder可以优化为类似于实例变量的东西,在这种情况下它可能会被不安全地发布。 编辑2: 就JLS,上述post以及上述代码的类似类文件进行检查,要使用的StringBuilders似乎必须包含在不同的堆栈帧中。 但是,我仍然想检查某种forms的激进优化是否会导致StringBuilders以某种方式被集中式StringBuilder替换。 这听起来是可能的,因为当优化器预测对象刚刚以非常数方式实现时实际上这样的对象可以是常量时,优化器优化是合乎逻辑的。 […]

java进程中有很multithreading

为什么简单的Java GUI应用程序会创建如此多的线程?

Java字节码签名

作为我正在编写的编程语言的编译器的一部分,我在字节码中遇到了通用签名,我试图解析并转换为AST。 解析算法大多数都有效,但似乎有一种特殊情况,这些签名的格式有点奇怪。 以下是一些这样的情况: java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.lang.Class#getAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getAnnotationsByType: (Ljava/lang/Class;)[TA; java.lang.Class#getDeclaredAnnotation: (Ljava/lang/Class;)TA; java.lang.Class#getDeclaredAnnotationsByType: (Ljava/lang/Class;)[TA; java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;)V java.util.Arrays#parallelSort: <T::Ljava/lang/Comparable;>([TT;II)V java.util.Collections#sort: <T::Ljava/lang/Comparable;>(Ljava/util/List;)V 在这些类中的所有方法中,这些是唯一在其签名中具有::的方法。 我的问题是这个令牌的作用以及它存在的原因。 编辑 我知道Java语言中的::运算符,但这是字节码级别的东西。