Tag: jvm

如何以编程方式生成.class文件?

我想为Java的玩具语言编写一个编译器。 我想生成可运行的.class文件。 我想知道什么是可用的最好的库或工具? 我知道我可以学习所有指令的二进制格式并构建我自己的常量池等,但这似乎应该已经完成​​的工作:没有必要重新发明轮子,对吧? 在线搜索我发现了两种不同的Java汇编语言, Jasmin和Jamaica ,但只有Jasmin看起来有些维护。 是否有用于将字节代码写入流的Java库? 这是Apache BCEL的内容吗? 他们的工具是字节码生成的“标准”,就像Antlr用于解析一样吗? PS-玩具语言是Brainf *** ,我想要一些我可以有一个简单的“语法”的东西,所以我可以专注于生成方面而不是解析部分…将在下一步的后期出现。

JVM如何在函数重载的情况下找到要调用的方法(具有最接近匹配的参数)

JVM决定在编译时调用哪个重载方法。 我有一个例子: public class MainClass{ public static void go(Long n) {System.out.println(“takes Long “);} public static void go(Short n) {System.out.println(“takes Short “);} public static void go(int n) {System.out.println(“takes int “);} public static void main(String [] args) { short y = 6; long z = 7; go(y); go(z); go((Short)y); } } 根据我的理解,它应该打印以下内容: takes Short takes Long takes […]

卸载rJava和/或重新启动JVM

我想将rJava与mcparallel结合使用,但显然JVM不能分叉 。 因此,需要为每个子进程启动单独的JVM实例,例如: library(rJava) library(parallel) myfile <- system.file("tests", "test_import.xlsx", package = "xlsx") #This works: mccollect(mcparallel({ #Automatically initiates JVM in child xlsx::read.xlsx(myfile, 1) })) 但是我的问题是JVM已经在(主)父进程中启动了。 这使得在子进程中无法使用rJava : #init JVM in parent .jinit() #Doesn’t work anymore mccollect(mcparallel({ xlsx::read.xlsx(myfile, 1) })) 所以我真正需要的是在子进程中关闭/终止和重启JVM的方法。 简单地detach(“package:rJava”, unload = TRUE)似乎没有做到这一点。 force.init参数似乎也没有导致重启: #Also doesn’t work: .jinit() mccollect(mcparallel({ .jinit(force.init = TRUE) xlsx::read.xlsx(myfile, 1) })) […]

为什么调用方法的Java字节码隐式获取和释放监视器?

我一直在阅读Java虚拟机指令集,并注意到当使用指令调用标记为同步的方法(例如invokestatic,invokevirtual等)时,由特定的字节码指令来获取接收器上的监视器宾语。 类似地,从方法返回时,由方法同步时指令释放监视器的指令。 这看起来很奇怪,因为有明确的monitorenter和monitorexit字节码来管理监视器。 JVM是否有特殊原因以这种方式设计这些指令,而不是仅仅编译方法以在适当的位置包含monitorenter和monitorexit指令?

Google App Engine沙盒如何运作?

Google App Engine沙盒如何运作? 我需要做些什么来创建我自己的沙盒(为了安全地允许我的客户在我的引擎上运行他们的应用程序而不让他们能够格式化我的磁盘驱动器)? 它只是类加载器魔术,字节操作或什么?

添加For循环可防止OutOfMemoryError

当我删除for循环时,我得到一个OutOfMemoryError。 当我使用for循环时,我没有得到错误。 任何人都可以帮助我理解这种行为吗? public class JavaMemoryPuzzlePolite { private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6); public void f() { { System.out.println(dataSize); byte[] data = new byte[dataSize]; } for (int i = 0; i < 1; i++) { System.out.println("Please be so kind and release memory"); } System.out.println(dataSize); byte[] data2 = new byte[dataSize]; } public static […]

为什么通用列表声明的区别?

我想要两个列表:第一个是整数列表。 我认为它是: List ints= Arrays.asList(1,2,3); 它工作正常。 第二个是对象列表。 我声明为: List objs= Arrays.asList(1,2.13,”three”); 但是一旦我写它就会在eclipse中出错。 错误是: Multiple markers at this line – Type mismatch: cannot convert from List<Object&Comparable&Serializable> to List – Type safety: A generic array of Object&Comparable&Serializable is created for a varargs parameter 相反,如果我写 List objs = Arrays.asList(1,2.13,”three”); 它工作正常。 我无法弄清楚原因。

有哪些JVM组装商?

我想要一个简单明了的JVM汇编程序。 它应该采用以Java虚拟机规范中描述的助记符语言编写的文本文件,并生成类文件,即字节码。 要明确:我不想要一个可以从API调用生成类文件的库。 JVM汇编程序的当前状态是什么? 它们是否支持invokedynamic(对我而言不是强制性的,但有优势)? 我可以使用哪些操作系统? 他们各自的利弊是什么?

以与平台无关的方式将环境变量传递给JVM

我正在开发一个在Windows Vista机器上运行JBoss的J2EE应用程序,但该应用程序最终会在Linux机器上运行。 有没有办法以独立于平台的方式传递环境变量的值? 我认为(但我不确定)平台敏感的方式是: -Denv_var=%MY_ENV_VAR% (Windows) -Denv_var=$MY_ENV_VAR (Linux) 从那里我将使用访问值(在Java中) System.getProperty(“MY_ENV_VAR”); – 那是对的吗? System.getenv(String name)的Javadoc System.getenv(String name)似乎暗示该方法依赖于平台,但我不清楚。 我是否可以完全跳过将变量完全传递到JVM中,并在使用OS设置环境变量的值后使用getenv() ?

JVM是否可以同时运行多个程序?

JVM是否可以同时运行多个程序? 如果是这样,怎么样? 如果没有,为什么? 要运行程序,我们就是这样做的 java ProgramName 但是我们可以使用相同的JVM实例来运行另一个程序吗?