相关疑难解决方法(0)

堆栈和堆的内容和位置是什么?

编程语言书籍解释了在堆栈上创建了值类型,并且在堆上创建了引用类型,而没有解释这两者是什么.我还没有看清楚这个问题.我理解堆栈是什么.但,

  • 它们在哪里和它们(物理上在真实计算机的记忆中)?
  • 它们在多大程度上受操作系统或语言运行时控制?
  • 它们的范围是什么?
  • 是什么决定了它们的大小?
  • 是什么让一个更快?

language-agnostic heap stack memory-management dynamic-memory-allocation

7847
推荐指数
27
解决办法
145万
查看次数

指针大小 - 对象引用有多大?

问题在第一条水平线后完成,其余的是额外信息.

问题很简单,Androids Java VM中的引用消耗的大小是多少?

我的意思是:

如果我们有

String str = "Watever";
Run Code Online (Sandbox Code Playgroud)

我需要什么str,而不是"Watever".- "Watever"保存在指针(或引用)str所指向的位置.

也,

如果我们有

String str = null;
Run Code Online (Sandbox Code Playgroud)

它消耗了多少内存?它是否与另一个相同str

现在,如果我们有:

Object obj[] = new object[2];
Run Code Online (Sandbox Code Playgroud)

需要多少obj消费,多少钱obj[1]obj[2]消费?


queston的原因如下:(如果有人可以推荐一些东西).

我正在开发一款可以保存从互联网下载的许多照片的应用程序.我开始将这些图片存储在"银行"上(在图片列表中一致).

当在图库中显示这些图片时,我曾经在列表中搜索图片(SLOW)然后,如果那时图片不存在,我曾经在下载图片之前显示时间下载图像.

由于这发生在UI线程上,应用程序变得非常慢,所以我考虑在银行而不是我的列表上实现哈希表.

正如我之前解释的那样,这种搜索发生在UI线程中(我不能改变它).因此,如果冲突开始减慢线程,冲突就会成为问题.

我已经读过"为了平衡时间和空间效率,哈希表应该是大约半满",但这使得冲突在一半的时间内发生(对于UI线程不实用).这让我想到了一个非常长的哈希表(与保存的图片数量相比)并使用更多的RAM(具有更少的免费VMHeap).

在确定哈希表的大小之前,我想知道它将消耗多少内存以便不进行扩散.

我知道哈希表的大小可能与图片可能消耗的内存相比非常小,但我想确保我没有消耗更多的内存而不是必需的内存.


在问这个问题之前,我在其他地方之间搜索过

Java中的对象引用有多大,它究竟包含哪些信息?

java中的引用类型大小

哈希教程

(是的,我知道其中两个地方相互矛盾,这就是问题的部分原因).


如果您因任何原因不理解某些内容或想了解更多信息,请发表评论,我会尽快回复.

比你多得多.

java android

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

不稳定的出版物保证多深?

众所周知,如果我们有一些对象引用并且此引用具有final字段 - 我们将看到来自final字段的所有可到达字段(至少在构造函数完成时)

例1:

class Foo{
    private final Map map;
     Foo(){
         map = new HashMap();
         map.put(1,"object");
     }

     public void bar(){
       System.out.println(map.get(1));
     }
}
Run Code Online (Sandbox Code Playgroud)

正如我在这种情况下所做的那样,我们保证bar()方法总是输出object因为:
1.我列出了完整的类代码,Foo并且map是final;
2.如果某个线程会看到引用Foo和引用!= null,那么我们保证从最终map引用值可以到达的是实际的.

我也是这么认为的

例2:

class Foo {
    private final Map map;
    private Map nonFinalMap;

    Foo() {
        nonFinalMap = new HashMap();
        nonFinalMap.put(2, "ololo");
        map = new HashMap();
        map.put(1, "object");
    }

    public void bar() {
        System.out.println(map.get(1));
    }

    public void bar2() {
        System.out.println(nonFinalMap.get(2));
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们对bar() …

java concurrency visibility volatile happens-before

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