一个关于jvm堆溢出引发的思考

2023-11-20

在本地测试无误的程序,放上正式服时,出现了堆溢出,本地是Windows系统下的,服务器是linux系统,后来经过测试发现是我在本地跑程序时,在eclipse中添加了如下参数:


此处先解释下上面各参数的的含义:
-Xms512m 堆的最小值 
-Xmx1024m 堆的最大值 
另外jvm垃圾回收采用分代搜集的方法,把堆分为三个部 分,新域,旧域和永久域。Jvm生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。在永久域中jvm则存储 class和method对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分 
-XX:MaxPermSize=512 设置永久域的最大值, 
-XX:ReservedCodeCacheSiz e=64m  缓存,可以自己改,超过也溢出,不过,溢出也无所谓,忽略即可
我猜想是不是因为tomcat没有设置上述参数导致的;因为一开始我都是依赖eclipse来启动tomcat的,所以tomcat在启动时就会去加载eclipse中配置的环境,而正式服服务器启动是脱离ide的,所以并没有这些参数设置?
为了验证我的猜想;
我特地去我本地拿tomcat跑程序,不依赖eclipse去启动,此时本地tomcat并未设置上述参数;结果如下:

果然本地的tomcat不依赖eclipse也出现了堆溢出
找到tomcat的配置文件:tomcat的安装目录下的bin下面

此处解释下,为什么会有2个Catalina文件,后缀名为.bat的是windows下的配置文件,后缀名为.sh的为Linux下的配置文件,话不多说
打开Catalina.bat文件,找到如下位置:

JAVA_OPTS:java相关运行参数
此处应该是配置了tomcat默认的JAVA_OPTS参数
在此处前面添加:(具体添加位置我还没有弄清楚,我是加在此处也有效,就暂时加在这了)
set JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx1024m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=64m

添加完成后,保存,重新启动tomcat:结果ok了


ok,下面我来讲下如何在Linux环境下,配置tomcat的Java运行环境:
首先同样的找到,tomcat的安装目录下的bin,然后打开 Catalina.sh文件;
找到如下位置:

在此处添加:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:ReservedCodeCacheSize=64m -XX:MaxPermSize=512m"
保存,ok!!!
以上参数的具体大小,和需要配置的参数,根据自己的实际情况更改

下面我将附上jvm参数大全:







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个关于jvm堆溢出引发的思考 的相关文章

  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • Intellij Idea 使用什么 JVM 来启动?

    我是 Eclipse 用户 最近决定尝试 Intellij Idea 我的操作系统是 Ubuntu 12 使用 Eclipse 时 可以通过在 eclipse ini 中指定来轻松选择用于启动 Eclipse 的 JVM http wiki
  • Scala 对大数的阶乘有时会崩溃,有时不会

    以下程序经过编译和测试 有时返回结果 有时充满屏幕 java lang StackOverflowError at scala BigInt apply BigInt scala 47 at scala BigInt equals BigI
  • 可以混合使用 JVM 语言吗?即:Groovy 和 Clojure

    我知道你可以轻松地混合groovy java clojure java 无论什么JvmLang java 这是否也意味着我也可以让 clojure 和 groovy 代码进行交互 如果我使用 Grails 或 jRoR 我也可以在该环境中使
  • jvm 如何以及何时何地更改 Linux 的最大打开文件值?

    在linux中 每个登录用户的每个进程的最大打开文件数有限制 如下所示 ulimit n 1024 当我学习java nio时 我想检查这个值 因为channel在Linux中也是一个文件 所以我编写了一个客户端代码来不断创建socketC
  • 在正在运行的 JVM 中查找正在运行的实例

    我想知道是否可以获取给定类的正在运行的实例的句柄 触发此问题的特定问题是应用程序由于存在大量正在运行的线程而无法正常退出 是的 我知道您可以对 thead 进行守护进程 然后它们就不会阻止应用程序退出 但这确实让我想知道这是否可能 我能做的
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • Java:为什么它使用固定数量的内存?或者它如何管理内存?

    JVM 似乎使用了一些固定数量的内存 至少我经常看到参数 Xmx 对于最大尺寸 和 Xms 对于初始大小 这表明 我感觉 Java 应用程序不能很好地处理内存 我注意到一些事情 即使一些非常小的示例演示应用程序也会加载大量内存 也许这是因为
  • 使用 javac 和 javax.tools.JavaCompiler 有什么区别?

    Maven 编译器插件文档states http maven apache org plugins maven compiler plugin 编译器插件用于编译项目的源代码 从 3 0 开始 默认编译器是 javax tools Java
  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 使用 libjvm.so 时出现 Sigsegv Java 致命错误

    我正在做重启测试Sles12sp2 using STAF v3 4 24一段时间后我收到此错误 A fatal error has been detected by the Java Runtime Environment SIGSEGV
  • 是否有一种轻量级方法可以在 Java 9+ 中添加安全点

    Java 9 中是否有更便宜的方法调用可以保持其安全点 JVM 在运行时删除安全点以提高效率 但这可能会使分析和监视代码变得更加困难 为此 我们特意添加了一些简单的调用精心挑选确保存在安全点的地方 public static void sa
  • 有没有一种独立的JAVA可以在PC上运行而无需任何操作系统

    据我所知 java 程序可以在任何操作系统上运行 任何类型的机器都有 JVM 我需要一个在我的 PC 上独立运行的 JVM 而不是在我的操作系统 Windows 或任何其他操作系统 上运行 我的意思是 JVM 的作用类似于启动 而不是操作系
  • JVM 最大堆大小可以是动态的吗?

    JVM Xmx 参数允许将 JVM 的最大堆大小设置为某个值 但是 有没有办法让这个价值动态化呢 换句话说 我想告诉 JVM 看 如果你需要它 就继续从系统中获取 RAM 直到系统退出 提问原因分为两部分 首先 所讨论的应用程序可以根据用户
  • Java 8:为什么元空间大小增加但加载的类数量保持不变?

    在 Jdk 8 上运行的应用程序中 我们使用 VisualVM 来跟踪加载的类的使用情况和元空间的使用情况 在我们的应用程序运行时的某个时间点 我们看到加载的类的数量不再增加 但元空间的大小在程序运行时仍然增加 那么除了类之外 还有什么东西
  • 从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法

    我有一个桌面应用程序 当有人按下按钮时 我希望它启动另一个执行类的 main 方法的 JVM 我的桌面应用程序已经依赖于包含具有我想要执行的 main 方法的类的 jar 目前我有以下代码 但是 我希望它们是一种更优雅的方法 Runtime
  • 如果我使用最新的 JDK 编译 Java 文件,较旧的 JVM 是否能够运行 .class 文件?

    字节码是否取决于创建它所用的 Java 版本 如果我在最新的 JDK 中编译了 java 文件 较旧的 JVM 是否能够运行 class 文件 这取决于三件事 The actual Java versions you are talking
  • 运行具有外部依赖项的 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 ht

随机推荐