kettle内存占用怎么解决?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kettle内存占用怎么解决?相关的知识,希望对你有一定的参考价值。
kettle运行35个kettle任务,机器内存24G,发现内存不足剩余200多M,申请扩容到32G,内存还是剩余200多M。看了下JVM设置-xms1024m -xmx2048m -xx:maxpermsize=256m。怎么解决呢。
kettle性能调优性能调优在整个工程中是非常重要的,也是非常有必要的。但有的时候我们往往都不知道如何对性能进行调优。其实性能调优主要分两个方面:一方面是硬件调优,一方面是软件调优。本章主要是介绍Kettle的性能优化及效率提升。
一、Kettle调优
1、 调整JVM大小进行性能优化,修改Kettle定时任务中的Kitchen或Pan或Spoon脚本。
修改脚本代码片段
set OPT=-Xmx512m -cp %CLASSPATH% -Djava.library.path=libswt\win32\ -DKETTLE_HOME="%KETTLE_HOME%" -DKETTLE_REPOSITORY="%KETTLE_REPOSITORY%" -DKETTLE_USER="%KETTLE_USER%" -DKETTLE_PASSWORD="%KETTLE_PASSWORD%" -DKETTLE_PLUGIN_PACKAGES="%KETTLE_PLUGIN_PACKAGES%" -DKETTLE_LOG_SIZE_LIMIT="%KETTLE_LOG_SIZE_LIMIT%"
参数参考:
-Xmx1024m:设置JVM最大可用内存为1024M。
-Xms512m:设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
样例:OPT=-Xmx1024m -Xms512m
2、 调整提交(Commit)记录数大小进行优化
如修改RotKang_Test01中的“表输出”组件中的“提交记录数量”参数进行优化,Kettle默认Commit数量为:1000,可以根据数据量大小来设置Commitsize:1000~50000。
3、 调整记录集合里的记录数
4、尽量使用数据库连接池;
5、尽量提高批处理的commit size;
6、尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流);
7、Kettle是Java做的,尽量用大一点的内存参数启动Kettle;
8、可以使用sql来做的一些操作尽量用sql;
Group , merge , stream lookup,split field这些操作都是比较慢的,想办法避免他们.,能用sql就用sql;
9、插入大量数据的时候尽量把索引删掉;
10、尽量避免使用update , delete操作,尤其是update,如果可以把update变成先delete, 后insert;
11、能使用truncate table的时候,就不要使用deleteall row这种类似sql合理的分区,如果删除操作是基于某一个分区的,就不要使用delete row这种方式(不管是deletesql还是delete步骤),直接把分区drop掉,再重新创建;
12、尽量缩小输入的数据集的大小(增量更新也是为了这个目的);
13、尽量使用数据库原生的方式装载文本文件(Oracle的sqlloader, mysql的bulk loader步骤);
14、尽量不要用kettle的calculate计算步骤,能用数据库本身的sql就用sql ,不能用sql就尽量想办法用procedure,实在不行才是calculate步骤;
15、要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变慢,观察kettle log生成的方式来了解你的ETL操作最慢的地方;
16、远程数据库用文件+FTP的方式来传数据,文件要压缩。(只要不是局域网都可以认为是远程连接)。 参考技术A kettle工具本身也会占用很大的内存,可以将需要执行的job用kitchen命令写成bat脚本,这样就可以直接在windows上运行,节省很大的内存占用,如果需要定时执行,可以添加到计划任务中。
Java程序占用内存太高了怎么办?
自己编的游戏程序,开始之后 10 多个线程一块启动,内存占用从 20,000 升到 300,000,CPU 使用率升到了50%,造成游戏时卡顿严重,求怎么解决。100分
先看下是否有内存泄露,简单的方法就是隔一段时间检查下内存,看看是否是持续上升。
然后看下资源是否可以优化,比如你加载的图片有没有resize过,尽可能减少资源的内存消耗。
游戏卡顿最主要的是FPS帧率太低,把帧率统计输出来看下。检查下UI线程里或者OpenGL线程里是否做了I/O操作,这个是造成卡顿的主要原因。把I/O操作全部放入工作线程中,UI线程只做数据读取和渲染。这样帧率就可以提高了
那个,我是 Java 新手,你说的我看懂了但是具体怎么做?
程序具体表现为点击 Start 按钮后内存瞬间上升 300,000K,但是没有再持续上升。
加载的图片都是用 JLabel.setIcon(icon); 的方式加载,并没有使用绘图工具,所以 resize 的方法该怎么用才好?还有些其他问题被限制字数了。
点击start瞬间上升,那么说明你在点击start之前,初始化该做的没有做完吧,比如图片的加载。你初始化的时候把需要用的资源都先load进来,看看内存有多少,再点击start看看有没有内存暴涨
追问运行就开始所有线程的话刚打开就是内存 320,000 K ,点击 Start 之后还是那么多。
追答内存是资源造成的,可以看下图片资源在load进来的时候是不是还可以再把尺寸调小点。卡顿是I/O造成的,你看下UI线程里有没有做耗时的操作
追问玩家 10*10 像素,AI 一样,子弹 2*2 像素的,只是玩家方向不同图片方向也不一样,AI 没有图片就一蓝色方块,子弹红色的。IO 是什么?
参考技术A 1.线程有无休眠时间2.休眠时间的时长设置的是否合理。
我猜测你的程序是要不停的运行来实现某种功能。这要休眠时间的设定就显得很重要了。
还有就是你的功能中是否有IO,是否有耗内存的代码块,这些要看具体的才行。单纯是线程的话,注意上面两点就可以了。追问
另外 FPS 我估计也就 2-3 的样子……
以上是关于kettle内存占用怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章