我的数学表明以下Java程序需要大约8GB(2147483645*4字节)的RAM:
package foo;
public class Foo {
public static void main(String[] args) throws Exception {
int[] arr = new int[Integer.MAX_VALUE-2];
Thread.sleep(500000L);
}
}
Run Code Online (Sandbox Code Playgroud)
但除非您将最大堆设置为大约12.5GB,否则程序无法启动:
$ java -Xmx12000m -cp ./ foo.Foo
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at foo.Foo.main(Foo.java:5)
$ java -Xmx12500m -cp ./ foo.Foo
//this works
Run Code Online (Sandbox Code Playgroud)
可以理解需要一些摆动但我们为什么需要这么多?
我没有看到以下代码如何产生看似违反对象锁定义的输出.当然只允许一个线程打印"获取锁定"消息,但他们都这样做?
class InterruptThreadGroup {
public static void main(String[] args) {
Object lock = new Object();
MyThread mt1 = new MyThread(lock);
MyThread mt2 = new MyThread(lock);
mt1.setName("A");
mt1.start();
mt2.setName("B");
mt2.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
// Thread.currentThread().getThreadGroup().interrupt();
}
}
class MyThread extends Thread {
private Object lock;
public MyThread(Object l) {
this.lock = l;
}
public void run() {
synchronized (lock) {
System.out.println(getName() + " acquired lock");
try {
lock.wait();
} catch (InterruptedException e) {
System.out.println(getName() + …Run Code Online (Sandbox Code Playgroud) 我有一个关于memcopy的非常简单的问题,我已经能够修复但不明白为什么.以下代码在runtuime崩溃并出现"访问冲突":
char *src = "HELLO WORLD!";
char * dest = "hello world!";
memcpy(dest, src, strlen(src)+1);
Run Code Online (Sandbox Code Playgroud)
dest似乎足够大,据我所知,memcpy应该盲目地复制字节,所以我不明白这个问题.
将dest更改为数组例如可以char dest[13];解决问题,因此要求dest必须是未初始化的内存并创建数组才能为您执行此操作,而指针声明则不是吗?
干杯
我有点困惑为什么以下不编译:
public <E extends Object> E doSomething() {
return new Object();
}
Run Code Online (Sandbox Code Playgroud)
我对这个问题进行了一些研究,并发现了各种修复方法,例如转换为(E)或使用类文字,但我仍然不确定上述内容实际上是什么问题.