Tag: jvm

方法住在哪里? 堆栈还是堆?

我知道局部变量和方法的参数都存在于堆栈中,但我无法弄清楚Java的实际方法在哪里? 如果我声明任何Thread对象,如: Thread t=new Thread(); t.start(); 所以这意味着我除了main方法之外还创建了一个单独的方法调用。 这是什么意思? 这是否意味着在堆栈内存上调用单独的方法序列? 我对吗?

如果执行顺序(几乎)不受影响,如何在严重的性能下降中分配变量结果?

在玩multithreading时,我可以观察到与AtomicLong(以及使用它的类,例如java.util.Random)相关的一些意外但严重的性能问题,我目前没有解释。 但是,我创建了一个简约示例,它基本上由两个类组成:一个类“Container”,它保存对volatile变量的引用;一个类“DemoThread”,它在线程执行期间对“Container”的实例进行操作。 请注意,对“Container”和volatile long的引用是私有的,并且从不在线程之间共享(我知道这里不需要使用volatile,它仅用于演示目的) – 因此,“DemoThread”的多个实例应该完美运行在多处理器机器上并行,但由于某种原因,它们没有(完整的例子在这篇文章的底部)。 private static class Container { private volatile long value; public long getValue() { return value; } public final void set(long newValue) { value = newValue; } } private static class DemoThread extends Thread { private Container variable; public void prepare() { this.variable = new Container(); } public void run() […]

Java Lambdas:它如何在JVM中运行并且是OOP吗?

例如,在匿名内部类的情况下,传递(匿名)对象引用并执行该对象的方法。 Lambda是代码块,将在需要时执行。 遇到lambdas时JVM中会发生什么? JVM在哪里存储与lambdas相关的代码块(Heap:Young,Old或Permanent Generation)? 我尝试搜索,我得到了使用lambdas的语法但是无法理解JVM中发生的事情,因为在JAVA中一切都是基于对象的。 所以在OOP的背景下,lambda是如何工作的? lambda违反了OOP概念吗? Lambda是否适合垃圾收集器,因为没有创建对象因此不用担心内存问题和清​​除内存?

Java 7排序“优化”

在Java6中,quicksort和mergesort分别用于Arrays#sort ,用于原始和对象数组。 在Java7中,这些都改变了, DualPivotQuicksort和Timsort。 在新快速排序的来源中,以下评论出现在几个地方(例如第354行): /* * Here and below we use “a[i] = b; i++;” instead * of “a[i++] = b;” due to performance issue. */ 这是一个性能问题? 编译器不会将这些减少到同一个东西吗? 更广泛地说,我自己调查这个的好策略是什么? 我可以运行基准测试,但我更感兴趣的是分析编译代码中的任何差异。 但是,我不知道使用什么工具等。

JVM如何开始寻找类?

我很好奇JVM查找执行程序的所有位置? 我更感兴趣的是了解JVM查找类文件的顺序和位置,比如查看java库,扩展库,类路径等任何目录,例如调用java的当前目录? 我对JVM行为更感兴趣,而不是类加载器加载类如何,我知道它具有直到root的父委托机制。 如果一个类是从编译类保存在文件系统上的目录执行的,也是在同一目录下的jar文件中执行的,那么JVM是加载两个还是只加载一个? 假设你有一个线程不安全的Vector ,如果我们将它的性能与ArrayList进行比较,哪一个会更好,为什么?

Java:如何检查当前的Perm / PermGen大小?

昨天当我运行WebLogic Application Server 11g安装程序时,我遇到了OutOfMemory错误,所以我用Google搜索了答案: java -Xms256m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=256m -jar wls1032_generic.jar 一切正常:) 但是,当我对解决方案三思而后行时,我可能犯了一个错误:我怎么能知道这些设置的当前设置? 我当然需要在覆盖它们之前检查它们的值,对吧? 有什么想法吗? 相关链接:人们在SO的另一个post中提出了试错法,这并不理想。 提前谢谢了。

Java非阻塞内存分配

我在某处读到java可以为大约12个机器指令中的对象分配内存。 这对我来说非常令人印象深刻。 据我所知,JVM使用的一个技巧是以块的forms预分配内存。 这有助于最大限度地减少对操作系统的请求数量,这是非常昂贵的,我想。 但即便是CAS操作也可能在现代处理器上花费多达150个周期。 那么,有没有人可以解释java中内存分配的实际成本以及JVM用于加速分配的技巧?

我也需要volatile参考类型的变量吗?

我们经常使用volatile来确保每个Thread都可以看到条件变量。 到目前为止,我看到volatile字段在代码中都是primitive type 。 object字段有这个问题吗? 例如: class a { public String str; public List list; } 如果有一些线程将访问str和list,我必须添加’volatile’吗? 我想每次访问Object都会直接从Heap获取,并且Object不会像原始类型那样被缓存。 是对的吗?

JVM如何保证finally块的执行?

这个问题针对的是JVM如何能够保证finally块的执行 (假设JVM没有崩溃并且线程没有被中断或退出)。 在面试问题的提示下,我试图了解JVM如何确保即使在奇怪的情况下也能执行finally块…请考虑以下代码: try{ int[] someArray = new int[10]; int invalid = someArray[10]; } catch(IndexOutOfBoundsException e){ throw new RuntimeException(“Other Exception”); } finally{ //close open files or HTTP connections etc. } 虽然这可能是一个奇怪的情况,但仍然保证执行finally块,尽管没有明确处理其他exception 。 JVM如何处理这样的情况? 我的想法: 根据我的理解并且到目前为止已经读过,当遇到未处理的exception时,控制从当前线程传递到我认为的那个线程的ThreadGroup 。 ThreadGroup中是否有一些条款可以检查最终需要执行的块? 我能想到的唯一另一件事就是finally块的地址可能存储在某个地方。 然后JVM在检测到exception时执行goto,并在finally块执行完毕后返回exception。 谁能澄清这个过程究竟是如何发生的?

PermGen和Heap,差异及其意义

朋友们, 你能否告诉我Heap和PermGen的意义,差异和用途。 最好分别知道它们中加载了哪个类。 与Java VM规范相关的解释将非常有用 谢谢Punith