Tag: jvm

如何在String.valueOf(int)中使用ArrayOutOfBoundsException?

为什么这段代码有时会产生ArrayOutOfBoundsException? String.valueOf(int)怎么可能呢? public static String ipToString(ByteString bs) { if (bs == null || bs.isEmpty()) { return null; } else { StringBuilder sb = new StringBuilder(); boolean started = false; for (Byte byt : bs) { if (started) { sb.append(“.”); } sb.append(String.valueOf(byt & 0xFF)); started = true; } return sb.toString(); } } java.lang.ArrayIndexOutOfBoundsException: -81914 at java.lang.Integer.getChars(Integer.java:458) […]

为什么Java规范要求程序的主要方法只是无效?

虽然返回类型不是方法签名的一部分,但JVM会查找精确的声明 public static void main(String[] args) 我的假设是,由于方法签名没有包含“返回类型”,我必须允许更改返回类型。 但是,如果我将其更改为public static int main(String[] args)并返回一个值,假设为0,则JVM无法执行该程序并退出时出现错误 Error: Main method must return a value of type void in class TestData, please define the main method as: public static void main(String[] args) 为什么Java规范要求主方法只是无效? 当返回类型不是方法签名的一部分时,为什么会出现此限制? 这个问题不同于为什么java中的main()是无效的? :这个问题因基于意见而被关闭,而我正在寻找JVM调用此方法的代码位置/进程,以及强制它们将此方法保持为空的限制。 他们采取了哪些设计决策(以及背后的推理),以及记录在何处。 我正在寻找事实,以便知道为什么会这样做。 如果不仔细阅读问题的详细信息,请不要将其标记为重复。 PS:退出,是另一回事。 我更关心该计划的进入。 此外,返回的值可能不是使用JVM,而是将其限制为void限制可扩展性。 到目前为止,我从这个问题中学到的是:Java规范已明确修复了返回类型,以避免混淆迁移程序员(C / CPP),他们可能期望此值返回到操作系统,但由于JVM介于此之间,因此该值永远不会返回OS。 为了这个特殊目的(返回OS的值),他们提供了System.exit()方法。 对于那些建议返回类型是签名的一部分的人 – 只需尝试在类中定义以下两种方法 public static […]

多个JVM与单个应用服务器

我正在处理一个系统,该系统在每个客户的JVM中运行Java应用程序。 我们现在有大约六个专用服务器,总共运行着近100个JVM,还有一组用于管理这些JVM的自定义脚本。 此设置实际上显示了它的时代:管理许多JVM正在成为监控/管理的噩梦,我们一直在处理堆大小问题。 我们想转向更现代的方法,只需在每个物理机器的单个应用服务器中运行一堆应用程序。 但是,保持应用程序分离确实在隔离方面具有明显的优势(例如,内存不足错误仅影响一个客户)。 每个客户的软件堆栈的内存要求各不相同。 我的问题:有没有办法在这里兼顾两个世界并在一个JVM(应用服务器)中运行多个应用程序并仍然保持一定程度的隔离? 或者,这些天你需要管理一组应用程序的内存需求,这只是现代生活中的事实吗? 除了我在这里缺少的app服务器或Java EE容器(例如Wildfly或Spring)之外,还有其他解决方案吗? 看起来这个系统是另一个时代的坚持!

Java非堆内存和堆栈内存有什么区别? 它们是相同的,如果不是它们之间有什么区别?

我正在使用Jconsole来监视Java应用程序。 内存选项卡显示不同的堆和非堆内存 堆内存使用情况 非堆内存使用情况 记忆池“CMS Old Gen” 记忆池“Par Eden Space” 记忆池“Par Survivor Space” 内存池“代码缓存” 内存池“CMS Perm Gen” 这些术语有什么区别。 另请提供一些信息 – 如何通过监视这些参数来查找应用程序行为中的exception。

Java 6类加载的速度有多快?

ProGuard主页列为一项function: 重新定位和预validationJava 6的现有类文件,以充分利用Java 6的更快的类加载。 这涉及到Java 6的不同之处是什么? 这很重要吗? 它是否会影响multithreading通过默认类加载器的同步方面导致的减速?

Java 8 JIT线程似乎陷入无限循环

我用Java 8编写了一个服务器应用程序,并用java 1.8.0u25运行它。 它在前几个小时工作正常,但在获得大约5k~10k请求后,VM进程的一个线程使用其中一个CPU的100%。 所以我尝试使用jstack for VM进程检查有问题的线程是什么,并且它显示线程(线程id为14303 = 0x37df)是“C2 CompilerThread0”: “C2 CompilerThread0” #6 daemon prio=9 os_prio=0 tid=0x00002aaabc12a000 nid=0x37df runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE 使用jstack -m ,线程的堆栈跟踪如下: —————– 14303 —————– 0x00002b99b67693c3 _ZN16PhaseMacroExpand27process_users_of_allocationEP8CallNode + 0x2a3 0x00002b99b676ec3b _ZN16PhaseMacroExpand23eliminate_allocate_nodeEP12AllocateNode + 0x1cb 0x00002b99b676ee65 _ZN16PhaseMacroExpand21eliminate_macro_nodesEv + 0x1a5 0x00002b99b6772769 _ZN16PhaseMacroExpand18expand_macro_nodesEv + 0x19 0x00002b99b640b01b _ZN7Compile8OptimizeEv + 0xa6b 0x00002b99b640c53c _ZN7CompileC1EP5ciEnvP10C2CompilerP8ciMethodibbb + 0x13bc 0x00002b99b635f9c8 _ZN10C2Compiler14compile_methodEP5ciEnvP8ciMethodi + […]

运行具有外部依赖项的Scala脚本

我在/Users/joe/.scala/lib下面有以下jar: commons-codec-1.4.jar httpclient-4.1.1.jar httpcore-4.1.jar commons-logging-1.1.1.jar httpclient-cache-4.1.1.jar httpmime-4.1.1.jar 下面是我用scala编写的test.sh。 #!/bin/sh -v L=`cd /Users/joe/.scala/lib;pwd` cp=`echo $L/*.jar|sed ‘s/ /:/g’` echo $cp exec scala -classpath $cp $0 $@ !# println(new org.apache.commons.httpclient.HttpClient()) 这是我得到的错误: $ ./test.sh #!/bin/sh -v L=`cd /Users/joe/.scala/lib;pwd` cd /Users/joe/.scala/lib;pwd cp=`echo $L/*.jar|sed ‘s/ /:/g’` echo $L/*.jar|sed ‘s/ /:/g’ echo $cp /Users/joe/.scala/lib/commons-codec-1.4.jar:/Users/joe/.scala/lib/commons-logging-1.1.1.jar:/Users/joe/.scala/lib/httpclient-4.1.1.jar:/Users/joe/.scala/lib/httpclient-cache-4.1.1.jar:/Users/joe/.scala/lib/httpcore-4.1.jar:/Users/joe/.scala/lib/httpmime-4.1.1.jar exec scala -classpath $cp $0 $@ /Users/joe/Desktop/scala/./test.sh:7: error: […]

java程序启动时会发生什么?

最近已经触及Java类加载器并突然认识到,当有人调用时,不能完全理解一步一步发生了什么 java -jar App.jar 好吧,我想 创建了一个新的JVM实例 它使用ClassLoader加载主类和其他类 字节码开始从main()方法执行 但我仍然认为有很多事情我需要了解更多。 谁和如何决定在启动时应该加载哪些类以及哪些类曾经需要? 我找到了两个相关的问题,但没有解释如何将其应用于Java现实。 计算机程序运行时会发生什么? 运行程序会发生什么?

Java:非堆内存分析

我们遇到的问题是我们的非堆内存一直在增长。 所以我们必须每隔3天重新启动我们的jee(java8) – webapp(正如你在这里的截图中看到的那样: 来自非堆和堆内存的截图 ) 我已经试图找出填满非堆的东西了。 但我找不到任何工具来创建非堆转储。 你有什么想法我可以调查一下,找出哪些元素越来越多? Java的版本 java version “1.8.0_102” Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) Tomcat的版本 Apache Tomcat Version 7.0.59

当JVM执行Java应用程序时,操作系统的作用是什么? 为什么我们需要操作系统?

我在互联网上做过一些阅读,有人说Java应用程序是由java虚拟机(JVM)执行的。 “执行”这个词让我感到困惑。 据我所知,操作系统可以执行非Java应用程序(即:用C,C ++编写……)。 在较低级别,这意味着OS将二进制程序加载到内存中,然后指示CPU执行内存中的指令。 那么现在有了JVM,会发生什么? 据我所知,操作系统首先会调用JVM(包含运行时环境)。 从那时起,JVM将为应用程序生成一个(或多个)线程。 我想知道操作系统的角色是否会再次发挥作用? 在我看来,JVM已“绕过”操作系统并直接指示CPU执行应用程序。 如果是这样,为什么我们需要操作系统? 进一步说,JVM将使用其JIT将应用程序的字节代码编译为机器代码,然后执行这些机器代码。 由于它已经是机器码,我们是否还需要JVM? 因为操作系统可以指示CPU执行这些机器代码,而不是JVM。 我在这里犯了什么错吗? 我想从这里的人们那里学到更多东西。 如果我错了,请纠正我。 非常感谢!