如下的整理是我我的的理解,并用本身的话进行整理,若有错误,欢迎各位指出完善shell
1、高性能硬件程序部署策略windows
当对服务器的硬件需求过大的时,有两种解决方案:1)使用64位jdk增大内存;2)使用若干个32位虚拟机创建集群利用资源缓存
可能的缘由与结果:建议使用第二种方案,第一种方案易产生大对象,并占用老年代的空间,gc回收时易产生长时间的停顿服务器
2、集群间同步致使内存溢出数据结构
在集群间设置一个全局缓存,用于同步各个服务器之间的信息,如:登陆信息等等,容易致使内存溢出jvm
可能的缘由与结果:服务器频繁出现同步信息,致使大量同步信息堆积内存,应避免大量频繁的写操做性能
3、堆外内存致使的溢出错误线程
服务器出现OOM的报错,查看服务器,gc不频繁,Eden区、Survivor区、老年代和永久代内存都正常对象
可能的缘由与结果:Java堆和永久代分配的内存够用,但剩下的内存不足,内存满了,而老年代的内存不足以回收,致使堆外内存没有办法回收,从而致使堆外内存OOM。除了Java堆和永久代内存,还要注意的内存限制有:Direct Memory,线程堆栈,Socket缓存区,JNI代码,虚拟机和GC队列
4、外部命令致使系统缓慢
代码中使用Java调用shell脚本,服务器的cpu和内存消耗很高
可能的缘由与结果:Java调用shell脚本,即便shell脚本的速度很快,但频繁的调用会致使cpu和内存负担增长。应使用Java自带的API获取信息
5、服务器JVM进程崩溃
两台机器之间进行交互是出现hs_err_pid###.log,并留下SocketException:Connect reset的错误
可能的缘由与结果:当一台服务器向另外一台服务器进行频繁的请求时,服务器没法迅速响应,致使大量请求堆积从而致使的请求超时。建议使用生产者/消费者模式的消息队列,减轻接受请求的服务器的压力
6、不恰当数据结构致使内存占用过大
服务器内存足够使用,没隔一段时间加载一个大文件数据进入内存,在内存中造成大量的HashMap<Long, Long> Entry, Minor GC会形成停顿
可能的缘由与结果:大量数据进入内存,占用新生代,致使内存饱满,解决方法:是数据进入内存时就当即进入老年代,但这种方法治标不治本,不能采用,实际中仍是要避免使用大量的HashMap。
ps:直接进入老年代的方法,设置jvm参数:-XX:MaxTenuringThreshold=0或者-XX:+AlwaysTenure
7、由windows虚拟内存致使的长时间停顿
使用windows的GUI时,界面最小化/恢复时会出现长时间的停顿
可能的缘由与结果:界面最小化时,将工做内存交换到磁盘上,在回复页面时致使停顿,
解决方法:加入参数:-Dsun.awt.keepWorkingSetOnMinimize=true,能够保证快速相应最小化时的恢复