- 浏览: 168133 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mengyue0477:
最后还不忘吐槽一下 哈哈 太逗了
spring容器的懒加载lazy-init设置 -
comet0515:
不是maven工程能不能用checkstyle插件?job是一 ...
jenkins 配置checkstyle -
xfxlch:
http://docs.spring.io/spring-bo ...
NoteBook -
With_Me_Forever:
太浅了。我最近也在看着方面的资料,一起进步把。
互联网金融定义 -
xfxlch:
在http://r.m.baidu.com/6pmxgig
NoteBook
背景:
在前后端分开开发的过程中,前段的页面要调用后台Java Rest 服务。一开始,我们的服务是正常的,可是跑了一段时间之后,发现,后台的service没有接受到来自前端的请求,而且当我们直接去请求Rest的时候,发现服务端根本就不能处理这个请求,这个请求就一直hang在哪里,转圈圈。
分析
因为之前也没有分析定位过这中问题。所以有点不知所措。上网查,都说要dump内存,看服务器cpu,内存消耗情况。具体怎么操作也没说清楚。于是联系了一下前同事,给出了一些可以直接操作的命令。
命令一: jstack(查看线程的信息)。
于是用 jstack pid看了一下线程使用情况:
看到这里的第一刹那,还以为是抛异常了,这还了得。于是去看了tomcat进程的堆栈信息。也是一样的,如下:
因为tomcat是好的,所以也就不在怀疑是这里进程里有异常了。
有一种检查该进程是不是有问题,可以这样做。
1.先ps找到你的进程的PID。
2.然后把PID转换成16进制。Linux: $printf "%x\n" PID; 就能专转成16进制了。
3.到刚才的查出来的堆栈信息里面grep 第二步转出来的16进制,如果能找到,并且在此处blocked住,那么就说明java应用是有问题的。没有就应该不用到这里找了,尝试去别的地方找找看原因吧。
命令二:jmap(查看内存信息)
jstack并没有能帮助到我,我还是不知道怎么办,这个时候我去找一个同事聊了一下,同事也对java内存略懂,于是一直说jmap可以查看内存信息,先看看进程的内存使用情况再说。于是就用上了jmap。jmap不查不知道,一查吓一跳啊。
这回我终于相信自己是找到问题的根本原因了。那就是持久代PG不足,导致的。当时根本就没有去想为什么。脑子里就知道内存不足肯定会出问题的,都99%啦。
我把内存使用情况截给我同事看,我同事呵呵一笑,说这个不能说明问题,要看FGC。 这个时候,我才想起来,java只有在FGC的时候,才对所有的请求都是没有反应的。于是赶紧去找了一下命令。
赶紧jstat了一把。
当前很显然一直在FGC, 能怪一直没有反应。
但是原因,导致FGC的原因是什么呢,还是没有找到。
不管了先把
kill 掉进程,再重启。再观察一段时间吧。
这里还有一个不错的文章:
http://ifeve.com/find-bug-online/
--EOF--
在前后端分开开发的过程中,前段的页面要调用后台Java Rest 服务。一开始,我们的服务是正常的,可是跑了一段时间之后,发现,后台的service没有接受到来自前端的请求,而且当我们直接去请求Rest的时候,发现服务端根本就不能处理这个请求,这个请求就一直hang在哪里,转圈圈。
分析
因为之前也没有分析定位过这中问题。所以有点不知所措。上网查,都说要dump内存,看服务器cpu,内存消耗情况。具体怎么操作也没说清楚。于是联系了一下前同事,给出了一些可以直接操作的命令。
命令一: jstack(查看线程的信息)。
于是用 jstack pid看了一下线程使用情况:
... "Finalizer" daemon prio=10 tid=0x00007fdb28072800 nid=0x2ca4 in Object.wait() [0x00007fdb2454f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000746496810> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x0000000746496810> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) "Reference Handler" daemon prio=10 tid=0x00007fdb28070800 nid=0x2ca3 in Object.wait() [0x00007fdb0e04e000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000746496468> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x0000000746496468> (a java.lang.ref.Reference$Lock) "main" prio=10 tid=0x00007fdb2800d000 nid=0x2c9d waiting on condition [0x00007fdb30474000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.statestreetgx.fcm.core.app.FcmCoreApp.main(FcmCoreApp.java:97) "VM Thread" prio=10 tid=0x00007fdb2806c800 nid=0x2ca2 runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fdb28022800 nid=0x2c9e runnable "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fdb28024800 nid=0x2c9f runnable "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fdb28026000 nid=0x2ca0 runnable "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fdb28028000 nid=0x2ca1 runnable "VM Periodic Task Thread" prio=10 tid=0x00007fdb285b6800 nid=0x2cae waiting on condition JNI global references: 412
看到这里的第一刹那,还以为是抛异常了,这还了得。于是去看了tomcat进程的堆栈信息。也是一样的,如下:
... "Service Thread" daemon prio=10 tid=0x00007f97a4098000 nid=0x1dd8 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" daemon prio=10 tid=0x00007f97a4095800 nid=0x1dd7 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" daemon prio=10 tid=0x00007f97a4092800 nid=0x1dd6 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x00007f97a4090800 nid=0x1dd5 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=10 tid=0x00007f97a406f800 nid=0x1dd4 in Object.wait() [0x00007f978f46f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x00000007008f4fe0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) "Reference Handler" daemon prio=10 tid=0x00007f97a406d800 nid=0x1dd3 in Object.wait() [0x00007f978f570000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x00000007008f4a30> (a java.lang.ref.Reference$Lock) "main" prio=10 tid=0x00007f97a4009800 nid=0x1dcd runnable [0x00007f97a9fac000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net.ServerSocket.implAccept(ServerSocket.java:530) at java.net.ServerSocket.accept(ServerSocket.java:498) at org.apache.catalina.core.StandardServer.await(StandardServer.java:451) at org.apache.catalina.startup.Catalina.await(Catalina.java:777) at org.apache.catalina.startup.Catalina.start(Catalina.java:723) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455) "VM Thread" prio=10 tid=0x00007f97a4069000 nid=0x1dd2 runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f97a401f800 nid=0x1dce runnable "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f97a4021000 nid=0x1dcf runnable "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f97a4023000 nid=0x1dd0 runnable "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f97a4025000 nid=0x1dd1 runnable "VM Periodic Task Thread" prio=10 tid=0x00007f97a40aa800 nid=0x1dd9 waiting on condition JNI global references: 411
因为tomcat是好的,所以也就不在怀疑是这里进程里有异常了。
有一种检查该进程是不是有问题,可以这样做。
1.先ps找到你的进程的PID。
2.然后把PID转换成16进制。Linux: $printf "%x\n" PID; 就能专转成16进制了。
3.到刚才的查出来的堆栈信息里面grep 第二步转出来的16进制,如果能找到,并且在此处blocked住,那么就说明java应用是有问题的。没有就应该不用到这里找了,尝试去别的地方找找看原因吧。
命令二:jmap(查看内存信息)
jstack并没有能帮助到我,我还是不知道怎么办,这个时候我去找一个同事聊了一下,同事也对java内存略懂,于是一直说jmap可以查看内存信息,先看看进程的内存使用情况再说。于是就用上了jmap。jmap不查不知道,一查吓一跳啊。
-bash-4.1$ /server/share/java/bin/jmap -heap 11417 Attaching to process ID 11417, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.79-b02 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 3124756480 (2980.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 85983232 (82.0MB) G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 777519104 (741.5MB) used = 228470440 (217.88639068603516MB) free = 549048664 (523.6136093139648MB) 29.38454358543967% used From Space: capacity = 42991616 (41.0MB) used = 42979216 (40.98817443847656MB) free = 12400 (0.0118255615234375MB) 99.971157167016% used To Space: capacity = 54001664 (51.5MB) used = 0 (0.0MB) free = 54001664 (51.5MB) 0.0% used PS Old Generation capacity = 130023424 (124.0MB) used = 63940096 (60.97802734375MB) free = 66083328 (63.02197265625MB) 49.17582850302419% used PS Perm Generation capacity = 71303168 (68.0MB) used = 71057992 (67.76618194580078MB) free = 245176 (0.23381805419921875MB) 99.65614992029526% used 32711 interned Strings occupying 3615504 bytes.
这回我终于相信自己是找到问题的根本原因了。那就是持久代PG不足,导致的。当时根本就没有去想为什么。脑子里就知道内存不足肯定会出问题的,都99%啦。
我把内存使用情况截给我同事看,我同事呵呵一笑,说这个不能说明问题,要看FGC。 这个时候,我才想起来,java只有在FGC的时候,才对所有的请求都是没有反应的。于是赶紧去找了一下命令。
命令三:jstat(gc信息查看)
赶紧jstat了一把。
-bash-4.1$ jstat -gc 10626 1000
当前很显然一直在FGC, 能怪一直没有反应。
但是原因,导致FGC的原因是什么呢,还是没有找到。
不管了先把
-XX:PermSize=50m -XX:MaxPermSize=100m设大一点试试再说吧。
kill 掉进程,再重启。再观察一段时间吧。
这里还有一个不错的文章:
http://ifeve.com/find-bug-online/
--EOF--
发表评论
-
eclipse project .setting
2016-08-24 11:30 608有一个文件在.setting的目录下面: 文件名:org.ec ... -
jar命令工具
2016-01-23 20:29 700背景: 今天介绍两个jar的命令工具,对我个人来说,还是比较好 ... -
Java的按值传递
2016-01-23 19:30 577问题: 最近在看Mar ... -
Mac OS 安装java 开发环境
2016-01-03 13:00 1777我的机器是: 1. jdk1.7下载安装 jdk7:h ... -
一个String字符串的问题2
2015-12-14 14:22 614背景: 今天遇到个问题: String str = & ... -
我读重构这本书
2015-12-01 22:30 0第一点:关注变量命名。好的变量名能让读者更快更好的理解程序到底 ... -
系统log的编写
2015-11-16 09:41 0log很关键,一定要记录好对追踪问题有帮助的日志。 -
CAS 授权问题
2015-11-16 09:40 0CAS 授权问题 -
Caused by: java.lang.UnsupportedOperationException 解决方案
2015-10-21 22:09 4121背景: 今天在跑一个UnitTest,跑的过程中想在list ... -
LogBack 框架里log-access的使用
2015-10-18 16:05 7113背景: 想通过配置log-access来实现直接使用浏览器来访 ... -
how to fix "org.hamcrest.CoreMatchers.containsString cannot be resolved"
2015-09-23 23:12 3034背景: 山姆大叔比较喜欢用一些新的技术和新的特性,最近在jun ... -
java 打印金字塔
2015-08-24 00:53 790背景: 一个同事,面试应聘者喜欢用学校里学过的一个书本或者课后 ... -
纯jsp servlet 实现 upload file功能
2015-08-17 20:35 760本篇主要是简单的实现jsp servlet 的上传文件的功能, ... -
dos 命令窗口執行java 命令,帶包路徑
2015-07-26 12:16 537記錄一下,是為了自己下次再run java命令的時候,可以很快 ... -
tomcat 远程调试
2015-07-23 18:41 494背景: 我们在项目开发过程中,很多时候会遇到这样的情况:项目在 ... -
使用android studio 来开发hello world app的时候,遇到的一些坑。
2015-07-13 01:38 2170使用android studio 来开发h ... -
ThreadLocal
2015-05-11 07:22 451Java线程:深入ThreadLocal ThreadLo ... -
Hibernate Interceptor(拦截器)
2015-04-28 20:30 2436需求: 对所有操作数据库的事件,添加audit log, 此l ... -
eclipse 加入tomcat 包
2015-03-24 01:09 436... -
Transforming XML with XSLT
2014-10-11 19:14 534public static void catalog() ...
相关推荐
蓝凌标准产品V16.0管理员手册-RestService服务管理是蓝凌标准产品的一个重要组件,旨在提供一个统一的服务管理平台,帮助管理员更好地管理和维护系统。下面是该手册的详细知识点: 章节一:引言 蓝凌标准产品V16.0...
蓝凌标准产品V15.0管理员手册-RestService服务管理是蓝凌标准产品V15.0管理员手册中的一部分,主要介绍了RestService服务管理的相关知识点。 第一章 引言 本章节介绍了蓝凌标准产品V15.0管理员手册的基本概念和...
Java REST(Representational State Transfer)是一种基于HTTP协议的软件架构风格,用于构建Web服务。它倡导轻量级、松耦合的设计原则,使得服务能够通过简单的HTTP方法(GET、POST、PUT、DELETE等)来获取和操作...
**WCF REST Service Template 40** 是一个专门为Visual Studio 2010设计的扩展模板,用于简化基于Windows Communication Foundation (WCF) 创建RESTful服务的过程。REST(Representational State Transfer)是一种...
在本项目中,“WCF REST Service Test”是一个用于测试WCF REST服务的应用程序,它提供了模拟RESTful服务器的功能。 ### WCF REST服务基础 WCF REST服务允许开发者创建基于HTTP协议的、符合REST原则的服务。REST...
Demo-Java-RestService 这是我的历史项目之一,现在不在维护中,仅供参考,并演示我的经验。 本项目由 Java + Spring + Hibernate 构建。 它向前端公开 RESTful API。 实施要点: 基于 spring-mvc 的控制器。 验证器...
REST (Representational State Transfer) 是一种设计网络应用程序的架构风格,其核心原则之一是无状态性。在REST架构中,客户端和服务端之间的交互基于HTTP协议,通过发送HTTP请求并接收HTTP响应来完成。 #### 三、...
在IT行业中,Java客户端请求REST服务是一个常见的任务,涉及到网络通信、HTTP协议、JSON数据交换以及Java的相关库。本文将深入探讨这个主题,基于提供的标签"源码"和"工具",并假设压缩包文件"com"包含了相关示例...
在Java开发中,REST(Representational State Transfer,表述性状态转移)接口已经成为现代Web服务的主要交互方式之一。RESTful API设计简洁,易于理解和使用,它通过HTTP协议来完成客户端与服务器之间的通信。在这...
gerrit-rest-java-client, Gerrit代码审查的Java REST客户端 gerrit-rest-java-client 简介Gerrit代码审查工具 REST API的Java实现。仅支持 Gerrit 2.6或者更新版本的( 。旧版本中缺少/不完整的REST API ) 。
Jersey 是一个基于 Java 规范的 REST 风格 Web Service 开发框架,旨在帮助开发者快速构建 REST 风格 Web 服务。Jersey 是 JAX-RS(Java API for RESTful Web Services)的参考实现,已经达到了 0.7 版本。Jersey 的...
**JIRA REST Java Client**是Atlassian官方提供的一款用于与JIRA进行交互的Java库,它使得开发人员能够轻松地通过RESTful API访问和操作JIRA系统。这个库提供了丰富的功能,包括创建、更新、查询问题(issues)、...
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...
openshift-java-client, OpenShift REST API的Java客户端 OpenShift客户端 OpenShift REST API的Java客户端。 它几乎提供了 rhc-* 命令行 工具( 。创建/重命名域,创建/销毁应用程序,列出应用程序,列出可用墨盒,...
在现代互联网应用中,REST(Representational State Transfer,表现层状态转移)架构风格已经成为构建Web服务的标准之一。REST以其简洁、无状态、可缓存的特点,为开发者提供了构建分布式系统的一种高效方式。Java...
纯java的http rest接口测试工具;支持多种数据返回格式
【Java REST 接口详解】 REST(Representational State Transfer,表现层状态转移)是一种软件架构风格,用于构建基于HTTP协议的Web服务。它的核心理念是通过简洁的方式处理网络通信,使得服务更易于理解和使用。...
【REST-Project.zip】是一个包含Java RESTful服务实现示例的压缩包,旨在展示如何使用REST技术构建Web服务。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以数据...
在IT行业中,发布Java REST服务是一项常见的任务,它允许应用程序通过HTTP协议提供可交互的Web服务。本篇文章将深入探讨如何分三步发布基于Java的RESTful服务,并结合相关工具进行详细阐述。首先,我们需要理解REST...
Java调用Java Web Service是Java开发中的一个常见任务,它涉及到Web服务的消费与交互,主要基于SOAP(Simple Object Access Protocol)协议。本篇将详细阐述这个过程,并结合标签“源码”和“工具”,探讨如何通过源...