jetty tomcat启动时内存溢出出怎么办

博客分类:
在大量请求并且请求处理时间较长的情况下,jetty的nio模式会导致容器运行缓慢。
测试方法:
用apache ab对jetty容器发出大规模持续的并发请求,
用命令“jstat -gcutil -h 10 PID 1000"查看GC情况,等到young、old区到100%时停止施压。
用“jmap -histo PID | less" 可以看到大量的SelectChannelEndPoint对象。
分析一下原因:
首先介绍一下jetty的nio模式,如下图
mainReactor:jetty从线程池中分配一个线程用于接受用户的连接请求(ServerSocketChannel.accpet()),
这个线程就做一件事,接受用户的连接,将channel注册到selector中。
_manager.dispatch(new Runnable()
public void run()
final ServerSocketChannel server=_acceptC
while (isRunning() && _acceptChannel==server && server.isOpen())
SocketChannel channel = server.accept();
channel.configureBlocking(false);
Socket socket = channel.socket();
configure(socket);
_manager.register(channel);
catch(IOException e)
Log.ignore(e);
而jetty的subReactor线程询注册进来的channel,将channel包装成SelectChannelEndPoint对象加入到_endPoints。(可以把endpoint看作是一个连接)
private ConcurrentMap&SelectChannelEndPoint,Object& _endPoints = new ConcurrentHashMap&SelectChannelEndPoint, Object&();
public void doSelect() throws IOException {
else if (change instanceof SocketChannel)
// Newly registered channel
final SocketChannel channel=(SocketChannel)
SelectionKey key = channel.register(selector,SelectionKey.OP_READ,null);
SelectChannelEndPoint endpoint = createEndPoint(channel,key);
key.attach(endpoint);
endpoint.schedule();
为什么要加入到_endPoints,为了对所有的endpoint做空闲检查。
public void doSelect() throws IOException {
// Idle tick
if (now-_idleTick&__IDLE_TICK)
_idleTick=
final long idle_now=((_lowResourcesConnections&0 && selector.keys().size()&_lowResourcesConnections))
?(now+_maxIdleTime-_lowResourcesMaxIdleTime)
dispatch(new Runnable()
public void run()
for (SelectChannelEndPoint endp:_endPoints.keySet())
endp.checkIdleTimestamp(idle_now);
这里有个问题,回收动作需要从线程池中分配线程处理,而如果线程池中没有空闲的线程时,那么回收动作将无法正常进行。所以尝试修改__IDLE_TICK到30毫秒(默认是400),希望能提高空闲检查频率,却无法起效。
还有这个可恶的_endPoints对象,它将持有大量的endpoint,而这些endpoint又得不到及时处理,内存都被它消耗光。
我配置的最大线程池为250,任务队列长度无限制
&Set name="ThreadPool"&
&!-- Default queued blocking threadpool --&
&New class="org.eclipse.jetty.util.thread.QueuedThreadPool"&
&Set name="minThreads"&10&/Set&
&Set name="maxThreads"&250&/Set&
在jvm的young、old区达到100%时,250线程也都已经分配(可以用命令"jstack PID | grep "\"qtp" | wc -l"查看),但是很多都block住了;因为线程运行过程中也会有对象创建,也需要一点内存空间,可已经没有内存空间,杯具就这样发生了。
如果把mainReactor比作人在吃东西,那么subReator就是他的胃在消化,
大部分情况都是吃个7分饱,此时胃的消化能力很强,
一旦出现暴饮暴食,就会出现胃胀,消化能力反而减弱。
一个解决方案:
分析下来觉得jetty缺了胃反射功能,胃胀信息没有即使反馈给大脑。
可以适当扩展一下mainReactor,看下面的代码:
_manager.dispatch(new Runnable()
public void run()
final ServerSocketChannel server=_acceptC
while (isRunning() && _acceptChannel==server && server.isOpen() && !_manager.isLowResourcesConnections())
SocketChannel channel = server.accept();
channel.configureBlocking(false);
Socket socket = channel.socket();
configure(socket);
_manager.register(channel);
catch(IOException e)
Log.ignore(e);
添加了_manager.isLowResourcesConnections()方法,嘴巴准备吃的时候要先问一下胃先。
subReactor添加一个新方法:
public boolean isLowResourcesConnections() {
// 这里的判断阀值是个大概的值。
// 拿配置的阀值和第一个selector的keys大小做比较
// 任何情况下第一个selector都是存在的,所以这个比较还是靠谱的。
return _lowResourcesConnections & _selectSet[0].getSelector().keys().size();
浏览: 90649 次
来自: 杭州
&New class=&org.ecl ...
话说这个帖子好老,看了下3.5.9发现已经是JUC的Concu ...
&之后去了Jboss&,Trustin L ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'一、eclipse jetty启动内存溢出, 异常信息
Exception in thread "ConfigClientWorker-Default" java.lang.OutOfMemoryError: Java heap space
二、解决方法
-XX:MaxPermSize=256m -Xms256m -Xmx512m一、eclipse jetty启动内存溢出, 异常信息
Exception in thread "ConfigClientWorker-Default" java.lang.OutOfMemoryError: Java heap space
二、解决方法
-XX:MaxPermSize=256m -Xms256m -Xmx512m温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
解决办法:设置run as ---&run configuragtions---&jre标签下的属性VM arguments:-server -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled&-XX:+PrintGCDetails -Xloggc:%M2_HOME%/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%M2_HOME%/java_pid.hprof&其中参数说明如下:-XX:+CMSPermGenSweepingEnabled : 允许permgenspace的垃圾回收-XX:+CMSClassUnloadingEnabled&: allows the garbage collector to remove even classes from the memory-XX:PermSize=256M -XX:MaxPermSize=256M : raises the amount of memory allocated to the permgenspace解决失败用例:1.在系统环境变量中添加 MAVEN_OPTS="-Xms40m -Xmx512m -XX:PermSize=512m" 不行,2.在eclipse.ini文件中添加 -Xms40m -Xmx512m -XX:PermSize=512m 也不行。3.run as ---&run configuragtions---&jre标签下的属性VM arguments:-Xms512m -Xmx1024m
阅读(2979)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'eclipse运行maven的jetty插件内存溢出',
blogAbstract:'系统运行在MAVEN中的jetty插件下,当在ECLIPSE运 clean&jetty:run时系统提示OutOfMemoryError: PermGen space。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}09:38 提问
jetty maven运行时 出现503错误 打不开页面 但是后台显示jetty容器正常
jetty maven运行时 出现503错误 打不开页面 但是后台显示jetty容器正常
按赞数排序
兄弟你解决这个问题了吗?
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 maven jetty 内存溢出 的文章

 

随机推荐