大内存硬件上的程序部署策略
单个虚拟机管理大内存
出现问题
如果JVM中的堆内存太小,就会频繁地出发GC,而每次GC会将用户线程暂停,所以,频繁地GC会导致长时间的停顿。如果扩大计算的内存的大小,就能降低GC触发的频率。
32位系统最大支持4g内存,而64位操作系统可以最大支持128g内存,所以,我们可以通过换用64位系统和提高内存的方式降低虚拟机的用户线程停顿,但是还是有问题。
虽然Full GC总体的频率降低了,但是每次Full GC的时间却增长了,因为积攒的需要回收的空间变大了嘛。这样会导致长时间的停顿,比以往更要命。
解决方案
对于大内存的硬件,一定要控制Full GC的频率就能减少长时间的停顿,比如一天都不出现一次Full GC,可以在深夜没有用户使用的时候进行一次。
控制Full GC频率的关键是老年代的相对稳定,如何控制老年代稳定:
- 保证绝大多数对象是朝生夕灭的,大多数对象的生存时间不能太长,尤其是大对象。
- 提高大对象进入老年代的门槛,这样可以让对象先在新生代被Minor GC掉。
调整为建立5个32位JDK的逻辑集群,每个进程按2GB内存计算(其中堆固定为1.5GB),占用了10GB内存。另外建立一个Apache服务作为前端均衡代理作为访问门户。考虑到用户对响应速度比较关心,并且文档服务的主要压力集中在磁盘和内存访问,处理器资源敏感度较低,因此改为CMS收集器进行垃圾回收。部署方式调整后,服务再没有出现长时间停顿,速度比起硬件升级前有较大提升。
单个虚拟机管理大内存的问题
- 回收大内存耗时长,G1出现后才有所改善。
- 64位虚拟机性能低于32位的。
- 法在堆内存溢出的时候,如果,堆过大就无法产生堆转存储快照,转了也很难分析,太大了
- 64位虚拟机内存消耗过大,因为指针膨胀、数据对齐。
一台物理机上建立虚拟机逻辑集群管理内存
同时使用若干个虚拟机建立逻辑集群来利用硬件资源。做法是在一台物理机器上启动多个应用服务器进程,为每个服务器进程分配不同端口,然后在前端搭建一个负载均衡器,以反向代理的方式来分配访问请求。
存在问题
- 磁盘竞争,多个节点同时访问一个磁盘文件,导致IO异常。
- 很难高效利用资源池。可能一个还有很多,另一个已经满了。
- 如果使用32位系统,内存空间太小。
- 造成内存的浪费,可以把本地缓存改为集中式缓存。
直接内存的溢出
问题描述
服务端不定时抛出内存溢出异常,将堆内存调到最大,还是有这个问题。加入-XX:+HeapDumpOnOutOfMemoryError参数,居然也没有任何反应,再用jstat查看GC堆,也很正常。说明不是堆内存溢出。系统的内存是2g,而1.6g分给了Java堆,直接内存只剩下0.4g。如果使用了NIO,那么JVM会在JVM内存之外分配内存空间,这部分内存也叫“直接内存”。因此,如果程序中使用了NIO,那么就要小心所以是直接内存异常。
直接内存的回收
虚拟机对直接内存不能像Java堆那样,发现空间不足就触发GC,而是在老年代满了之后的Full GC顺便清理直接内存。所以,会出现直接内存溢出。
虚拟机进程崩溃
异步请求
web服务器采用HTTP通信,而HTTP基于TCP。异步通信就是当客户端向服务器发送一个HTTP请求后,将这个请求的TCP连接委托给其他线程,自己去做其他的事情,那个被委托的线程就等你这服务器的反馈。当这个线程接收到了反馈,就将数据转交给刚才的线程,这就是异步通信。
异步请求导致进程奔溃
使用了异步方式调用web服务,由于两边的服务速度完全不对等,时间长了就会累计越来越多的服务请求,从而导致等到的线程和socket连接越来越多,就会超过虚拟机的承受能力,就会崩溃。
解决方法
将异步调用改成生产者消费折模式的消息队列。
大量大对象进入堆
问题描述
一下子有太多太大的对象进入新生代,而暂时又不能被回收,由于新生代中采用的标记复制算法,这样导致Minor GC的效率低,同时会很快占满新生代,频繁触发GC,从而导致停顿。
解决方法
修改进入老年代的年龄限制,让对象马上进入老年代。
本质问题还是要减少大对象,提高空间利用效率。
这个案例中由于使用了HashMap 作为长整型的数据存储结构,这样的空间使用效率非常低。
安全点导致的长时间停顿
问题描述
当个别线程没有进入安全点,而其他线程都都在安全等待的时候,就会导致长时间的停顿。
当线程在一个循环中,可能需要等待循环全部跑完才能进入安全点,这样其他线程也必须一起等着。
解决方法
把循环索引中的数据类型从int改为long。
处理大对象
大对象对于虚拟机是一个非常棘手的问题。可能会导致频繁的GC,占用大量空间,延长GC的时间。
处理方法
- 避免大对象的产生:选择空间效率较高的数据结构存储大的信息。
- 缩短大对象的生存时间:尽快丢掉大对象,这样就能避免对象占用空间,多次被复制所消耗的时间。
深入理解Java虚拟机(六)——JVM调优分析与实战的更多相关文章
-
java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
-
java虚拟机学习-JVM调优总结-调优方法(12)
JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...
-
【java虚拟机】jvm调优原则
转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...
-
java虚拟机学习-JVM调优总结-新一代的垃圾回收算法(11)
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...
-
java虚拟机学习-JVM调优总结-典型配置举例(10)
以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理 ...
-
java虚拟机学习-JVM调优总结(5)
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...
-
【java虚拟机】jvm调优
转自:https://www.cnblogs.com/starhu/p/6400348.html?utm_source=itdadao&utm_medium=referral 堆大小设置JVM ...
-
java虚拟机学习-JVM调优总结(6)
1.Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了.对于非基本类型的Java对象,其大小就值得商榷. 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个 ...
-
java虚拟机学习-JVM调优总结-垃圾回收面临的问题(8)
如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...
随机推荐
-
zookeeper安装及部署
安装及部署 一. 单机安装.配置 1.下载zookeeper二进制安装包 下载 curl -L -O http://apache.fayea.com/zookeeper/stable/zookeepe ...
-
POJ 1269	 Intersecting Lines --计算几何
题意: 二维平面,给两条线段,判断形成的直线是否重合,或是相交于一点,或是不相交. 解法: 简单几何. 重合: 叉积为0,且一条线段的一个端点到另一条直线的距离为0 不相交: 不满足重合的情况下叉积为 ...
-
Java学习-020-Properties 判断是否存在对应的 key 项
在日常的脚本编写过程中,通常会判断配置文件中是否存在对应的配置项,以判断是否执行相应的业务逻辑. 小二上码...若有不足之处,敬请大神指正,不胜感激! 判断是否存在 key 项(配置项)的方法源码如下 ...
-
CSS之Win8界面摸拟
开门见山,先把测试Result放上: <head> <meta charset="UTF-8"> <meta http-equiv="X-U ...
-
c#的Marshal
补充过程中~ 感觉应该是C#调用非托管的比较专门的class 例1. public struct ImageDataMsg { public char DataType; public int Srv ...
-
第一个Servlet程序及分析
第一个Servlet程序: package cc.openhome; import java.io.IOException; import java.io.PrintWriter; import ja ...
-
java较全的面试题
一.Java基础部分 1. JAVA的基本数据类型有哪些 ? String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? ...
-
ES--06
第51.初识搜索引擎_上机动手实战多搜索条件组合查询 课程大纲 GET /website/article/_search{ "query": { "bool": ...
-
debian8.5安装sublime text3
在官网www.sublimetext.com下载安装包 我这里用的是Ubuntu 64 bit版. 下载后使用su命令切换到root账户. 执行安装命令 dpkg -i sublime-text*.d ...
-
matlab: Attempt to execute SCRIPT *** as a function 错误
编写matlab程序时,出现了“Attempt to execute SCRIPT mean as a function”,其实这是“Attempt to execute SCRIPT *** as ...