Tag: jvm

OpenJDK JVM不会在多个核心上调度线程

当我在随Ubuntu 12.04一起分发的OpenJDK 6 JVM上运行我的multithreadingJava程序时,所有线程都安排在一个内核上。 但是当我从Oracle最新的1.7 JDK在JVM上运行完全相同的程序时,它很好地围绕所有24个可用内核旋转了我的20个线程。 OpenJDK文档解释了Java线程将被分配给本机线程,但它似乎不起作用。 我的OpenJDK安装中是否存在配置错误,或者它是否真的不支持多核硬件? OpenJDK的: java version “1.6.0_27” OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2) OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) Oracle JDK: java version “1.7.0_40” Java(TM) SE Runtime Environment (build 1.7.0_40-b43) Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

如何让JVM启动更快?

可能重复: 如何加快Java VM(JVM)的启动时间? 我正在用Java编写命令行实用程序(或者可能在另一种基于JVM的语言中)。 问题是JVM启动时间。 例如,JVM的启动速度比Python和Ruby慢。 如何让JVM统计更快? 我可以“提前”(在Linux和Windows中)以某种方式加载JVM,以便每次在命令行中运行我的实用程序时都不应该加载它吗?

Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

.class文件中的常量池中有一个“NameAndType”结构。 它用于动态绑定。 类可以“导出”的所有方法都描述为“签名+返回类型”。 喜欢 “getVector()Ljava / util的/矢量;” 当某些.jar中方法的返回类型发生更改时,即使新类型较窄,也会破坏我的代码。 即:我有以下代码: List l = some.getList(); 外部.jar包含: public List getList() 比外部jar更改方法签名到 public ArrayList getList()。 我的代码在运行时死于NoSuchMethodException,因为它无法找到 的GetList()Ljava / UTIL /列表; 所以,我必须重新编译我的代码。 我没有必要改变它。 只需重新编译完全相同的代码! 这也提供了两个方法, 一个签名,但不同的返回类型的能力! 编译器不会接受它,但可以通过直接编码来实现。 我的问题是为什么 ? 他们为什么这样做? 我只有一个想法:在运行时阻止复杂的类型检查。 您需要查看层次结构并检查是否存在具有List接口的父级。 这需要时间,只有编译器才有。 JVM没有。 我对吗? 谢谢。

STS无法在我的机器上启动

我试图在eclipse上设置Spring mvc项目。 基本项目工作正常。 但是使用restful服务,jersey等开始提供与依赖关系相关的许多错误。 所以我打算继续学习STS。 我正在使用STS 2.9.2。 它给了我“创建java虚拟机失败”。 所以我补充道 -vm C:\Program Files\Java\jdk1.7.0\bin\javaw.exe 到STS.ini。 但现在它给了我致命的错误 下面是STS.ini -vm C:\Program Files\Java\jdk1.7.0\bin\javaw.exe -startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar –launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502 -product com.springsource.sts.ide –launcher.defaultAction openFile –launcher.XXMaxPermSize 884M -vmargs -Dosgi.requiredJavaVersion=1.5 -Xmn128m -Xms256m -Xmx768m -Xss1m -XX:PermSize=384m -XX:MaxPermSize=768m Eclipse在我的机器上运行得很好。 由于互联网速度有限,我不想使用Maven或其他构建工具来解决依赖性相关问题。

任何人都可以将这个C ++代码(从OpenJDK6)解释为普通英语吗?

这是OpenJDK6的hotspot/src/share/vm/prims/unsafe.cpp的代码片段(从第1082行开始): // JSR166 —————————————————————— UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) UnsafeWrapper(“Unsafe_CompareAndSwapObject”); oop x = JNIHandles::resolve(x_h); oop e = JNIHandles::resolve(e_h); oop p = JNIHandles::resolve(obj); HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset); if (UseCompressedOops) { update_barrier_set_pre((narrowOop*)addr, e); } else { update_barrier_set_pre((oop*)addr, e); } oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e); jboolean success […]

执行parallelStream.forEach(..)时本机java代码中的NullPointerException

我有以下exception(stacktrace): java.lang.NullPointerException at sun.reflect.GeneratedConstructorAccessor171.newInstance(Unknown Source) ~[?:?] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_40] at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[?:1.8.0_40] at java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:598) ~[?:1.8.0_40] at java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:677) ~[?:1.8.0_40] at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:735) ~[?:1.8.0_40] at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160) ~[?:1.8.0_40] at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174) ~[?:1.8.0_40] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233) ~[?:1.8.0_40] at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) ~[?:1.8.0_40] at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:583) ~[?:1.8.0_40] at com.tradair.tnet.services.trades.TradeService.updateUnrealizedPNL(TradeService.java:173) ~[tnet.jar:5.1.1.0-SNAPSHOT] 从我的TradeService类开始: public void updateUnrealizedPNL(Set orgsToCaluclate, Set orgsToSendUpdate) { orgsToCaluclate.parallelStream().forEach(o -> { pnlService.updateMidPrices(o); Collection allLiveTradesByOrgId = tradesRepository.getAllLiveTradesByOrgId(o.getId()); […]

内存中的“null”在哪里

在java中,您不能在其声明中声明数组的大小 int[5] scores; //bad 我被告知这是因为在初始化对象之前,JVM不会在内存中分配空间。 如果您有一个实例数组变量(使用默认值null自动初始化),该变量是否指向堆中指示为null的位置?

空文件是有效的Java源文件。 如何在JVM中处理它?

空文件是有效的Java源文件,但它是如何在JVM中处理的?

为什么Scala的尾递归慢于Java?

使用尾递归进行简单加法的Scala代码 def add(list : List[Int],sum:Int):Int = { //Thread.dumpStack() if (list.isEmpty) { sum } else { val headVal = list.head add(list.tail, sum + headVal) } } 下面是递归模式下添加的java代码。 public static int add(List list, Integer sum) { // Thread.dumpStack(); if (list.isEmpty()) { return sum; } else { int headVal = list.remove(0); return add(list, sum + headVal); } } […]

字节码以无证方式随时间变化

今天我在openjdk 7上用javaagent和instrumentation来探索大型应用程序(比如带有应用程序的jboss服务器)的类。我每隔10秒就调用所有类的重新转换,所以它们的字节码在我的ClassFileTransformer实现中得到了。 我的实现只是跟踪类的字节码如何随时间变化。 首先,我很惊讶,字段和方法的顺序,方法访问修饰符,常量池的内容和其他类似的东西因检查而异。 但是,它仍然记录在案 。 没有记录的内容 – 某些项目可以在类中创建常量池并注入到方法中。 现在我注意到数字值(Longs,Doubles,Floats等)会发生。 这是它在javap中的样子; 之前: pool: … #17 Float NaNf method: #1 fload #17 //NaNf … 在运行时更改类之后: pool: … #17 Float NaNf #18 Float NaNf method: #1 fload #18 //NaNf <- look, it loads #18 now 我仔细检查过,没有附加任何其他变压器或代理商。 为什么JVM不能让我的字节码保持不变? 我在哪里可以阅读有关此类优化/转换(或其他什么)? 我读过JVM源代码,但这些只让我更加困惑。 我只是想创建一种实时字节码validation器 – 一种安全工具。