Tag: jvm

直接分配给Old Generation的巨大对象的大小

最近我一直在阅读Java中不同代的对象分配。 大多数时候,新对象在Eden(Young Generation的一部分)中分配,然后如果满足以下任何条件,它们将被提升为Old Generation。 (1)对象的年龄达到了终点 (2)当从伊甸园(或)另一个幸存者空间(从)复制对象时,幸存者空间(to)已满 但也有一个特殊情况,即对象直接分配给老一代,而不是从年轻一代晋升。 当我们尝试创建的对象很大(可能是几MB的数量级)时会发生这种情况。 有没有办法知道巨大/巨大物体的大小/限制? 我知道G1垃圾收集器的巨大对象标准。 我只是想知道Java 6之前或之中的大小限制。 谢谢你的时间 :)

什么是字节码以及JVM如何处理它们

我多次听说Java实现JIT(即时)编译,并且它的跨平台可移植的字节码由JVM“解释”。 但是,我真的不知道字节码是什么,以及JVM在Java语言架构中的实际意义; 我想更多地了解他们。

JVM何时使用内在函数

为什么在JVM内部类中存在的某些代码模式被转换为内部函数,而从我自己的类调用时相同的模式则不然。 例: bitCount函数,当从Integer.bitCount(i)内调用时,将变成一个内在函数。 但是当复制到我的类中然后调用将需要更长的时间来执行。 比较 Integer.bitCount(i) MyClass.bitCount(i) public static int bitCount(int i) { // HD, Figure 5-2 i = i – ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = […]

是否有一种简单的方法可以在Java中获取特定类的所有对象实例

目前我正在使用Java代理来组装内存统计信息。 在instrumentation API的帮助下,我可以掌握类(并操纵它们)。 使用普通Java,我可以估计每个对象使用的资源。 到现在为止还挺好。 我现在面临的问题是“如何掌握特定类的每个Object实例”。 我可以进行字节代码操作以获取对象实例,但我希望有另一个我不知道的API,帮助我在没有如此沉重的侵入性步骤的情况下实现我的目标。 最后,应将性能影响保持在最低限度。 有任何想法吗?

String s = new String(“xyz”)。 执行这行代码后,有多少个对象被创建?

这个采访问题的共同商定答案是代码创建了两个对象。 但我不这么认为; 我写了一些代码来确认。 public class StringTest { public static void main(String[] args) { String s1 = “a”; String s2 = “a”; String s3 = new String(“a”); System.out.println(“s1: “+s1.hashCode()); System.out.println(“s2: “+s2.hashCode()); System.out.println(“s3: “+s3.hashCode()); } } 输出是: 这是否意味着只创建了一个对象? 重申:我的问题是以下代码创建了多少个对象: String s = new String(“xyz”) 而不是StringTest代码。 受@Don Branson的启发,我调试了以下代码: public class test { public static void main(String[] args) { […]

JVM如何决定JIT编译方法(将方法归类为“热门”)?

我已经使用-XX:+PrintCompilation ,我知道JIT编译器的基本技术以及使用JIT编译的原因。 然而,我仍然没有发现JVM如何决定JIT编译方法,即“当JIT编译方法的时候到了”。 我是否正确地假设每个方法都开始被解释,并且只要它不被归类为“热方法”它就不会被编译? 我有一些东西在脑后,我读到一个方法被认为是“热”,当它被执行至少10.000次(解释方法10.000次后,它将被编译),但我不得不承认我是不确定这个或我在哪里读到这个。 总结一下我的问题: (1)只要没有将每种方法归类为“热”方法(并因此已被编译),或者是否有理由使用方法进行编译,即使它们不是“热”的,也会解释每种方法吗? (2)JVM如何将方法分为“非热”和“热”方法? 执行次数? 还要别的吗? (3)如果“热”方法存在某些阈值(如执行次数),是否有Java标志( -XX:… )来设置此阈值?

内存中的方法表示是什么?

在思考Java / C#中的编程时,我想知道如何在内存中表示属于对象的方法,以及这个事实如何涉及multithreading。 是一个单独为内存中的每个对象实例化的方法,还是同一类型的所有对象共享该方法的一个实例? 如果是后者,执行线程如何知道要使用哪个对象的属性? 是否可以在C#中使用reflection修改方法的代码,并且只能修改同一类型的多个对象中的一个对象? 一个不使用类属性的静态方法总是线程安全吗? 我试着对这些问题下定决心,但我对他们的答案非常不确定。

什么是JVM调度算法?

我真的很好奇JVM如何与线程一起工作! 在我的互联网搜索中,我发现了一些关于RTSJ的资料,但我不知道这是否是我答案的正确方向。 我还在sun的论坛http://forums.sun.com/thread.jspa?forumID=513&threadID=472453中找到了这个主题,但这并不令人满意。 有人可以给我一些关于JVM调度算法的指示,材料,文章或建议吗? 我也在寻找有关调度程序中Java线程的默认配置的信息,例如“时间切片时每个线程需要多长时间”。 这个东西。 我将不胜感激任何帮助 ! 谢谢 !

Java中静态字段的确切含义是什么?

我想在同一类的各种对象实例之间共享一个对象。 从概念上讲,当我的程序运行时,A类的所有对象都访问B类的同一对象。 我已经看到static是系统范围的,并且不鼓励使用它。 这是否意味着如果我在实例化A类对象的同一JVM上运行另一个程序,这些对象可能会访问与前一个程序中访问的对象相同的B对象? 使用静态字段背后的缺点一般是什么? 有没有其他选择(不需要大量的实施)?

Java强制转换操作符如何工作?

我正在尝试调试Java中涉及ClassCastException的问题。 为了解决这个问题,我需要知道当我从Object转换为特定类型时会发生什么。 任何人都可以向我解释Java强制转换操作符在Java级别和JVM级别上的工作原理吗?