草庐IT

java - 是否可以从类文件中查看 JVM 操作码?

这个问题在这里已经有了答案:IsitpossibletoviewaJavaclassfilesbytecode[duplicate](4个答案)Javadecompilervsjavadisassembler[closed](1个回答)关闭8年前。这其实不是反编译,我不想看源码,而是想看JVM指令,比如invokesome/package/method()V。是否有用于此目的的工具?

Java HotSpot(TM) 64 位服务器 VM 警告、CentOS、SmartGit、SmartSvn

在运行SmartGit提供的shell脚本时,JavaHotSpot(TM)64-BitServerVMwarning:Youhaveloadedlibrary/home/User/.smartgit/6/jna-tmp/com/sun/jna/linux-i386/libjnidispatch.sowhichmighthavedisabledstackguard.TheVMwilltrytofixthestackguardnow.It'shighlyrecommendedthatyoufixthelibrarywith'execstack-c',orlinkitwith'-znoex

java - 使用 JVM Nashorn (Play Framework) 呈现 React.js 时出错。我得到 "null is not a function"

我一直在阅读本教程:http://tylermcginnis.com/reactjs-tutorial-a-comprehensive-guide-to-building-apps-with-react/,并在使用Nashorn在JVM上渲染React时遇到问题。我的App.js文件如下。在客户端上运行时它可以正常工作。只是在使用Nashorn/JVM时报错:varApp=React.createClass({getInitialState:function(){return{name:'TylerMcGinnis',friends:['JakeLingwall','MurphyRan

java - 不同语言的数组 - 存储引用或原始对象?

在使用数组时,我正在努力思考原始内存在不同语言中的样子。考虑以下Java代码:Stringa="hi";Stringb="there";Stringc="everyone";String[]array={a,b,c};很明显数组保存的是引用,而不是对象;也就是说,内存中有一个包含三个引用的连续数组,每个引用都指向内存中对象所在的某个其他位置。所以对象本身不一定位于三个连续的桶中;而是引用。现在考虑一下:String[]array={"hi","there","everyone"}我想在这种情况下字符串与内存中的所有其他常量一起存在于某个地方,然后数组保存对内存中这些常量的引用?因此,同

java - JVM Bytecode,如何找到局部变量的类型?

我正在研究afork来自Jetbrains的FernFlower,我一直在对其进行小的改进。关于FernFlower真正让我恼火的一件事是,它根据局部变量在bpush/spush等中的值来确定局部变量的类型。而Jode和Procyon以某种方式找到了找到局部变量原始值的方法。这是原始源代码。publicstaticvoidmain(String[]args)throwsException{inthello=100;chara2=100;shorty1o=100;inthei=100;System.out.println(a2+""+y1o+","+hei+","+hello);}当用F

java - 为什么一个采用可变参数的方法只有在它是静态的情况下才能被优化为一系列单态调用?

在vJUG24,其中一个主题是JVMperformance.可以找到幻灯片here.他有一个例子:staticvoidlog(Object...args){for(Objectarg:args){System.out.println(arg);}}这是通过调用的(不能完全正确地阅读幻灯片,但它是相似的):voiddoSomething(){log("foo",4,newObject());}他说因为是静态方法,可以这样内联优化:voiddoSomething(){System.out.println("foo");System.out.println(newInteger(4).toS

java - jvm +LogCompilation输出中 "callee is too large"的含义

所以在+LogCompilation的输出中打印了消息calleeistoolarge和toobig与特定方法相关联(以及编译器决定不内联)。但是“被调用者”不是方法本身吗?这还有什么意思?如果是这样,“calleetoolarge”和“toobig”之间的区别是什么——它们的意思不一样吗(也许这只是一条遗留的日志消息,2位工程师对同一件事使用不同的语言?)或者“callee”是否真的意味着“caller”?不内联的任何一个理由都是合理的。我有点不好意思,我不明白这一点。 最佳答案 HotSpotJVM有两个JIT编译器:C1和C2

java - 为什么即使每个字段都是 4 字节对齐的,Java 对象中仍存在内部碎片?

简介:我使用了JOL(JavaObjectLayout)tool为研究目的分析Java对象的内部和外部碎片。在这样做的过程中,我偶然发现了以下内容:x@pc:~/Util$java-jarjol-cli-0.9-full.jarinternalssun.reflect.DelegatingClassLoader#WARNING:UnabletoattachServiceabilityAgent.Youcantryagainwithescalatedprivileges.Twooptions:a)use-Djol.tryWithSudo=truetotrywithsudo;b)echo0

java - VMware guest 中的 JVM 堆大小调整

这个问题的措辞可能更好:在VMwareESX等管理程序上运行Java服务器如何影响Java堆?从操作系统/管理程序的角度来看,对JVM堆的访问是随机的guest操作系统或管理程序很难优化随机访问的内存鉴于此,管理程序能否检测到JVM堆中未使用的页面?Java服务器应用程序的传统观点认为,如果您在JVM启动时分配所有堆,而不是允许堆在需要时动态调整大小,则性能最佳。换句话说,如果您将堆大小设置为1GB,您的Java进程将获取1GB的连续虚拟地址空间(加上二进制文件所需的任何内容),其他应用程序不再可用的内存。VMware是否足够聪明,可以检测到其中一些堆实际上未被使用?这对GC性能有何影

java - 当 JVM 停止线程时,为 java 用户线程调用清理方法

我有在Linux上运行的J2SE应用程序。我已经停止应用程序脚本,我正在其中杀死J2SEpid。这个J2SE应用程序有6个无限运行的用户线程,它们将轮询后端数据库中的一些特定记录。当这个javapid被杀死时,我需要为每个长时间运行的线程执行一些清理操作,比如连接到数据库并将一些正在进行的事务的状态设置为空。有没有办法在每个线程中编写一个方法,在线程将要停止时由JVM调用。 最佳答案 您始终可以尝试使用Runtime.addShutDownHook实现关闭Hook,或者将长时间运行的代码封装在try中,将清理封装在finally中。