这个问题发布在某个网站上.我没有在那里找到正确的答案,所以我再次在这里发布.
public class TestThread {
public static void main(String[] s) {
// anonymous class extends Thread
Thread t = new Thread() {
public void run() {
// infinite loop
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// as long as this line printed out, you know it is alive.
System.out.println("thread is running...");
}
}
};
t.start(); // Line A
t = null; // Line B
// no more references for Thread t
// another infinite …Run Code Online (Sandbox Code Playgroud) 我已经读过Perm gen(或Permanent Generation)空间不是垃圾收集的.但是,在CMS集合中,我可以在GC日志中看到一些类正在卸载.那么在完全收集或CMS收集期间收集的perm gen垃圾是什么?
如果我Object.hashcode()在某个对象上调用该方法,则返回该对象的内部地址(默认实现).该地址是逻辑地址还是物理地址?
在垃圾收集中,由于内存压缩,对象移位发生在内存中.如果我在GC之前和之后调用哈希码,它会返回相同的哈希码(它返回),如果是,那么为什么(因为压缩地址可能会改变)?
在Java中,每当我们需要调用wait/notify/notifyAll时,我们需要访问对象监视器(通过synchronized方法或通过synchronized块).所以我的问题是为什么java没有去同步等待/通知方法去除从同步块或方法调用这些方法的限制.
如果将它们声明为synchronized,它将自动获取监视器访问权限.
据我所知,YGC所花费的时间与伊甸园中活物的数量成正比.我也理解在主要集合中如何计算实时对象(线程堆栈和静态对象中的所有对象以及可传递地从这些对象到达的其他对象.)
但是我不明白年轻一代的收藏中是如何计算出活物的?如果它解析线程堆栈,那么它需要解析eden + tenured space,而我认为并非如此.那么JVM如何在eden中找到活动对象并在To Survivor空间中复制它们呢?
为什么我们可以拥有静态最终成员但不能在非静态内部类中使用静态方法?
我们可以访问外部类之外的内部类的静态最终成员变量而无需实例化内部类吗?
通常我会在各种书中发现主要方法应该是公开的,因为它应该对类加载器可见.但是JVM执行(或提供特殊处理)各种私有方法,比如ObjectOutputStream中的readObject/writeObject方法.
这个问题在MS面试时被问到了.我想知道这段代码中的确切设计问题.已经提供了代码,需要找到设计问题.
我有类MyHashMap,它扩展了Java HashMap类.在MyHashMap课程中,我必须保留一些员工的信息.此映射中的键将是firstName + lastName + Address.
public MyHashMap extends HashMap<Object, Object> {
//some member variables
//
public void put(String firstName, String lastName, String Address, Object obj) {
String key = firstName + lastName+ Address;
put(key, obj);
}
public Object get(String firstName, String lastName, String Address) {
String key = firstName + lastName+ Address;
return get(key);
}
public void remove(Strig key) {
put(key, "");
}
//some more methods
}
Run Code Online (Sandbox Code Playgroud)
这个设计有什么问题?我应该将HashMap子类化还是应该将HashMap声明为此类的成员变量?或者我应该实现hashCode/equals方法?
重新散列会增加段数吗?或者在重新散列 CHM 时并发级别会发生变化吗?
如果不是(很可能),那么为什么在 Java 中给出了这种行为,随着 CHM 中条目数量的增加,更多线程将访问同一段并且可能需要更高级别的并发性?
编辑:我想如果给出了增加段的功能,则需要锁定所有段。这就是原因吗?
在java中,我们可以使用xmx参数定义进程可以采用的最大内存.对于perm gen,我们可以定义MaxPermSize.因此,perm gen空间也是使用xmx参数分配的内存的一部分.
所以是xmx =年轻+老年人+年轻人+老人+烫发或年轻人+老人+烫发+堆叠空间?
是一个"静态决赛"直接分配到年轻一代或老一代或perm gen?(我想它很可能会在我想的时候进入老一代.)如果它是在perm gen中分配的那么,当它在Perm Gen中进行类卸载时会被垃圾收集吗?
在Java运行时中,如果我的应用程序释放了内存,运行时是否将内存释放回OS?还是回到我的过程?