小编Thi*_*ler的帖子

是否可以通过减去两个不相等的浮点数得到0?

在以下示例中是否可以将除以0(或无穷大)?

public double calculation(double a, double b)
{
     if (a == b)
     {
         return 0;
     }
     else
     {
         return 2 / (a - b);
     }
}
Run Code Online (Sandbox Code Playgroud)

在正常情况下,它当然不会.但是,如果a并且b非常接近,可能会(a-b)导致0计算的精确性?

请注意,这个问题适用于Java,但我认为它适用于大多数编程语言.

floating-point double floating-accuracy ieee-754

130
推荐指数
7
解决办法
9872
查看次数

当使用==表示基元和盒装值时,自动装箱完成,或者取消装箱完成

以下代码编译(使用Java 8):

Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
Run Code Online (Sandbox Code Playgroud)

但是它做了什么?

取消框i1:

boolean compared = (i1.intvalue() == i2);
Run Code Online (Sandbox Code Playgroud)

或盒子i2:

boolean compared = (i1 == new Integer(i2));
Run Code Online (Sandbox Code Playgroud)

那么它是按比例比较两个Integer对象(通过引用)还是两个int变量?

请注意,对于某些数字,因为Integer类维护值之间的内部缓存中的基准比较将产生正确的结果-128127(见也TheLostMind注释).这就是我1000在我的例子中使用的原因以及为什么我特别询问拆箱/装箱而不是比较的结果.

java autoboxing

53
推荐指数
3
解决办法
8314
查看次数

积极的垃圾收集策略

我正在运行一个创建和忘记大量对象的应用程序,长现有对象的数量确实增长缓慢,但与短期对象相比,这是非常少的.这是一个具有高可用性要求的桌面应用程序,需要每天24小时开启.大部分工作都是在一个线程上完成的,这个线程只会使用它可以获得它的所有CPU.

在过去,我们在重负载下看到了以下内容:使用的堆空间缓慢上升,因为垃圾收集器收集的内存少于新分配的内存量,使用的堆大小缓慢增长并最终接近指定的最大堆.此时,垃圾收集器将大量启动,并开始使用大量资源来防止超过最大堆大小.这会减慢应用程序的速度(轻松放慢10倍),此时GC大部分时间会在几分钟后成功清理垃圾或者失败并扔掉OutOfMemoryException,两者都不是真的可以接受.

使用的硬件是四核处理器,至少4GB内存运行64位Linux,如果需要,我们可以使用所有这些.目前,该应用程序大量使用单个核心,该核心大部分时间都在运行单个核心/线程.其他核心大多是空闲的,可用于垃圾收集.

我有一种感觉,垃圾收集器应该在早期阶段更积极地收集,远在它耗尽内存之前.我们的应用程序没有任何吞吐量问题,低暂停时间要求比吞吐量更重要,但远不如不接近最大堆大小重要.如果单个繁忙线程仅以当前速度的75%运行是可以接受的,只要这意味着垃圾收集器可以跟上创建的步伐.简而言之,性能的稳定下降优于我们现在看到的突然下降.

我已经仔细阅读了Java SE 6 HotSpot [tm]虚拟机垃圾收集调整,这意味着我很好地理解了这些选项,但是我仍然觉得很难选择正确的设置,因为我的要求与文中讨论的内容有点不同.

目前我正在使用带有选项的ParallelGC -XX:GCTimeRatio=4.这比时间比的默认设置好一点,但我感觉GC允许运行的设置比它更多.

为了监控,我主要使用jconsole和jvisualvm.

我想知道您为上述情况推荐的垃圾收集选项.另外,我可以看看哪个GC调试输出更好地理解瓶颈.

编辑: 我理解这里有一个非常好的选择是创造更少的垃圾,这是我们真正考虑的事情,但是我想知道我们如何通过GC调整解决这个问题,因为这是我们可以更容易做到的事情并且滚动比更改大量源代码更快.此外,我已经运行了不同的内存分析器,我了解垃圾的用途,我知道它包含可以收集的对象.

我在用:

java version "1.6.0_27-ea"
Java(TM) SE Runtime Environment (build 1.6.0_27-ea-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.2-b03, mixed mode)
Run Code Online (Sandbox Code Playgroud)

使用JVM参数:

-Xmx1024M and -XX:GCTimeRatio=4 
Run Code Online (Sandbox Code Playgroud)

编辑回复Matts注释: 大多数内存(和cpu)用于构建表示当前情况的对象.当情况迅速变化时,其中一些将被立即丢弃,如果没有更新进入一段时间,其他一些将具有中等寿命.

java garbage-collection heap-memory

33
推荐指数
2
解决办法
2万
查看次数

heapdump上对象的保留大小是多少?

我最近在Netbeans(6.7)中增加了对Profiler的使用,这是一个很棒的工具.

不过我有一个问题.在进行堆转储时,在摘要页面(期望窗口)上,可以"按保留大小找到最大的对象".

这个值是什么以及它如何用于分析内存使用情况?

java memory-leaks netbeans

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

如何在FutureTask中捕获异常

在发现在Java 1.6上FutureTask运行Executors.newCachedThreadPool()(以及从Eclipse中)吞下Runnable.run()方法中的异常后,我试图找到一种方法来捕获这些,而不向我的所有Runnable实现添加throw/catch .

API建议覆盖FutureTask.setException()应该有助于此:

导致此未来报告ExecutionException,并将给定的throwable作为其原因,除非已设置或已取消此Future.在计算失败时,run方法在内部调用此方法.

但是,似乎没有调用此方法(使用调试器运行显示异常被捕获FutureTasksetException未被调用).我写了以下程序来重现我的问题:

public class RunTest {
    public static void main(String[] args) {
        MyFutureTask t = new MyFutureTask(new Runnable() {

            @Override
            public void run() {
                throw new RuntimeException("Unchecked exception");

            }
        });

        ExecutorService service = Executors.newCachedThreadPool();
        service.submit(t);
    }
}

public class MyFutureTask extends FutureTask<Object> {

    public MyFutureTask(Runnable r) {
        super(r, null);
    }

    @Override
    protected void setException(Throwable t) {
        super.setException(t);
        System.out.println("Exception: " + t);
    } …
Run Code Online (Sandbox Code Playgroud)

java concurrency executorservice futuretask

21
推荐指数
3
解决办法
2万
查看次数

如何从DirectoryStream创建流

在阅读API时,DirectoryStream我错过了很多功能.首先,它建议使用for循环从流到List.我想念它DirectoryStream不是一个事实Stream.

我怎样才能让一个Stream<Path>DirectoryStreamJava中8?

java java-8 java-stream

20
推荐指数
2
解决办法
5774
查看次数

我怎样才能看到java正在使用哪个垃圾收集器

Java虚拟机支持多种垃圾收集策略.

文章解释了他们.

现在我想知道我的应用程序正在使用哪种(自动选择)策略,有没有办法让JVM(版本1.6)打印这些信息?

编辑:JVM检测它是否处于客户端或服务器模式.所以真正的问题是如何才能看到哪些被发现?

java garbage-collection

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

谁打断了我的线程?

我理解InterruptedException的作用以及它被抛出的原因.但是在我的应用程序中,我在等待SwingUtilities.invokeAndWait()一个只有我的应用程序知道的线程时得到它,而我的应用程序从不调用Thread.interrupt()任何线程,它也永远不会将线程的引用传递给任何人.

所以我的问题是:谁打断了我的线程?

有什么方法可以说出来吗?是否有理由说InterruptedException不包含请求中断的Thread的名称?

我读到它可能是一个框架或库来执行此操作,我们使用以下内容,但我无法想到它们中断我的线程的原因:

  • 过冬
  • 弹簧
  • Log4J的
  • Mysql连接器

java swing multithreading interrupt interrupted-exception

12
推荐指数
2
解决办法
1323
查看次数

什么是Eclipse的好SVN插件?

几年前我为eclipse安装了几个SVN插件.当时我对他们的品质印象不深.许多人很慢,错误,无法应对任何没有通过插件的文件交互.所以我回到刚刚使用TortoiseSVN for windows和Linux命令行.现在我准备再试一次.

Eclipse的哪些Subversion插件目前最受欢迎且运行良好,它们如何比较?

eclipse svn

10
推荐指数
1
解决办法
9317
查看次数

映射ifPresent函数

如果地图的值存在,如何才能对地图的值执行,而不对地图进行任何更改?我希望使用'Java 8'声明式样式来做到这一点Optional.ifPresent().

我的用例如下:

我收到部分对象的更新(新的或删除的),我想与他们的父级注册这些更新.对于簿记,我有以下内容:

Map<ParentId, Parent> parents = ...
Run Code Online (Sandbox Code Playgroud)

收到新孩子时,我会做以下事情:

parents.computeIfAbsent(child.getParentId(), k -> new Parent()).addChild(child));
Run Code Online (Sandbox Code Playgroud)

但是为了删除我找不到声明函数.直截了当我将其实现为:

if(parents.containsKey(child.getParentId())
{
     parents.get(child.getParentId()).removeChild(child);
}
Run Code Online (Sandbox Code Playgroud)

或者我可以将值包装在Optional:

Optional.ofNullable(parents.get(child.getParentId()).ifPresent(p -> p.removeChild(child));
Run Code Online (Sandbox Code Playgroud)

请注意,Parent不是一个简单的列表,它包含的不仅仅是子项.所以以下不起作用(因为removeChild()不返回a Parent):

parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做,或者没有相应的Optional.ifPresent()

java lambda dictionary java-8

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