相关疑难解决方法(0)

PermGen和Metaspace有什么区别?

在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM用于保存其类.在Java 8中,它被删除并被称为Metaspace的区域取代.

PermGen和Metaspace之间最重要的区别是什么?

我知道的唯一区别是java.lang.OutOfMemoryError: PermGen space不能再抛出并MaxPermSize忽略VM参数.

java permgen java-7 java-8 metaspace

107
推荐指数
3
解决办法
5万
查看次数

Java中存储的静态方法和静态变量在哪里?

例如:

class A {
    static int i=0;
    static int j;

   static void method() {
       // static k=0; can't use static for local variables only final is permitted
       // static int L;
    }
}
Run Code Online (Sandbox Code Playgroud)

这些变量将存储在Java,堆中还是堆栈内存中?它们是如何存储的?

java jvm

103
推荐指数
6
解决办法
14万
查看次数

静态变量的实际内存位置是多少?

静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.那它在哪里?应该有一些装载的地方?

java memory garbage-collection memory-management

27
推荐指数
3
解决办法
4万
查看次数

java静态变量存储在内存中的位置?

class A{
 static int i = 10;
 static int j = 20;

 static void getname(){

   }

}
Run Code Online (Sandbox Code Playgroud)

这些变量将存储在内存中的哪个位置?

java static-variables

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

Java静态基元,对象,方法和堆(内存管理和最佳实践)

好的,所以我已经用Java开发了一年多一点时间,并且正在努力深入学习语言及其最佳实践.

所以这就是我所知道的:

  • Java"按类型传递" - 即基元通过副本传递,对象引用通过副本传递(引用指向堆上的对象).

  • 原始实例变量和引用存在于堆中的类对象中,而本地原语和引用存在于堆栈中(在它们各自的堆栈帧中).

  • Perm Gen.存储空间是存储类元数据的位置(用于反射).

  • Heap有一个Eden空间,其中有新对象,一个Young空间,其中存放了GC的幸存者和Tenured空间,其中放置了长寿命对象.

所以这就是我想要了解的内容:

  • 静态和静态最终基元和引用在哪里,JVM能够使用单个实例?

  • 静态和静态最终对象是否存储在堆中(我假设它们被移动到终身)?

  • 根据应用程序中静态最终引用的数量,什么被认为是最佳实践?

  • 创建更多静态最终引用会减少JVM中的堆空间量吗?

我已经阅读了很多不同的解释(都有所不同),并且如果Java语言中经验丰富的老手可以提供一个很好的解释,我会很高兴.提前致谢!

java heap static jvm memory-management

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

最大化Java堆空间

我试图在Java中使用非常大的方形矩阵,大约n = 1e6或更多.矩阵不是稀疏的,所以我没有看到很多方法将它们表示为2D数组,这需要n ^ 2*sizeof(int)位的内存.显然,即使添加编译器标志以用作我的机器允许的大堆,我也会遇到堆溢出错误.

我愿意为了这个问题而假设我拥有完美的计算机(无限制的RAM等),尽管实际上我在64位机器上有16 GB的RAM.似乎我的机器只是如此相关,因为我受JVM的限制而不是我的实际硬件(因为JVM不能拥有比我的物理机更多的内存).

我理解(并且引用,例如,在这里制作一个非常大的Java数组),Java阵列甚至在理论上也不能比用于索引的MAX_INT大.

我的问题是:有没有办法从JVM堆中哄骗额外的内存

据我所知,如果有,他们可能不会给我更多信息.

例如

在C中,我可以声明静态常量变量,并将它们移动到代码的数据部分,这将比堆有更多的空间,远远超过堆栈(存储的静态变量在哪里(在C/C++中)?) .

在Java中,似乎即使我将变量复制到"数据"部分,该值也会进入java中的主堆 静态分配 - 堆,堆栈和永久生成,这意味着我已成功移动一个完整的字节堆(耶!)

我的解决方案

我的"解决方案"并不是真正的解决方案.我创建了一个简单的数据结构,它使用RandomFileAccess io过程来替换对外部文件的读写的数组访问.它仍然是恒定时间访问,但我们从Java最快的操作之一转到非常非常慢的过程(尽管我们可以同时从文件中提取"缓存"行,这使得该过程非常快速).好主意?

不是我的问题

我不是问如何在java的最大数组大小之上创建一个数组.这是不可能的.这些是嵌套数组 - 单个n大小的数组很好,其中n个引起问题.

我不是问这个如何处理"java.lang.OutOfMemoryError:Java堆空间"错误(64MB堆大小).垃圾收集是不相关的 - 我甚至无法让阵列更加担心何时被删除.

我也不能使用迭代器(我认为),否则这将是一种可能性; 像矩阵乘法这样的函数需要能够直接索引

注意:Java不是在非常大的矩阵上进行操作的正确语言.我最好使用算盘.但我在这里,这是我无法控制的.

java memory-management

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

我们声明静态时分配的内存在哪里?

可能重复:
java中的静态分配 - 堆,堆栈和永久生成

它的一个小混乱...定义静态到类,方法和变量.在这三种情况下,因此分配内存.?我的老板熟悉C,他说只有变量在堆内存中,其余的(静态类和静态方法)将保留在主内存中.是真的吗?任何解释.?

在android中使用静态类和静态方法是一个最佳实践?

java android

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

理解堆上的静态和非静态方法表示之间的区别

我已经阅读了一些关于这个主题的帖子:

但我对它们所说明的概念感到困惑:

静态方法(实际上是所有方法)以及静态变量都存储在堆的PermGen部分中,因为它们是反射数据的一部分(类相关数据,而不是实例相关).

因此,方法,无论是否static只存储在类中的堆上的一个副本.现在只有一个副本在类中,我解释为所有方法都属于该类,那么为什么Java只能使用实例化的实例调用非静态方法?

为什么我们有非静态方法属于实例的概念,而不是类?

java static heap-memory permgen

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

是否有可能以编程方式销毁静态变量?

我想以编程方式销毁静态对象.可能吗?如果是,那么我怎样才能做到这一点.请建议.

java

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