正如你可以在下面的屏幕截图中看到的,eclipse和Android SDK Manager(以及其他Java程序)正尝试通过IPv6 TCP / IP堆栈连接到IPv4互联网IP,而Proxifier(代理pipe理器程序,从不介意)不能支持这一点。 如何在Java中禁用IPv6?
越来越多的编程语言(Scala,Clojure,…)出现在Java VM中,因此与Java字节码兼容。 我开始问自己:为什么Java VM? 是什么让它变得如此强大或stream行,以至于有了新的编程语言,这些编程语言似乎越来越受欢迎? 为什么他们不为新语言写一个新的虚拟机?
在Java线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: – locked <0x00002aab329f7fa0> (a java.io.BufferedInputStream) 2: – waiting to lock <0x00002aaaf4ff6fa0> (a org.alfresco.repo.lock.LockServiceImpl) 3: – parking to wait for <0x00002aaafbf70bb8> (a java.util.concurrent.SynchronousQueue$TransferStack) 1:线程已获得对象0x00002aab329f7fa0的locking。 2&3:似乎说线程正在等待所述对象的locking变为可用… 但是2和3有什么区别?
这个问题已经被另一个SO成员问过了,但是被删除的令人失望。 评论说这些测量是有缺陷的,没有意义。 但是我能够用JMH下的一个小基准重现原来的问题: package bench; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.*; import org.openjdk.jmh.runner.options.*; import java.util.concurrent.*; @State(Scope.Benchmark) public class LoopInc { private int getValue() { return ThreadLocalRandom.current().nextInt(2); } @Benchmark public int directInc() { int result = 0; for (int i = 0; i < 1000; i++) { switch (getValue()) { case 0: break; case 1: result++; break; } […]
我已经看到,当错误发生在不同的框架(例如实现EJB规范的框架或某些JPA提供者)时,栈跟踪包含像com.sun.proxy.$Proxy这样的类。 我知道代理是什么,但我正在寻找更多的技术和更具体的Java的答案。 他们是什么? 他们是如何创build的? 与JVM有什么关系? 他们是JVM实现特定的?
我们公司最近从Windows XP升级到Windows 7 Enterprise。 JDK安装不再将user.home设置为用户目录的完整path,而是将user.home设置为%userprofile% 。 这导致了很多与Eclipse,Maven等应用程序有关的问题。我现在必须在每个应用程序的JVM中设置-Duser.home。 有没有人经历过这个? 有没有解决这个问题? 这是否与Windows 7 Enterprise的安装有关? 我已经尝试了1.5 JDK和1.6 JDK。 这是属性列表。 注意user.home: — listing properties — java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=C:\Program Files\Java\jre6\bin java.vm.version=16.0-b13 java.vm.vendor=Sun Microsystems Inc. java.vendor.url=http://java.sun.com/ path.separator=; java.vm.name=Java HotSpot(TM) Client VM file.encoding.pkg=sun.io user.country=US sun.java.launcher=SUN_STANDARD sun.os.patch.level= java.vm.specification.name=Java Virtual Machine Specification user.dir=C:\Users\politesp\Desktop java.runtime.version=1.6.0_18-b07 java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment java.endorsed.dirs=C:\Program Files\Java\jre6\lib\endorsed os.arch=x86 java.io.tmpdir=C:\Users\politesp\AppData\Local\Temp\ line.separator= java.vm.specification.vendor=Sun Microsystems […]
我已经变得越来越习惯Java编程,而不是使用C ++或C编程。我希望能够理解使用JVM解释器导致的性能下降,而不是本机执行相同的“项目”。 我意识到这里有一定程度的主观性, 该scheme的质量将取决于很好的实施。 我对一般意义上的以下几个方面感兴趣: 使用解释器时,必须有一些开销基线。 有一些一般的经验法则要记住吗? 10%15%? (我把这些数字抽出来)我偶尔看过博客,说Java代码几乎和原生代码一样快,但我认为这可能是有偏见的。 JVM垃圾收集器是否增加了运行时性能的显着开销? 我知道cocoa应用程序已经开始使用垃圾收集模型,我同意它使编程更简单,但是花费多less? 从Java进行系统调用的开销是多less? 例如,创build一个Socket对象而不是C socket API。 最后,我记得在某处阅读JVM实现是单线程的。 如果这是真的(我怀疑),这是否意味着Java线程真的不是真正的线程? 通常,java线程是否对应于底层的内核提供的线程? Java应用程序是否能像本地应用程序从多核/多CPU一样获益呢? 任何了解JVM和Java程序性能错综复杂的开发人员的build议都将不胜感激。 谢谢。
我最近一直在研究Java虚拟机规范 ( Java Virtual Machine Specifications ,JVMS),以便更好地理解我的程序是如何工作的,但是我发现了一个我并没有得到的部分。 第4.7.4节描述了StackMapTable属性,在该节中,文档详细介绍了堆栈映射框架。 问题在于它有点罗嗦,我通过实例学习最好; 不通过阅读。 我明白,第一个堆栈映射框架是从方法描述符派生的,但是我不明白这是怎么解释的。另外,我并不完全理解堆栈映射框架在做什么。 我会假设它们与Java中的块相似,但看起来好像你不能在彼此内部有堆栈映射框架。 无论如何,我有两个具体的问题: 堆栈地图框架是做什么的? 第一个堆栈地图框架是如何创build的? 和一个一般的问题: 有人可以提供一个比JVMS更less罗嗦,更容易理解的解释吗?
我正在使用ScalamacrosreplaceJava程序中的一些代码生成组件,并正在运行到Java虚拟机对于单个方法(64千字节)生成的字节代码大小的限制。 例如,假设我们有一个大型的XML文件,它代表了我们想要在程序中使用的从整数到整数的映射。 我们希望避免在运行时parsing这个文件,所以我们将编写一个macros来编译时进行parsing,并使用文件的内容来创build我们方法的主体: import scala.language.experimental.macros import scala.reflect.macros.Context object BigMethod { // For this simplified example we'll just make some data up. val mapping = List.tabulate(7000)(i => (i, i + 1)) def lookup(i: Int): Int = macro lookup_impl def lookup_impl(c: Context)(i: c.Expr[Int]): c.Expr[Int] = { import c.universe._ val switch = reify(new scala.annotation.switch).tree val cases = mapping […]
这是我自己以前的问题的一个后续,我有点不好意思问这个…但无论如何:你将如何从一个独立的Java程序以独立于系统的方式启动第二个JVM? 而且不需要依赖像JAVA_HOME这样的envvariables,因为这可能会指向与当前运行的JRE不同的JRE。 我想出了下面的代码实际上工作,但感觉有点尴尬: public static void startSecondJVM() throws Exception { String separator = System.getProperty("file.separator"); String classpath = System.getProperty("java.class.path"); String path = System.getProperty("java.home") + separator + "bin" + separator + "java"; ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp", classpath, AnotherClassWithMainMethod.class.getName()); Process process = processBuilder.start(); process.waitFor(); } 而且,当前正在运行的JVM可能已经被第二个JVM不知道的其他参数(-D,-X …,…)启动了。