java程序员面试宝典问题

相信通过写java程序讨生活的人对内存溢出并不陌生,如下文字的出现更是让人恼火:
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: PermGen space
尤其当应用服务器(Java容器)出现上述情况更是让人有一种天塌下来的感觉。
好的编码实践可能会大大降低内存溢出的产生。
本文并不是写如何规避内存溢出,但是我还是要介绍一下如何能够尽量规避内存溢出:
1. 编码规范认真执行。找几个资深程序猿(或者整个项目组讨论后)写一个Java编码规范,让项目组成员尽量遵守。一目了然的代码更容易定位问题,当然也更能让人写出好的代码。
2. 单元测试要覆盖所有分支与边界条件。不要拿某种情况不会出现做借口。有句老话说常在河边站哪有不湿鞋(学名墨菲定律)。
3. 代码审查要走。代码写完了,找资深程序猿扫扫代码没有坏处。
4. 有条件的项目组要充分利用测试人员的能动性。
5. 如果项目的期望较高,就把上面的尽量、可能等词汇改成一定要。
以上五条建议对非性命攸关型项目足够了。
下面说正题:
对于java.lang.OutOfMemoryError: PermGen space 这种情况更多的是靠程序猿的经验来解决:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Load时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误。
通过上面的描述就可以得出:如果要加载的class与jar文件大小超过-XX:MaxPermSize就有可能会产生java.lang.OutOfMemoryError: PermGen space 。
换句话说-XX:MaxPermSize的大小要超过class与jar的大小。通常-XX:MaxPermSize为-Xmx的1/8。
对于java.lang.OutOfMemoryError: Java heap space 可能定位的过程就需要折腾一翻了:
虽然各种java虚拟机的实现机制不一,但是heap space内存溢出产生的原因相同:那就是堆内存不够虚拟机分配了。
我对java虚拟机的实现不感兴趣,对各种虚拟机的内存分配机制与gc的交互关系也不了解。但是我大致认为内存分配机制与gc是有联系的,也就是说内存不够分配时gc肯定也释放不了堆内存。从这一点出发,我们就需要找为什么gc释放不了堆内存。通常来说释放不了是因为内存还在使用。对于java对象产生的堆内存占用,只要其不再被继续引用gc是能够顺利回收的(对于通过本地方法调用,即JNI调用产生内存泄露的情况暂不考虑)。
问题的关键就找到了,当产生heap space内存溢出时,堆内存中对象数量过多的就可能是问题的根源了。例外的情况是,程序确实需要那么多内存,这时就要考虑增大堆内存。
例外的情况在本文中就不再多说了,下面介绍jdk自带的两个可视化工具来定位问题。
jdk/jconsole.exe
jdk/jvisualvm.exe
jconsole.exe可以查看本地以及远程主机上的java虚拟机的当前状况,这对服务器健康检查情况非常有用。如下图:
jvisualvm.exe可以用来查看分析内存转储文件;也可以用其做java虚拟机当前状况查看,但是jvisualvm.exe的侵入性非常强,一旦使用会严重影响应用性能。如下图:
下面写些代码来演示一下内存溢出的产生,堆转储文件的生成,堆内存的分析。
首先创建数据持有对象类:
package com.zas.jvm.
* 数据对象
* @author zas
public class DataObject {
//数据对象ID
//数据对象内容
public DataObject(String id, String des) {
this.des =
public String getId() {
public void setId(String id) {
public String getDes() {
public void setDes(String des) {
this.des =
public String toString() {
return &DataObject [id=& + id + &, des=& + des + &]&;
* @param args
public static void main(String[] args) {
溢出演示代码
package com.zas.jvm.
import java.util.ArrayL
import java.util.L
public class OutMemeryTest {
List&DataObject& list = new ArrayList&DataObject&();
public void testOm(){
for (int i = 0; i & 100000; i++) {
DataObject data = new DataObject(&id&&+i, &des:&+i);
list.add(data);
* @param args
public static void main(String[] args) {
OutMemeryTest omt = new OutMemeryTest();
for (int i = 0; i & 2; i++) {
omt.testOm();
System.out.println(&DOne!&);
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
运行参数设置如下:-Xms64m -Xmx64m -XX:PermSize=8m -XX:MaxPermSize=8m
-XX:-HeapDumpOnOutOfMemoryError
jvisualvm分析效果图:
从上图结合代码明显得出:com.zas.jvm.om.DataObject这个类的对象出了问题。
以上是一个演示问题产生及定位过程,生产环境的问题千奇百怪需要具体问题具体分析。
当堆内存巨大时可能要调整jdk\lib\visualvm\etc\visualvm.conf文件中的-xms -xmx大小来导入转储文件。
生产环境为linux的较多,可以借助jdk自带的jmap来转储堆内存文件来分析。
相关 [java 内存 溢出] 推荐:
- CSDN博客推荐文章
JVM运行时内存 = 共享内存区 + 线程内存区. 共享内存区 = 持久带 + 堆. 持久带 = 方法区 + 其他. 堆 = Old Space + Young Space. JVM用持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等. 可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值.
- 互联网 - ITeye博客
1、 内存溢出的原因是什么.
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出. 如果出现这种现象可行代码排查:.
一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串.
- Java - 编程语言 - ITeye博客
相信通过写java程序讨生活的人对内存溢出并不陌生,如下文字的出现更是让人恼火:. 尤其当应用服务器(Java容器)出现上述情况更是让人有一种天塌下来的感觉.
好的编码实践可能会大大降低内存溢出的产生.
本文并不是写如何规避内存溢出,但是我还是要介绍一下如何能够尽量规避内存溢出:. 找几个资深程序猿(或者整个项目组讨论后)写一个Java编码规范,让项目组成员尽量遵守.
- 研发管理 - ITeye博客
垃圾回收是Java程序员了解最少的一部分. 他们认为Java虚拟机接管了垃圾回收,因此没必要去担心内存的申请,分配等问题. 但是随着应用越来越复杂,垃圾回收也越来越复杂,一旦垃圾回收变的复杂,应用的性能将会大打折扣. 所以,Java程序员了解垃圾回收的机制并且知道怎样解决“内存溢出”问题会有很大的益处.
- Java - 编程语言 - ITeye博客
前段时间基于OpenJms部署了一个消息中间件服务器,通过主题订阅模式在各个消息节点之间传递信息,但是某个类型的消息节点长时间运行后出现了内存溢出问题,最后使用JProfiler的基本线程监测功能找到问题所在,并且进行解决. Java 版本 java version &1.7.0_40&.
- ITeye博客
堆(Heap)又被称为:优先队列(Priority Queue),是计算机科学中一类特殊的数据结构的统称. 堆通常是一个可以被看做一棵树的数组对象. 在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.
- Java - 编程语言 - ITeye博客
(问题一:什么叫垃圾回收机制. ) 垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能. 当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露. (问题二:java的垃圾回收有什么特点. ) JAVA语言不允许程序员直接控制内存空间的使用.
- hikerlive - ITeye论坛最新精华讨论帖
笔者最近在做一个类SNS的项目,其中使用了MongoDB进行Feed信息存储,并使用定时器删除过期信息.
定时器的时间变量为60天,设定.
在项目上线的某天,突然发现,2周前的数据丢失了,遍历了程序,没发现逻辑问题,甚至开始当心MongoDB造成的数据丢失(业内也是发生过的).
- ITeye博客
JAVA的垃圾回收机制,让许多程序员觉得内存管理不是很重要,但是内存内存泄露的事情恰恰这样的疏忽而发生,特别是对于Android开发,内存管理更为重要,养成良好的习惯,有利于避免内存的泄漏..
这里可以把许多对象和引用看成是有向图,顶点可以是对象也可以是引用,引用关系就是有向边.
- ITeye博客
昨天中午,发了一篇
equals和==区别的博文,晚上再看时有几位大牛指出了其中的一些错误,很感谢他们的留言,一句简简单单的留言给了我对这些错误知识点改正的机会. 或许这就是从事互联网行业所提倡的互帮互助的精神吧,因为有分享,有交流,互联网才会发展的如此迅猛. 大牛提的一个观点很好,好的东西可以拿出来分享,错的东西却可能带给别人错误的理解,这一点我确实得向看了我写了一些bug博客的人道个歉.
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。怎样使用jstack诊断Java应用程序故障 - 丁小样笔迹 - ITeye技术网站
博客分类:
&&&&&&& 最近一段时间,我们的生产系统升级频繁出现故障,具体故障现象是启动后10来分钟就出现交易缓慢,处理线程耗尽等现象,并且故障发生的频率蛮高的。经过详细的诊断和排查,终于发现了问题,是groovy在osgi中运行会出现classloader死锁,最后我们也解决了这个问题。
&&&&&&& 如果单靠通过查看代码是很难去发现这个问题,在这一次故障排查中,我也学到了怎样更好的使用jvm监控工具来进行诊断,主要用到了jstack和jmap命令,jmap上次已经讲过就不再讲了,下面就一个例子来讲怎么使用jstack来对的Java程序进行诊断。
&&&&&&& 首先让我们来了解一下jstack这个命令的作用,jstack 是一个可以返回在应用程序上运行的各种各样线程的一个完整转储的实用程序,您可以使用它查明问题。jstack [-l] &pid&,jpid可以通过使用jps命令来查看当前Java程序的jpid值,-l是可选参数,它可以显示线程阻塞/死锁情况。
* 死锁例子
* @author crane.ding
public class DeadLock {
public static void main(String[] args) {
final Object obj_1 = new Object(), obj_2 = new Object();
Thread t1 = new Thread("t1"){
public void run() {
synchronized (obj_1) {
Thread.sleep(3000);
} catch (InterruptedException e) {}
synchronized (obj_2) {
System.out.println("thread t1 done.");
Thread t2 = new Thread("t2"){
public void run() {
synchronized (obj_2) {
Thread.sleep(3000);
} catch (InterruptedException e) {}
synchronized (obj_1) {
System.out.println("thread t2 done.");
t1.start();
t2.start();
&&&&&&& 以上DeadLock类是一个死锁的例子,假使在我们不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候我们就可以使用jps查看该程序的jpid值和使用jstack来生产堆栈结果问题。
$ java -cp deadlock.jar DeadLock &
448 DeadLock
$ jstack -l 448 & deadlock.jstack
结果文件deadlock.jstack内容如下:
Full thread dump Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing):
"DestroyJavaVM" prio=6 tid=0x nid=0x9fc waiting on condition [0x]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
"t2" prio=6 tid=0x02bcf000 nid=0xc70 waiting for monitor entry [0x02f6f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock &0x22a297a8& (a java.lang.Object)
- locked &0x22a297b0& (a java.lang.Object)
Locked ownable synchronizers:
"t1" prio=6 tid=0x02bce400 nid=0xba0 waiting for monitor entry [0x02f1f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock &0x22a297b0& (a java.lang.Object)
- locked &0x22a297a8& (a java.lang.Object)
Locked ownable synchronizers:
"Low Memory Detector" daemon prio=6 tid=0x02bb9400 nid=0xa6c runnable [0x]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
"CompilerThread0" daemon prio=10 tid=0x02bb2800 nid=0xcb8 waiting on condition [0x]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
"Attach Listener" daemon prio=10 tid=0x02bb1000 nid=0x7f4 waiting on condition [0x]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
"Signal Dispatcher" daemon prio=10 tid=0x02bd2800 nid=0xd80 runnable [0x]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
"Finalizer" daemon prio=8 tid=0x02bab000 nid=0xe1c in Object.wait() [0x02d3f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on &0x229e1148& (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked &0x229e1148& (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
Locked ownable synchronizers:
"Reference Handler" daemon prio=10 tid=0x02ba6800 nid=0xbe0 in Object.wait() [0x02cef000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on &0x229e1048& (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked &0x229e1048& (a java.lang.ref.Reference$Lock)
Locked ownable synchronizers:
"VM Thread" prio=10 tid=0x02b6a400 nid=0x568 runnable
"VM Periodic Task Thread" prio=10 tid=0x02bc8400 nid=0x75c waiting on condition
JNI global references: 878
Found one Java-level deadlock:
=============================
waiting to lock monitor 0x02baaeec (object 0x22a297a8, a java.lang.Object),
which is held by "t1"
waiting to lock monitor 0x02baa2bc (object 0x22a297b0, a java.lang.Object),
which is held by "t2"
Java stack information for the threads listed above:
===================================================
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock &0x22a297a8& (a java.lang.Object)
- locked &0x22a297b0& (a java.lang.Object)
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock &0x22a297b0& (a java.lang.Object)
- locked &0x22a297a8& (a java.lang.Object)
Found 1 deadlock.
&&&&&&& 从这个结果文件我们一看到发现了一个死锁,具体是线程t2在等待线程t1,而线程t1在等待线程t2造成的,同时也记录了线程的堆栈和代码行数,通过这个堆栈和行数我们就可以去检查对应的代码块,从而发现问题和解决问题。
浏览 17170
crane.ding
浏览: 80331 次
来自: 广州
这种栈信息,可能是什么原因造成的:3XMTHREADINFO
不错啊。续约西了
lz是不是可以说一下怎么解决的groovy并发的问题啊
Web应用集群大体有两种方式,一种是将Session数 ...网 猴 教 程
第一页:什么是Java?
Java好象随处可见 - 甚至在TV中。尽管如此,说清楚Java是什
么和它能做什么却不那么容易。刚开始接触Java的人通常有三
什么是Java?
Java能做什么?
Java怎样改变我的生活?
让我们先回答第一个问题:什么是Java?
Java既是一种编程语言,又是一个平台。
Java程序语言
Java是具有以下特征的高级程序语言:
Java既可以被编译,也可以被解释。通过编译器,可以把Java
程序翻译成一种中间代码 - 称为字节码 - 可以被Java解释器
解释的独立于平台的代码。通过解释器,每条Java字节指令被
分析,然后在计算机上运行。只需编译一次,程序运行时解释
执行。下图说明了它是如何工作的:
可以把Java字节码看作运行在Java虚拟机(Java VM)上的机器
代码指令。每中Java解释器,不管是Java开发工具还是可以运
行Java小应用程序的Web浏览器,都是一种Java VM的实例。Java
VM也可以由硬件实现。
Java字节码使“写一次,到处运行”成为可能。可以在任何有
Java编译器的平台上把Java程序编译成字节码。这个字节码可以
运行在任何Java VM上。例如,同一个Java程序可以运行在Windows
NT、Solaris和Macintosh上。
平台是程序运行的硬件或软件环境。Java平台与大多数其它平台
不同之处在于它是运行于其它基于硬件平台的纯软件平台。大
多数其它平台是硬件和操作系统的结合。
Java平台由两部分组成:
Java虚拟机(Java VM)
Java应用程序界面(Java API)
我们已经介绍了Java VM,它是Java平台的基础,可以移植到各
种基于硬件的平台上。
Java API是软件组件的集合,它们提供了很多有用的功能,如图
形用户界面(GUI)。Java API被分组为相关组件的库(包)。
下图描述了一个运行在Java平台上的Java程序,如应用程
序(application)或小应用程序(applet)。如图中显示的,Java
API和VM把Java程序从硬件依赖中分离出来。
作为一种独立于平台的环境,Java比本地代码慢一些。然而,聪
明的编译器、很好地调制过的解释器和即时字节码编译器可以
在不牺牲可移植性的条件下使Java的表现接近本地代码。
第一页 什么是Java?
[第1天][][][][][]
本栏目内容归所有,任何单位或个人未经许可,不得擅自转载使用。 公司制作完成。
Copyright (C)
Internet Technologies China.& All rights reserved.Socket Closed java编写接口程序遇到的问题!_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:353,205贴子:
Socket Closed java编写接口程序遇到的问题!收藏
我运用以上程序发送数据,由一个程序中不同的用户调用,一个用户可以调用通过,第二个用户调用的话就抛出了异常:Socket Closed at java.net.PlainSocketImpl.setOption(PlainSocketImpl.java:201) at java.net.Socket.setTcpNoDelay(Socket.java:838) at weblogic.net.http.HttpClient.openServer(HttpClient.java:349) at weblogic.net.http.HttpClient.openServer(HttpClient.java:420) at weblogic.net.http.HttpClient.New(HttpClient.java:270) at weblogic.net.http.HttpURLConnection.connect(HttpURLConnection.java:170) at com.inspur.util.BasicHttpClient.httpPost(BasicHttpClient.java:129) at com.inspur.entry.ReWebServiceImpl.getReturnCode(ReWebServiceImpl.java:56) at com.inspur.entry.ReWebServiceImpl.toRequest(ReWebServiceImpl.java:43) at com.inspur.entry.ReWebServiceImpl.submit(ReWebServiceImpl.java:29) at sun.reflect.GeneratedMethodAccessor1176.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:335) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:165) at $Proxy62.submit(Unknown Source) at sun.reflect.GeneratedMethodAccessor1176.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59) at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:320) at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:86) at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:134) at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:109) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64) at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38) at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304) at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129) at org.codehaus.xfire.spring.remoting.XFireServletControllerAdapter.handleRequest(XFireServletControllerAdapter.java:67) at org.codehaus.xfire.spring.remoting.XFireExporter.handleRequest(XFireExporter.java:48) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:717) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:658) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:357) at javax.servlet.http.HttpServlet.service(HttpServlet.java:763) at javax.servlet.http.HttpServlet.service(HttpServlet.java:856) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3244) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2010) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1916) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
急急急,在线坐等大神!今晚发布啊,这个问题还没解决。
close 了 就不能 在 get它了
庆双“蛋”、赢战功、得好礼!
你这代码是客户端的代码,得看服务器端的。
我不会告诉你,我不懂java的时候调试连接用过sniffer。
我运用以上程序发送数据,由一个程序中不同的用户调用,一个用户可以调用通过,第二个用户调用的话就抛出了异常这句话中由一个程序中不同的用户调用是什么意思?传过来的url是什么?
at com.inspur.util.BasicHttpClient.httpPost(BasicHttpClient.java:129) at com.inspur.entry.ReWebServiceImpl.getReturnCode(ReWebServiceImpl.java:56) at com.inspur.entry.ReWebServiceImpl.toRequest(ReWebServiceImpl.java:43) at com.inspur.entry.ReWebServiceImpl.submit(ReWebServiceImpl.java:29)这里面的代码 你应该断点看一下。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 java程序员修炼之道 的文章

 

随机推荐