小编bif*_*fta的帖子

Java堆 - 比它需要的更大

我的数学表明以下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)

这可以通过在运行时观察程序来备份: jvisualvm记忆图片

但除非您将最大堆设置为大约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)

可以理解需要一些摆动但我们为什么需要这么多?

java memory

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

使用内在锁进入块

我没有看到以下代码如何产生看似违反对象锁定义的输出.当然只允许一个线程打印"获取锁定"消息,但他们都这样做?

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)

java locking java.util.concurrent

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

memcpy使用指针抛出访问冲突

我有一个关于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必须是未初始化的内存并创建数组才能为您执行此操作,而指针声明则不是吗?

干杯

c

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

重新分配通用Java变量

我有点困惑为什么以下不编译:

public <E extends Object> E doSomething() {
    return new Object();
}
Run Code Online (Sandbox Code Playgroud)

我对这个问题进行了一些研究,并发现了各种修复方法,例如转换为(E)或使用类文字,但我仍然不确定上述内容实际上是什么问题.

java generics

0
推荐指数
1
解决办法
80
查看次数

标签 统计

java ×3

c ×1

generics ×1

java.util.concurrent ×1

locking ×1

memory ×1