小编Jon*_*han的帖子

仿制药的仿制药如何运作?

虽然我确实理解了泛型的一些角落情况,但我遗漏了以下示例的内容.

我有以下课程

1 public class Test<T> {
2   public static void main(String[] args) {
3     Test<? extends Number> t = new Test<BigDecimal>();
4     List<Test<? extends Number>> l =Collections.singletonList(t);
5   }
6 }
Run Code Online (Sandbox Code Playgroud)

第4行给出了错误

Type mismatch: cannot convert from List<Test<capture#1-of ? extends Number>> 
to List<Test<? extends Number>>`. 
Run Code Online (Sandbox Code Playgroud)

显然,编译器认为不同的不同?.虽然我的直觉告诉我,这是正确的.

任何人都可以提供一个例子,如果第4行合法,我会得到运行时错误吗?

编辑:

为了避免混淆,我用第=null3行替换了具体的赋值

java generics wildcard capture

22
推荐指数
2
解决办法
2092
查看次数

如何确定应用程序中的gc-cpu利用率?

我们希望内化JConsole/JVisualVM的一些功能,并从正在运行的应用程序中收集有关cpu利用率和内存消耗的数据.原因是,安全约束阻止我们在生产系统上向外部打开jmx端口.

可以通过MXBeans监视所需的大多数数据,但是,用于垃圾收集的cputime仍然无法实现.通过GarbageCollectorMXBean它监控gc-time 是没有用的,因为它只提供并行工作收集器的挂壁时间.

我假设可以使用ThreadMXBean来确定所有gc-threads的cputime.我看不到安全识别这些线程的方法.

有谁知道,JVisualVM如何计算这个数字?

java performance monitoring garbage-collection

8
推荐指数
1
解决办法
1664
查看次数

一些正常运行时间后,JDK7应用程序变慢

我们在JBoss上使用Hibernate,Spring等几个库部署了一个大型JDK7应用程序.在初始启动服务器之后,应用程序按预期运行,但在一段正常运行时间后,它变得非常慢.

使用分析器,我们已经看到每次外出应用程序的某些方面正在减慢但不总是相同的方面.虽然在一次运行中,hibernate flush可能会慢慢爬行,但在另一次运行中它可能是来自Spring的一些DI代码.

那里发生了什么?

performance java-7 jboss7.x

5
推荐指数
1
解决办法
1649
查看次数

Java 中操作系统特定的构建性能

我们目前正在评估我们的下一代全公司开发人员电脑配置,并注意到一些非常奇怪的事情。

我们相当大的整体 - 在我们当前的配置上,构建时间约为。4.5 分钟(没有测试,只是编译)。

对于下一代配置,我们升级了多个组件。处理器的频率和 IPC 适度增加,CPU 核心数量加倍,并从小型 SATA SSD 切换到额定速率 >3GBps 的 NVMe SSD。此外,下一代配置从 Windows 7 切换到 Windows 10。

在执行第一次测试时,我们注意到构建时间几乎相同(4.3 分钟),这比我们预期的改进要少得多。

在我们的实验过程中,我们曾尝试在 Windows 主机上运行的虚拟 Linux 机中运行构建过程。在旧配置 (Windows7) 上,我们看到构建时间从 4.5 分钟减少到约 3.7 分钟,在 Windows 10 主机上,我们看到构建时间从 4.3 分钟减少到 2.3 分钟。我们已经排除了病毒扫描之类的事情。

我们对这些结果感到相当惊讶,并试图找到另一种解释,而不是针对不同操作系统的一些近乎宗教和侮辱性的陈述。

所以问题是:我们在配置 Windows 机器时可能做错了什么,导致速度几乎是在同一 Windows 主机中虚拟化运行的 Linux 的一半?尤其是所有硬件进步似乎都被 Windows 7 到 10 的切换所吞噬。

另一个问题是:我们如何让 javac 进程使用更多的核心,因为现在,使用 Hotspot JDK 8 我们最多可以看到构建实际使用的两个核心。我读过有关 sjavac 的内容,但这似乎是一个相当实验性的功能,仅适用于 OpenJDK9,对吧?

linux windows performance virtualbox javac

5
推荐指数
1
解决办法
841
查看次数

以泛型类型作为成员变量的函数

我有一个函数将一个class对象映射到这个类的一个实例。基本上:

 Function<Class<T>, T> fun;
Run Code Online (Sandbox Code Playgroud)

我可以在一个方法中定义这个函数,但是当试图把它放在一个成员变量中时,编译器会抱怨,因为类型T是未知的。

所以,T并不是特定于封闭对象。它可能因电话而异。在类级别定义这样的函数的正确语法是什么?

编辑

我想澄清一下。我有课A

public class A {
  public <T> T get(Class<T> clazz) {...}
}
Run Code Online (Sandbox Code Playgroud)

现在,我想将指向该函数的指针传递给这样的类B

public class B {
  <T> Function<Class<T>, T> fun;
  
  public <T> T get(Class<T> clazz) {
    return fun.apply(clazz);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,for 的语法<T> Function<Class<T>, T> fun不正确。有没有办法保留信息,那种乐趣总是会保留类型T

我目前的解决方案是

public class B {
  Function<Class<?>, ?> fun;

  public <T> void setFun(Function<Class<T>, T> fun) {
    this.fun = fun;
  }

  public <T> T get(Class<T> clazz) …
Run Code Online (Sandbox Code Playgroud)

java generics

5
推荐指数
0
解决办法
87
查看次数

为什么 @Sql 在 Spring 测试中不起作用?

我有一个@DataJpaTest需要一些数据库初始化的项目。我尝试将 a 放入data.sql资源文件夹中并且它有效。但是,我想使用特定于此测试的数据来初始化数据库。

看来,这@Sql是这样做的首选方式。但是,就我而言,尽管指定的文件位于资源中,但它不起作用。数据库根本没有初始化。

我能做些什么?

java testing spring-data-jpa

4
推荐指数
1
解决办法
3217
查看次数

Java中的热切垃圾收集

我想更好地了解我的应用程序,特别是它的内存占用.

我确实理解垃圾收集的概念,我知道堆中总会有一定数量的死对象,但是,我想最小化这个数量,以便用JConsole(或JVisualVM)进行监视为我提供了有关当前所需(未占用)空间的一些信息.

有没有办法在SunVM中配置现有的垃圾收集器(例如G1GC),以便(以响应性和运行时为代价)最小化堆中死对象的数量?

澄清

为了更清楚我的目标:我的应用程序是非交互式的,因此两次运行之间随着时间的推移,内存占用量大致相同.我想确定所需的最小堆空间以及代码更改对该占用空间的影响.由于死对象,JConsole的输出在这里并没有真正帮助.我也想知道,我的峰值记忆是否确实在某个时间点是一个突出的峰值,或者它是否随着时间的推移而拉伸.这就是为什么在我到达OOME之前减少Xmx并不是什么让我在那里.

另外:我说的是在开发人员测试期间使用,而不是在生产中使用.在生产中,通过性能和性能 - 当然 - 比更现实的memroy足迹更重要.

java garbage-collection jvm

3
推荐指数
1
解决办法
954
查看次数

我在哪里不是Threadsafe?

我正在使用一个对象,它大致用作字符串映射的包装器:

public class Wrapper {
  private Map<String, String> values;
  private Formatter formatter;

  public BigDecimal getSpecialValue() {
    String result = values.get("Special");
    return formatter.formatNumber(result);
  }
}
Run Code Online (Sandbox Code Playgroud)

上述格式化器大致用作SimpleDateFormat的映射器

 public class Formatter {
   private static final NumberFormat NUMBER_FORMAT;

   public BigDecimal formatNumber(String s) {
     Number num = NUMBER_FORMAT.parse(s);
     if (num instanceof Integer) {
       return new BigDecimal((Integer) num);
     } else if (num instanceof Double) {
       return new BigDecimal((Double) num);
     } ...
   }
 }
Run Code Online (Sandbox Code Playgroud)

当我getSpecialValue()一次通过多个线程访问该方法时,一些行为准确,这只能通过并发访问来解释,例如可能有一个NumberFormatExceptionParseException哪个解析的字符串是.430.430而不是.430等等.

有两个方面引起我的兴趣:1.)包装器只能以只读方式访问.虽然对该集合的访问不同步,但我认为这应该始终有效.2.)在第一次尝试找到问题时,我改变了Wrapper类的构造函数来执行该formatNumber方法(显然是单线程),这消除了执行过程中的所有异常.

谁能解释一下? …

java multithreading thread-safety

2
推荐指数
1
解决办法
180
查看次数