Tag: jvm

为什么java无法从死锁中恢复?

我正在阅读Java Concurrency in Practice一书,这里有关于死锁的内容。 JVM无法从死锁中恢复,只有摆脱死锁的方法是重启服务器。 它还提到JVM使用图搜索,其中Thread充当图节点,并且两个线程A和B之间的边缘被定义为线程A正在等待线程B已经拥有的资源上的锁定。该图是有针对性的,如果有任何周期这个图,然后有死锁 现在我的问题是,如果JVM知道存在死锁,那为什么不杀死一个线程并让其他线程继续? 这背后是否有任何具体原因或我的问题本身是基于错误的结论? 请告诉我您对此的看法。 提前致谢!!!

何时何地在Java源代码中初始化/存储String?

这是我的源代码: public class Koray { public static void main(String [] args) { System.out.println(“This is a sample program.”); } } 当我编译它时,我得到字节码。 当我用hex查看器查看字节码时,我看到部分: 19 54 68 69 73 20 69 73 20 61 20 73 61 6D 70 6C 65 20 70 72 6F 67 72 61 6D 2E 可以读作 This is a sample program. 如果字节被解释为字符。 而当我这样做 […]

将JVM绑定到默认值以外的IP

我有一个多宿主系统,有多个NIC和IP。 我不确定我的Sun JVM如何选择代表’this’系统的IP(当使用Socket或URLConnection连接到另一个系统时,这是“ 源IP ”)。 它是选择系统默认NIC,还是可以对系统名称进行反向查找? 等等 在任何情况下,有没有办法将JVM显式绑定到特定的IP? 或者,如果有人知道如何从Axis Webservices框架那样做,那将是非常有帮助的。 非常感激..

IntelliJ IDEA 13.1 – 如何使用3GB RAM防止32位操作系统(Win 7)上的内存不足问题

由于RAM量不足 ,我在使用IntelliJ IDEA 13.1 (目前为13.1.6)时遇到了一些内存问题 。 我在一个非常大的项目上工作,经常在调试模式下运行一些maven构建和Web应用程序。 我有一个32位操作系统 (Windows 7), 3 GB RAM和一个SSD 。 我使用的是JDK 7 。 在IntelliJ IDEA内部运行的Maven构建通常由于内存不足而失败,我必须从故障点恢复它们。 当我执行Maven构建或尝试使用IntelliJ IDEA启动Web应用程序时,Windows系统会显示警告“ 您的计算机内存不足 ”。 我在配置文件“ idea.exe.vmoptions ”中使用以下设置(位于与“idea.exe”文件相同的目录中): -server -Xms128m -Xmx700m -XX:MaxPermSize=250m -XX:ReservedCodeCacheSize=64m -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djsse.enableSNIExtension=false -XX:+UseCodeCacheFlushing -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 MAVEN_OPTS环境变量设置为以下值: -Xmx1024m -Dfile.encoding=UTF8 我已经禁用了未使用的插件 ,并发现在耗尽内存的操作之后重启IDEA很有用 ,例如在Maven构建之后。 我还发现, 关闭尽可能多的其他应用程序会有所帮助,但并非总是如此。 然而,所有上述技巧并没有消除这些问题 。 除了扩展RAM或更改为64位操作系统之外, 您有什么建议 ? 你知道“idea.exe.vmoptions”文件的一些更好的设置吗?

除了jmap之外还有一个命令行方法来获取jvm堆转储吗?

我们在linux中使用oracle jvm 1.8 64bit。 我们知道jmap可以获得jvm堆转储: jmap -F -dump:format=b,file=***filepath*** ***pid*** 但它很慢。 我们知道使用JVisualVM和连接到JMX的JConsole也可以获得堆转储,而且速度非常快。 但它们与GUI有关。 但是,在我们的产品环境中,没有GUI。 没有带GUI的机器可以访问该环境。 所以我们的问题是 – JVisualVM和JConsole是否支持命令行来进行堆转储? 或者除了jmap之外还有一个命令行方法来获取jvm堆转储吗? 我们今天试过 – 1,使用jvisualvm(远程jmx),我们可以成功获得堆转储 2,使用不带-F选项的jmap,转储失败: [root @panda01~] #jmap -dump:format = b,file = / tmp / heapdump.31941.hprof 31941 31941:无法打开套接字文件:目标进程未响应或未加载HotSpot VM 当目标进程没有响应时,可以使用-F选项 3,使用带有-F选项的jmap,转储成功,但速度慢: [root @panda01~] #jmap -F -dump:format = b,file = / tmp / heapdump.31941.hprof 31941 正在处理ID 31941,请等待…… 调试器连接成功。 服务器编译检测到 […]

Java 8和Java 9之间ZoneDateTime精度的差异

我执行以下代码,我在Java 8和Java 9之间得到了不同的精度。 import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class TimeTest { public static void main(String[] args) { System.out.println(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.now())); } } 用Java 8输出 $ java -version java version “1.8.0_162” Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode) $ java TimeTest 2018-01-31T10:30:49.397Z 而Java 9 $ java -version java version “9.0.4” […]

通过JNI部署JRE:jvm.dll不能在Windows上运行或

所以我正在创建一个将Java Runtime Environment(JRE)打包为资源的Win32应用程序。 应用程序将资源提取到磁盘并解压缩。 现在,我想使用此JRE以使用调用API运行Java程序。 一旦我改为程序指向提取的JRE的jvm.dll而不是安装的JRE(这是我复制的),我收到此错误: \ jre1.8.0_31 \ bin \ server \ jvm.dll要么不是设计为在Windows上运行,要么包含错误。 尝试使用原始安装介质再次安装程序,或与系统管理员或软件供应商联系以获取支持。 错误状态0x000012f 我希望对这个问题做的是记录这个错误以及导致它的原因。 如果可能的话,找到一个解决方案,以便我可以引用提取的JRE。 让我举一些具体的环境。 首先,我正在运行Windows 10 Tech Preview。 我的操作系统,我的程序和我从安装中复制的JRE都是64位的。 此外,当我的程序指向已安装的JRE时,它工作正常,问题仅在于复制的JRE。 还有一些代码可以参考我正在做的事情: typedef jint (JNICALL *CreateJVMFunc)(JavaVM **pvm, void **penv, void *args); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //For brevity I am omitting the extraction/unzipping. //I am […]

哪个JVM具有完整的字节码执行跟踪?

我需要整个Java程序的完整字节码级执行跟踪。 我找到了带有SingleStep事件的JVM TI,它让我能够编写一个能产生跟踪的代理。 但肯定有一个现成的JVM选项吗?

jvm如何处理在循环中创建对象

List list = new ArrayList(); String[] test = {“ram”, “mohan”, “anil”, “mukesh”, “mittal”}; for(int i =0; i < test.length; i++) { A a = new A(); a.setName(test[i]); list.add(a); } JVM如何处理每个循环中对象a的创建? “列表”如何区分不同的实例? 在每次迭代中创建对象是一种好习惯吗? 如果不是,将对象添加到列表中的最佳解决方案是什么。

增加JVM可用的堆空间:OutOfMemoryError:请求的数组大小超过VM限制Ubuntu 64Bit Neo4j 2.0

我的规格: -Ubuntu 64bit -Neo4j 2.0 -32 GB的Ram -AMD FX-8350八核处理器 问题: 我正在使用以下查询向我的Neo4j服务器发出请求: MATCH (being:my_label_2) RETURN being 并给我这个错误: OutOfMemoryError Requested array size exceeds VM limit StackTrace: java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300) java.lang.StringCoding.encode(StringCoding.java:344) java.lang.String.getBytes(String.java:916) org.neo4j.server.rest.repr.OutputFormat.toBytes(OutputFormat.java:194) org.neo4j.server.rest.repr.OutputFormat.formatRepresentation(OutputFormat.java:147) org.neo4j.server.rest.repr.OutputFormat.response(OutputFormat.java:130) org.neo4j.server.rest.repr.OutputFormat.ok(OutputFormat.java:67) org.neo4j.server.rest.web.CypherService.cypher(CypherService.java:101) java.lang.reflect.Method.invoke(Method.java:606) org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139) org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112) 这适用于“my_label_1”,返回大约30k的结果 我认为是问题所在: 我没有足够的内存分配给我的JVM 尝试修复/我在网上找到的东西: 我阅读了手册所说的内容 Ubuntu论坛说要做什么 所以我试着去我的neo4文件夹(像往常一样使用cd)并以这种方式运行它: sudo bin/neo4j start -Xmx4096M 但是那没用。 当Neo4j启动时它确实警告我,我可能没有足够的空间: WARNING: Max 1024 open files allowed, minimum […]