com.sun.net.httpserver内存泄露的问题

JDK6内存泄漏问题
本文介绍了在JDK6中遇到的一个导致内存溢出的问题,通过使用jmap和MAT工具定位到sun.net.httpserver.ServerImpl对象占用大量堆空间。经过调查发现这是由HttpConnection.close()方法的一个已知bug引起,并验证了升级到JDK7可以解决该问题。

最近发现JDK6的版本中有一个比较大的bug,发现问题及解决问题如下:

首先使用jmap将进程的堆栈信息获取到,然后使用MAT进行分析,此过程可参考我以前转载的博客。

       发现如下:


从上面两个图中可以很清晰的看到sun.net.httpserver.ServerImpl占用了大部分的堆栈空间,内存溢出肯定是这个对象过多的原因。


      如何解决呢?由于这个问题出现的次数和频率无法确认,总是在本地测试是可以的,在生产上过一段时间就会出现问题,百度之发现毫无类似的现象,从自己的代码分析,发现代码是那么的严谨,没有太复杂的逻辑。

    google之,最近google一直被封,找了一个VPN去搜索了一下,发现果然是JDK自带的bug。

    主要是HttpConnection的close()的问题,没有过多时间去修改jdk6的源码,下载jdk7的版本进行测试,此问题消失。

   链接:http://bugs.java.com/view_bug.do;jsessionid=dfe841c3152d878571573bafceb8?bug_id=6946825



com.sun.xml.internal.ws.server.ServerRtException: 服务器运行时错误: java.net.BindException: Address already in use: bind at com.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(ServerMgr.java:130) at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:64) at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:232) at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:126) at javax.xml.ws.Endpoint.publish(Endpoint.java:240) at com.cdsoft.project.common.webservice.WebserviceListener.endpoint(WebserviceListener.java:26) at com.cdsoft.project.common.webservice.WebserviceListener$$EnhancerBySpringCGLIB$$e7d33782.CGLIB$endpoint$1(<generated>) at com.cdsoft.project.common.webservice.WebserviceListener$$EnhancerBySpringCGLIB$$e7d33782$$FastClassBySpringCGLIB$$c13a648e.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) at com.cdsoft.project.common.webservice.WebserviceListener$$EnhancerBySpringCGLIB$$e7d33782.endpoint(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1318) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1158) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:554) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:514) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:321) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:319) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:866) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) at com.cdsoft.CdSoftApplication.main(CdSoftApplication.java:29) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) Caused by: java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:433) at sun.nio.ch.Net.bind(Net.java:425) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at sun.net.httpserver.ServerImpl.<init>(ServerImpl.java:100) at sun.net.httpserver.HttpServerImpl.<init>(HttpServerImpl.java:50) at sun.net.httpserver.DefaultHttpServerProvider.createHttpServer(DefaultHttpServerProvider.java:35) at com.sun.net.httpserver.HttpServer.create(HttpServer.java:130) at com.sun.xml.internal.ws.transport.http.server.ServerMgr.createContext(ServerMgr.java:98) ... 40 more
09-05
<form action="http://127.0.0.1:8080/src/http/login.java" method="get"> <!--<label for="id">name</label> <input type="text" name="id"> <label for="passward">passward</label> <input type="password" name="passward">--> <input type="submit" value="提交"> </form> package http; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import java.io.*; import java.nio.Buffer; class Handle implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { if(exchange.getRequestMethod().equalsIgnoreCase("GET")){ System.out.println("GET方法"); try{ exchange.getResponseHeaders().set("Content-Type","text/html;charset=utf-8"); String html=readHtmlFile("E:\\computer\\前端\\登录注册\\best2.html"); //返回响应头 exchange.sendResponseHeaders(200,html.length()); //获得响应的输出流 OutputStream response=exchange.getResponseBody(); response.write(html.getBytes()); response.close(); }catch(Exception e){ // 处理异常,返回错误响应 String errorMessage = "An error occurred: " + e.getMessage(); exchange.sendResponseHeaders(500, errorMessage.length()); OutputStream errorResponse = exchange.getResponseBody(); errorResponse.write(errorMessage.getBytes()); errorResponse.close(); } } } private String readHtmlFile(String Path) throws IOException { StringBuilder content=new StringBuilder(); File file = new File(Path); BufferedReader reader=new BufferedReader(new FileReader(file)); try { String line; while ((line=reader.readLine()) != null) { content.append(line).append('\n'); //System.out.println(line); } } catch (Exception e) { throw new RuntimeException(e); } return content.toString(); } } package http; import com.sun.net.httpserver.HttpServer; import java.io.*; import java.net.InetSocketAddress; public class login { public static void main(String[] args) throws IOException { HttpServer server=HttpServer.create(new InetSocketAddress(8080),0); server.createContext("/src/http/login",new Handle()); server.setExecutor(null); server.start(); System.out.println("端口8080运行中"); } }
最新发布
10-18
java.net.BindException: Address already in use: connect at java.base/sun.nio.ch.Net.connect0(Native Method) at java.base/sun.nio.ch.Net.connect(Net.java:579) at java.base/sun.nio.ch.Net.connect(Net.java:568) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:593) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:633) at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$JMeterDefaultHttpClientConnectionOperator.connect(HTTPHC4Impl.java:408) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:939) at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:650) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:66) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1301) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1290) at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651) at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570) at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) at java.base/java.lang.Thread.run(Thread.java:842) 这是什么问题
06-07
2025-10-15 01:01:06 Full thread dump OpenJDK 64-Bit Server VM (25.432-b06 mixed mode): "pool-1-thread-2" #42 prio=5 os_prio=0 tid=0x00007f6d80247800 nid=0x81d47 waiting on condition [0x00007f6e5ccef000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000583a64b00> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2044) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) "DestroyJavaVM" #41 prio=5 os_prio=0 tid=0x00007f6ea400b800 nid=0x7ec9a waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "http-nio-8692-Acceptor" #40 daemon prio=5 os_prio=0 tid=0x00007f6ea5900000 nid=0x7ed03 runnable [0x00007f6e5d3f0000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:421) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:249) - locked <0x000000058a1e1940> (a java.lang.Object) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:546) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:79) at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:129) at java.lang.Thread.run(Thread.java:750) 为什么运行的好好的,会突然报这个错,需要在LPS里面加什么配置吗?
10-16
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值