tomcat启动后,不能执行java或javac命令
Java code
JAVA_OPTS="-server -Xms256M -Xmx256M -Xss128k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M"
我是linux系统,内存1GB,tomcat/bin下的catalina.sh加入上述参数后,在shell里输入java或者javac会出现下列错误提示:
Java code
[zoutuo@zousServer SSLSocket]$ java
Error occurred during initialization of VM
Could not reserve enough space for code cache
[zoutuo@zousServer SSLSocket]$ javac
Error occurred during initialization of VM
Could not reserve enough space for code cache
[zoutuo@zousServer SSLSocket]$
请问这是为什么?我的内存可是1G的。。。而且我还要运行一个jar文件,java都用不了,java -jar 更用不了了。。。。
------解决方案--------------------你这个XX:PermSize配置的也不小啊。
你还是用top看看空闲内存究竟还剩多少吧。
------解决方案---------------------Xms256M -XX:PermSize=256M,这两个加起来就是 512MB 了。
你尝试下缩小XX:PermSize参数吧,比如修改为:
-XX:PermSize=128M -XX:MaxPermSize=128M
------解决方案--------------------不是内存泄露的问题。当然我不是说你一定没有内存泄露,只是因为JVM如果内存泄露,基本都是以OOM收场的,不会泄漏到操作系统级别。
你的操作系统本身就需要内存,Tomcat启动就干掉了256+256=512,实际上你的可用内存就没多少了;只不过内存也是慢慢要上来的,不是一启动就把512M全部拿走,所以你的感觉是内存慢慢被吃没。
我建议你配置Tomcat不要太狠了,最好进一步尝试缩小内存,比如: -Xms128M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=64M。如果你的JAR包不是非常非常大的话XX:PermSize甚至32M都可以了。
------解决方案--------------------◎ 你是说在执行jar包的时候也加上-XX:PermSize=32M -XX:MaxPermSize=32M 这两个参数?
——没,我是说,你可以考虑吧Tomcat的这个参数调整小点;其实一般不设置这个参数,除非你的项目引用了太多太多的JAR包,或者用了大量的static量,从而导致非堆内存区不足彩需要加这个参数来调大。
◎ 还有,什么叫“jvm如果内存泄漏,基本都是以00M收场”?
——OOM就是Out Of Memory 的异常,简称OOM。是Java获取不到足够内存时所抛出的异常,你可以这么干来得到这个异常,在Eclipse里面写个代码,死循环不断分配一个100KB的字节数组,然后把这个字节数组add到ArrayList里面去,这样JVM就会没法GC到任何内存,最后OOM嗝屁。
◎ 当tomcat占到27%时,tomcat是这样设置的:JAVA_OPTS="-server -Xms128M -Xmx128M -Xss128k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=128M"
—— 这个配置,极限就是 128+128 = 256MB,另外再加上JVM自己占用的一些空间,总计估摸着不到300MB。而你的机器是1024MB,所以占 27% 左右也算正常。
------解决方案--------------------
贴代码啥的就免了,操作系统参数啥的并不是我强项,可能帮不到你。
不过看你这个说法的话,我认为Tomcat不会对内存要求很高,可以降低启动内存。
SSL协议处理Tomcat的效率可没有Apache高,如果流量大的话,可以考虑装个反向代理转么负责解决SSL,另外还可以附带处理掉所有静态资源请求,如HTML、jpg、css啥的,如果带宽不够还可以启动deflate压缩。
Anyway,超出命题很多了,且不是一两句可以说完,建议逐步优化,一口也吃不成胖子,呵呵。