Tag: jvm

垃圾收集器是否保证在Out of Memory Error之前运行?

如果堆已满,JVM将抛出OutOfMemoryError 。 但是它确保在抛出这样的exception之前总是发生(完全)垃圾收集吗? 这意味着当抛出exception时,内存只有强引用对象(或GC Roots可达)才能满。 编辑:假设Sun JVM – HotSpot正在讨论中。

为什么是锯齿形图?

当我使用NetBeans运行下面提到的代码时,分配的堆大小图类似于锯齿形状。 我正在附加来自JVisualVM的屏幕截图,它显示了具有锯齿形状的堆分配图。 该程序是一个简单的无限循环打印“Hello,World!” 进入控制台。 public class HelloWorld { public static void main(String a[]){ while(true) { System.out.println(“Hello, World!”); } } } 任何人都可以解释使用堆图形状背后的原因吗? PS :即使我在不​​使用NetBeans的情况下运行它也会发生这种情况,因此它很可能与NetBeans无关…

JVM如何终止守护程序线程? 或者如何编写优雅终止的守护程序线程

假设情景: 我有一个守护程序线程负责一些I / O,主线程完成并返回,JVM决定终止我的守护程序线程。 它是如何做到的? 打断? 最终确定? 如何编写我的守护程序线程,以便它在终止时能够做出优雅的反应?

JVM内存使用失控

我有一个Tomcat webapp,它代表客户执行一些漂亮的内存和CPU密集型任务。 这是正常的,是所需的function。 但是,当我运行Tomcat时,内存使用量会随着时间的推移而猛增至4.0GB以上,此时我通常会杀死该进程,因为它会破坏我在开发计算机上运行的所有其他内容: 我以为我无意中用我的代码引入了内存泄漏,但在用VisualVM检查后,我看到了一个不同的故事: VisualVM将堆显示为占用大约一GB的RAM,这就是我将其设置为使用CATALINA_OPTS=”-Xms256m -Xmx1024″ 。 根据VisualVM的说法,为什么我的系统认为这个过程占用了大量的内存,它几乎没有占用任何内容? 经过一番进一步的嗅探,我注意到如果在应用程序中同时运行多个作业,则内存不会被释放。 但是,如果我在将另一个作业提交给ExecutorService服务的BlockingQueue之前等待每个作业完成,那么内存将被有效回收。 我该怎么调试呢? 为什么垃圾收集/内存重用会有所不同?

连接到已经运行的JVM

有没有办法连接到已经运行的JVM? 例如,在JNI中,您可以使用JNI_CreateJavaVM创建VM并运行jar并检查其所有类。 但是,如果jar已经运行,我找不到附加到其JVM并与其类通信或获取其env指针的方法。 另一个问题是,如果jar加载我的本机库(.dll)并且我想在.dll中创建一个JVM,我不能..也不能在没有jar调用我的函数的情况下附加jar的当前JVM。 Java方面的示例: class Foo { static {loadLibrary(“Foo”)} } 在C ++方面: void Foo() { //CreateJVM //Attach to the current process.. //Call function from the jar that loaded me. } 如果没有jar先调用Foo就无法做到这一点。 有任何想法吗? 有没有办法获取当前的JVM或附加到它或外部的jvm实例?

如何在不停止JVM的情况下将Javaagent添加到JVM?

我希望在不停止应用程序的情况下分析Java应用程序。 我可以在应用程序运行时以某种方式添加Javaagent吗?

实习字符串,字符串池和perm空间上的垃圾收集

在探索了java的字符串内部结构后,我对所谓的“烫发空间”感到困惑。 我最初的理解是它持有String 文字以及类元数据,如本问题所述 。 我还阅读了String.intern()方法,并将String放入String Pool中,返回对它的唯一实例的引用。 我的理解是,这是与JVM的perm空间中存在的字符串文字相同的字符串池。 对我来说,“烫发空间”可以修改是不可能的(毕竟它是永久性的,是吗?)。 但后来我发现这个问题 ,EJP对接受的答案的最高投票评论解释了这一点 现在,实习生的字符串已经可以使用GC了。 暗示GC在perm空间上运行,这似乎不是永久性的。 这如何调和? GC是否检查了烫发空间中的所有内容? GC是否检查字符串池中的所有内容,包括源中的字符串文字? 内联字符串是否有第二个字符串池? GC是否只知道在收集时查看实习生的字符串? 或者这个评论是错误的,并且实际上是一个字符串阻止它被GC’d(我希望不是这样)?

字符串池与常量池

这个问题可能很愚蠢。 但我完全糊涂了。 需要帮助理解字符串池和常量池。 我很清楚字符串实习和字符串池。 String s1 = “Hello”; String s2 = “Hello”; 现在两者都由于实习而引用同一个对象。(即)由于字符串是不可变的,因此只创建一个对象并且两者都引用同一个对象。 而且常量池是保存在类中声明的所有常量(整数,字符串等)的东西。 它针对每个class级。 System.out.println(“Hello”); //I believe this Hello is different from above. 我的问题是, 字符串池是指常量池中的常量字符串对象池吗? 如果是,是字符串池在整个应用程序中是通用的还是特定于类? 谢谢。

finally {}块不会执行的情况是什么?

在Java try{} … catch{} … finally{}块中, try{} … catch{} … finally{}代码通常被认为是“保证”运行,无论try / catch中发生了什么。 但是,我知道至少有两种情况不会执行: 如果调用System.exit(0) ; 要么, 如果exception被抛出到JVM并且发生默认行为(即printStackTrace()并退出) 是否有任何其他程序行为会阻止finally{}块中的代码执行? 代码在什么具体条件下执行? 编辑:正如NullUserException指出的那样,第二种情况实际上并非如此。 我认为这是因为标准错误中的文本在标准输出之后打印出来,防止文本在没有向上滚动的情况下被看到。 :) 道歉。

在System.out.println()中输出

首先感到遗憾的是,这是一个非常基本的问题,我宣传我仍然是一个代码猴。 我在接受采访时被要求阐明System.out.println(); 我解释了以下方式 //this class belongs to java.lang package class System{ public static PrintStream out; } //this class belongs to java.io package class PrintStream{ public void println.. } 我已经解释过System.out是有效的,因为这是我们在java中访问静态变量的方式,而out是PrintStream的一个对象,因此我们可以访问它的方法,总之为 System.out.pritnln(); 他让我模拟一个类似的程序,我跟踪它并没有用,因为System.out返回null 我的问题是在java中实例化的对象在哪里? 如果我没错,它是预定义的对象吗? 应该是什么细致的解释。 从技术上讲,我们应该叫什么? 是PrintStream类型的变量还是应该将其称为PrintStream类型的对象?