相关疑难解决方法(0)

Java OutOfMemoryError奇怪的行为

假设我们的最大内存为256M,为什么这段代码有效:

public static void main(String... args) {
  for (int i = 0; i < 2; i++)
  {
      byte[] a1 = new byte[150000000];
  }
  byte[] a2 = new byte[150000000];
}
Run Code Online (Sandbox Code Playgroud)

但是这个扔了一个OOME?

public static void main(String... args) {
  //for (int i = 0; i < 2; i++)
  {
      byte[] a1 = new byte[150000000];
  }
  byte[] a2 = new byte[150000000];
}
Run Code Online (Sandbox Code Playgroud)

java out-of-memory

55
推荐指数
2
解决办法
1957
查看次数

一元"〜"操作符 - 这到底发生了什么?

我最近做了Java课程(1周速成课程),我们介绍了一些二进制数学.

这个一元〜运算符(代字号,我认为它被称为?)向我们解释了:

它将位模式反转,每"0"变为"1",每"1"变为"0".例如,一个字节有8位.如果您有以下字节:00000000,则反转值将更改为11111111.

以上解释清晰简洁,对我来说完全有道理.直到,也就是说,我试图实现它.

鉴于这种:

byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
Run Code Online (Sandbox Code Playgroud)

输出是:

-4  
-6
Run Code Online (Sandbox Code Playgroud)

我对这是怎么回事感到很困惑.

如果二进制中的+3是11,那么这个的反转将是00,这显然不是-3.

但由于一个字节中有8位,那么+3的二进制表示不应写为00000011吗?

哪个会反转成11111100.转换回十进制值这将是252.如果你将+3写为011,那么它确实转换为100,即+4,但那么你怎么知道它是负数?

如果你尝试0011,转换为1100,如果你使用第一位作为符号,那么它确实变为-4.

啊 - 所以在这一点上,我以为我到了某个地方.

但后来我得到了y = 5的第二个值.

我们怎么写这个?使用相同的逻辑,+ 5转换为二进制0101,其反转为1010.

而现在,我非常困惑.这看起来代表有符号值-2,或无符号值+10十进制?这些都不是-6我打印出来的.

再次,如果我将长度增加到一个字节的8位数,+ 5是00000101,其反转变为11111010.而且我真的找不到将其转换为-6的方法.

有没有人明白这一点,因为我不知道这里发生了什么,我打印的数字越多,我就越困惑.

谷歌似乎没有提出任何关于这一点 - 也许它不喜欢看小运营商的迹象.. :-(

java binary

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

executorService.submit(Runnable)返回的future对象是否包含对runnable对象的任何引用?

我们假设我们有以下代码:

List<Future<?>> runningTasks;
ExecutorService executor;
...
void executeTask(Runnable task){
    runningTasks.add(executor.submit(task));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 是否runningTasks持有task对象的引用?
  2. 它持有多长时间?任务完成后是否还能保留它?
  3. 为了避免内存泄漏,我是否必须小心删除添加到列表中的未来?

java future executorservice runnable

12
推荐指数
1
解决办法
2754
查看次数

标签 统计

java ×3

binary ×1

executorservice ×1

future ×1

out-of-memory ×1

runnable ×1