每个人,
几周前,我们将后台应用程序从 Oracle Java 8 更改为采用 JDK 11(热点)。在最初的几周和几个月里,我们没有注意到任何事情,但现在我们的数据中心正在等待更新。在测试系统中我们注意到存在内存问题。
我们在一台服务器上运行最多 30 个应用程序实例。每一个都与 Tanuiksoft Service Wrapper 一起运行,并根据实例分配了不同数量的 XMX 内存。
我们的服务每 10 分钟打印一次以下信息
double total = Runtime.getRuntime().totalMemory() / 1024;
double max = Runtime.getRuntime().maxMemory() / 1024;
double free = Runtime.getRuntime().freeMemory() / 1024;
int activeThreads = Thread.activeCount();
logger.info("Memory: [total={0}] [max={1}] [free={2}] [active threads={3}]", //
total, max, free, activeThreads);
Run Code Online (Sandbox Code Playgroud)
这是 Java 8 的输出,其中总内存减少。
如果我理解正确的话,totalMemory 是虚拟机让操作系统保留的内存 - 那么该内存将不再可供操作系统使用。最大内存被理解为服务包装器中的 XMX 参数。freeMemory 是totalMemory 中仍然空闲的内存。
当时的输出看起来像这样
Memory: [total=278,016] [max=466,432] [free=183,895] [active threads=33]
Memory: [total=278,016] [max=466,432] [free=176,264] [active threads=33]
Memory: [total=259,072] …Run Code Online (Sandbox Code Playgroud) 我的应用程序运行时.我收到一条消息说:
Ping: Timed out waiting for signal from JVM.
The JVM was launched with debug options so this may be because the JVM
is currently suspended by a debugger. Any future timeouts during this
JVM invocation will be silently ignored.
Run Code Online (Sandbox Code Playgroud)
那是什么意思?它似乎会阻止来自外部的任何网络请求?因为当我上传文件时,它失败了.帮我 .
我一直在自定义应用程序中使用Java Service包装器已经有一段时间了,它一直运行良好.由于在最近几天将我们的应用程序更新到新版本,JVM开始挂起,然后包装器在日志中打印出来:JVM出现挂起:超时等待来自JVM的信号.
然后它会自动终止JVM并再次启动应用程序.这在大约10个小时的运行后发生,这使得调试变得更加困难.
当然,我将查看我们所做的更改,但没有做出重大更改,我怀疑是会导致此类问题.
我在哪里可以尝试找出发生了什么?来自应用程序的调试消息并不表示任何有趣的内容 如果JVM崩溃了,它通常会创建一个转储,这可以帮助调试它,但它是挂起的,所以它不会创建转储.如果我没有自动重启服务,我可以做些什么来重新启动它之前从JVM中获取一些有用的信息?
在我看来,JVM不应该挂起典型的编程错误.你之前遇到什么会导致JVM挂起?
我们正在使用供应商许可的Tanuki Java Service Wrapper副本来启动他们的平台.它附带了每个O/S风格和体系结构的包装器,推荐的配置文件是一个带有3 gig堆的64位VM.
我们使用64位Redhat,但是我一直无法找到强制wrapper.sh脚本使用wrapper-linux-x86-64二进制文件的包装器配置选项.我能够让包装器以64位模式启动的唯一方法是删除wrapper-linux-x86-32二进制文件.
有没有办法强制包装器进入64位模式?是否只是尝试选择最快的适当VM设置并选择32位模式,因为我们的堆小于4 gig?
我想了解更多有关java-service-wrapper如何做出32/64位决定但无法在线查找的信息.
我有一个作为win-service运行的应用程序(使用Apache-Procrun).我想用JVisualVM监视该应用程序.我--openpid <PID>没有成功使用命令行参数,具有讽刺意味的是,旧的JConsole设法连接到该应用程序.

我还检查%TMP%\hsperfdata_username了JVisualVM- 故障排除指南中描述的-Directory的所有问题.一切都很好.
如何让JVisualVM监控我的应用程序?
我正在运行Java服务来从数据库中轮询数据.在我的班级中,我有一个线程,它每隔5秒在db中查找数据...在特定时间(比如在营业时间之后的下午6点),我让我的线程睡到一些配置的时间延迟.
问题:当我让我的线程进入睡眠状态时,似乎我的Java服务重新启动...为什么我要启动4,5个JVM ...请帮助我理解....
ERROR | wrapper | 2013/12/21 15:40:10 | JVM did not exit on request, termination requested.
STATUS | wrapper | 2013/12/21 15:40:10 | JVM exited after being requested to terminate.
STATUS | wrapper | 2013/12/21 15:40:14 | Launching a JVM...
INFO | wrapper | 2013/12/21 15:40:14 | Command: "C:\Windows\system32\java.exe" -Dfile.encoding=Cp1252 -Duser.language=en -Djava.library.path="../lib" -classpath "java-windows-OSN-service.jar;../lib/wrapper.jar;../lib/log4j-1.2.15.jar;../lib/sqljdbc4.jar" -Dwrapper.key="PHie-UB6SOJ9BBlfqJKjPuopQ40gFfnH" -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=6116 -Dwrapper.version="3.5.22-pro" -Dwrapper.native_library="wrapper" -Dwrapper.arch="x86" -Dwrapper.cpu.timeout="10" -Dwrapper.jvmid=4 -Dwrapper.lang.domain=wrapper -Dwrapper.lang.folder=../lang com.servion.service.ServiceController
INFO | jvm 4 | 2013/12/21 15:40:15 | Control Event: 1 …Run Code Online (Sandbox Code Playgroud) 我目前正在使用java服务包装器来包装我开发的java应用程序.我需要能够通过java服务包装器将额外的命令行参数传递给我的应用程序.
假装我的应用程序名为myapp,我设置了java服务包装器,以便我运行的脚本称为myapp.我希望能够做到这样的事情:
./myapp start Parameter1 parameter2
并将这些附加参数传递到我的应用程序中.任何想法如何做到这一点?我发现谷歌搜索和查看文档只是拉起如何使用命令行参数来设置java服务包装器.我很难找到关于将命令行参数传递给应用程序的任何内容,除非在wrapper.conf文件中对它们进行硬编码.
现在我觉得我的选择是获取额外的命令行参数,将它们设置为环境变量并在wrapper.conf中进行硬编码.我宁愿不去那条路而且我希望我忽略了一些东西.
我想问一下这里是否有人知道如何优化JVM的内存使用?我们正在使用一个调用JVM的Java服务包装器(YAJSW),物理内存使用量大约为40MB.我想减少这个让我们说5-10MB.我该如何实现这一目标?
到目前为止,我只有以下配置:
java =-Xmx1024m
我也试过这个:
java =-Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=2 -XX:PermSize=256m -XX:MaxPermSize=256m
但是这些配置设置完全没有区别.什么是正确的配置设置?或者,我还需要做些什么来优化这个?
提前感谢您的回答.
我正在尝试使用Tanuki Java Service Wrapper.我正在使用的硬件是Raspberry Pi,带有Raspbian喘息声.(见http://www.raspberrypi.org/downloads)
我已经尝试了Wrapper 32位armel版本,但是在阅读libwrapper.so时遇到了问题.
信息| jvm 1 | 2013/04/24 20:15:34 | WrapperManager:初始化...
INFO | jvm 1 | 2013/04/24 20:15:42 | WrapperManager Debug:尝试加载名称为libwrapper.so的本机库结果:/usr/iHome/lib/libwrapper.so:/usr/iHome/lib/libwrapper.so:无法打开共享对象文件:没有这样的文件或目录
我也尝试过armhf版本,因为似乎"apt-get java-7-openjdk"安装了jdk-armhf版本,但是在启动Wrapper时我确实得到了"Segmentation fault".
一些额外的信息:
pi @
raspberrypi/usr/lib/jvm $ java -version java version"1.7.0_07"OpenJDK Runtime Environment(IcedTea7 2.3.2)
(7u7-2.3.2a-1 + rpi1)OpenJDK Zero VM(build 22.0-b10,mixed模式)
pi @ raspberrypi/usr/lib/jvm $ ls -altr
total 28 -rw-r - r-- 1 root root 2437 Sep 26 2012 .java-1.7.0-openjdk-armhf.jinfo lrwxrwxrwx
1 root root 20 2012年9月26日java-1.7.0-openjdk-armhf - > java-7-> openjdk-armhf drwxr-xr-x 3 root …
如何将Spring Boot应用程序包装为linux守护程序并将其设置为从application.properties中读取。
要使用application.properties中的参数启动jar,请使用以下命令:
java -Dspring.config.location = / application.properties -jar MyJar.jar
在wrapper.conf中在哪里设置?
我已经尝试过了,但是jar不是从application.properties中的参数开始的。
wrapper.java.command=java
wrapper.java.command.loglevel=INFO
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=/opt/MyService/lib/MyApp.jar
wrapper.java.library.path.1=../lib
wrapper.logfile=../logs/wrapper.log
wrapper.app.parameter.1=/opt/MyService/lib/MyApp.jar
wrapper.app.parameter.2=-c
wrapper.app.parameter.3=/opt/MyService/lib/conf
Run Code Online (Sandbox Code Playgroud) java ×8
jvm ×2
debugging ×1
hang ×1
jboss ×1
jconsole ×1
jvisualvm ×1
linux ×1
memory-leaks ×1
optimization ×1
procrun ×1
raspberry-pi ×1
spring-boot ×1
tanuki ×1