静态类和单例模式之间存在什么真实(即实际)差异?
两者都可以在没有实例化的情况下调用,两者都只提供一个"实例",它们都不是线程安全的.还有其他区别吗?
我试图理解Java堆术语中年轻,老一代和永久世代的概念,更具体地说是三代之间的相互作用.
我的问题是:
我已经安装了JDK 8并尝试运行Eclipse.我收到以下警告信息:
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0
Run Code Online (Sandbox Code Playgroud)
忽视这个论点的原因是什么?
我最近一直在阅读java中的内存分配方案,并且由于我从各种来源阅读,因此有很多疑问.我已经收集了我的概念,并且我会要求完成所有要点并对它们进行评论.我开始知道内存分配是特定于JVM的,所以我必须事先说,我的问题是Sun特定的.
谢谢你经历这个!
在此代码中,当我在main方法中创建一个Object 然后调用该对象方法:( ff.twentyDivCount(i)运行在16010毫秒)时,它运行速度比使用此注释调用它快得多:( twentyDivCount(i)运行在59516毫秒).当然,当我在不创建对象的情况下运行它时,我将方法设为静态,因此可以在main中调用它.
public class ProblemFive {
// Counts the number of numbers that the entry is evenly divisible by, as max is 20
int twentyDivCount(int a) { // Change to static int.... when using it directly
int count = 0;
for (int i = 1; i<21; i++) {
if (a % i == 0) {
count++;
}
}
return count;
}
public static void main(String[] args) {
long startT = System.currentTimeMillis();;
int start = …Run Code Online (Sandbox Code Playgroud) 静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.那它在哪里?应该有一些装载的地方?
class A{
static int i = 10;
static int j = 20;
static void getname(){
}
}
Run Code Online (Sandbox Code Playgroud)
这些变量将存储在内存中的哪个位置?
我在 java 中使用静态嵌套类用于特定用例。下面显示了相同的最小示例:
public class Foo {
static int fooInner = getInner(); // CASE 1
private static class StaticFoo {
int fooInner = getInner(); // CASE 2
public int useFooInner(){
System.out.println(fooInner);
//do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是案例 1 中的内存分配与案例 2 中的内存分配有何不同?或者是一样的?如果我也将 case 2 变量设为静态会怎样。内存使用会有所不同吗?
注意:请不要提及会发生阴影。虽然我已经将两个变量都放在那里,但它是一个“OR”案例,这就是“CASE”的原因。
PS:感觉内存使用量应该是一样的。由于嵌套类是静态的,因此不会为每个对象创建它,因此实例变量fooInner (案例 2)也将只创建一次。因此, getInner() 函数将只运行一次。但这只是抽象层面+直觉。更具描述性的答案将不胜感激!
我有四个关于java中的静态方法的问题:
1)在内存中加载静态方法?什么时候加载类或者第一次调用方法?
2)从内存中卸载静态方法?当类被卸载或者该方法的执行流程在调用后结束时?
3)加载JVM静态方法的内存区域?在堆栈内存区域或者JVM中有不同类型的内存用于静态方法(我也读过一些静态内存)?
4)在我们的应用程序中有这么多静态方法是否合适?
我在这个网站和其他网站上经历了很多问题,但他们没有明确说明.
但在流行的SO答案中,我发现永久生成不是堆的一部分
永久生成(非堆):包含虚拟机本身的所有反射数据的池,例如类和方法对象.对于使用类数据共享的Java VM,这一代分为只读和读写区域.
我搞砸了这些矛盾的数据.我相信在这两个地方数据有效但有保留.请为我澄清这个问题.
我只谈谈Sun/Oracle jvms.
我已经阅读了jvm gcs(串行,并行,cms和g1)的解释,我没有看到关于permgen的提及,它认为永久生成不是堆部分.