本文目录一览:
- 1、Linux里面JVM内存怎么设置?
- 2、内存256G 使用G1 GC可以吗?
- 3、如何让eclipse启动更快
- 4、GC 调优是设置哪个文件啊
- 5、elasticsearch java 怎么设置 ignore
Linux里面JVM内存怎么设置?
jar包启动时指定对应参数,比如我的工程启动命令就是这样的
常见参数如下
1.-Xms:初始堆大小。只要启动,就占用的堆大小。
2.-Xmx:最大堆大小。java.lang.OutOfMemoryError:Java heap这个错误可以通过配置-Xms和-Xmx参数来设置。
3.-Xss:栈大小分配。栈是每个线程私有的区域,通常只有几百K大小,决定了函数调用的深度,而局部变量、参数都分配到栈上。
当出现大量局部变量,递归时,会发生栈空间OOM(java.lang.StackOverflowError)之类的错误。
4.XX:NewSize:设置新生代大小的绝对值。
5.-XX:NewRatio:设置年轻代和年老代的比值。比如设置为3,则新生代:老年代=1:3,新生代占总heap的1/4。
6.-XX:MaxPermSize:设置持久代大小。
java.lang.OutOfMemoryError:PermGenspace这个OOM错误需要合理调大PermSize和MaxPermSize大小。
7.-XX:SurvivorRatio:年轻代中Eden区与两个Survivor区的比值。注意,Survivor区有form和to两个。比如设置为8时,那么eden:form:to=8:1:1。
8.-XX:HeapDumpOnOutOfMemoryError:发生OOM时转储堆到文件,这是一个非常好的诊断方法。
9.-XX:HeapDumpPath:导出堆的转储文件路径。
10.-XX:OnOutOfMemoryError:OOM时,执行一个脚本,比如发送邮件报警,重启程序。后面跟着一个脚本的路径。
内存256G 使用G1 GC可以吗?
仅仅只是一个GC中的G1而已。G1是增量的垃圾回收器,并不是越大越好的,大小要根据项目实际情况慢慢的调整。另外争取不要让G1承载过多的垃圾回收,因为使用G1是很影响吞吐量的。对一个项目来说过大的G1会造成G1承担的回收量增大。
关于JVM中的 XX 类型的不稳定参数,建议是一个一个慢慢调,很有可能因为某个参数相差1造成性能相差十万八千里,崩溃也不是不可能。
如何让eclipse启动更快
可以参考如下几个提升eclipse启动速度的技巧:
技巧一:运行最新版本的JDK和Eclipse
通常,新版本的JDK和Eclipse都会有性能上的优化。请确保你使用的是64位Eclipse并且使用了Oracle的JDK。对于网络开发,需要使用Eclipse for Java EE而不是Eclipse for Java。
技巧二:调整Eclipse的Preferences
General Startup and Shutdown : 移除所有在启动时加载的插件。
General Editors Text Editors Spelling : 关闭拼写检查。
General Validation 勾选“Suspend all validator”。
Window Customize Perspective 移除所有用不到或不想用的内容(尽量使用快捷键),菜单栏也是如此(你用过几次菜单栏的打印按钮?)。
Install/Update Automatic Updates 取消勾选“Automatically find new updates and notify me”。
General Appearance 取消勾选“Enable Animations”。
使用默认的主题。其他主题可能会降低运行速度。
我自己还关闭了自动提示,这样在输入代码时不会拖累我。替代方案是使用Ctrl+Space在需要的使用手动提示。可以通过下面的配置来完成:(译者注:Ctrl+Space?中国人不会答应的)。
Java Editor Content Assist 禁用“Enable Auto Activation”。在Advanced中移除所有不需要的内容(在Eclipse 4.2.2中没找到)。
技巧三:将JDK放在内存盘(RAM Disk)上
内存盘是将计算机内存的作为虚拟磁盘或硬盘使用。用来加速位于其中的软件的IO性能。内存中创建的RAM盘就像是计算机上的一块硬盘。由于这些内存当作硬盘使用,所以其他程序就不能使用这些内存空间。我们只是将JDK放到那里,300MB就足够了。
警告:不要将任何内容永久性的放到内存盘中,每次重启时,里面的内容都会消失并重新创建。
对于Linux用户:
这个链接中有详细的描述。
对于Mac用户:
使用diskutil工具创建内存盘
1. 创建一个新的脚本,例如:~/tools/batch/ramdisk.sh
将其中的x、y、z替换为你的JDK版本:
#!/bin/bash
diskutil erasevolume HFS+ 'JDK RAMDISK' `hdiutil attach -nomount ram://614400`
cp -r /Library/Java/JavaVirtualMachines/jdk1.x.y_z.jdk /Volumes/JDKRAMDISK
(注意:diskutil期望的参数是512字节扇区的整数倍:对于300MB,应该是300 * 1024 ^ 2 / 512 = 614400)
2. 保存脚本,将其改为可执行模式:
chmod 755 ~/tools/batch/ramdisk.sh
运行ramdisk.sh将创建内存盘:
$ ramdisk.sh
Started erase on disk4
Unmounting disk
Erasing
Initialized /dev/rdisk4 as a 300 MB case-insensitive HFS Plus volume
Mounting disk
Finished erase on disk4 JDKRAMDISK
现在用Finder应该能发现一个名为JDKRAMDISK的新设备,其中含有的就是JDK。点击“弹出”按钮可以移除RAM Disk并释放相应的内存。
如果想使用这个技巧,那么每次启动Eclipse都需要有这个内存盘,不然会看到“A Java Runtime … must be available in order to run Eclipse”错误。可以配置系统,用Automator或一个unchtl守护程序确保每次启动时会自动执行ramdisk.sh脚本。
对于Windows用户:
1. 下载并安装名为imdisk的工具
2. 创建一个新的批处理文件,如:C:/tools/batch/ramdisk.bat
将其中的x、y、z替换为你的JDK版本号:
@echo Placing JDK on Virtual Disk N:/
@echo off
sc config imdisk start= auto
net start imdisk
imdisk -a -t vm -s 300m -m n:
format n: /q /Y
call xcopy C:path_jdkjdk1.x.y_z N:jdk1.x.y_z /S /E /Y /Q
label n: JDK RAMDISK
运行ramdisk.bat后,将看到创建了一个名为“JDK RAMDISK”的新磁盘N,其中含有的就是JDK。
3. 确保文件以管理员模式运行。右击文件,选择“属性——兼容性——勾选“以管理员身份运行此程序”。
如果想使用这个技巧,那么每次启动Eclipse都需要有这个内存盘,不然会看到“A Java Runtime … must be available in order to run Eclipse”错误。可以配置系统,将ramdisk.bat脚本放到启动文件夹中。
为了让技巧3能够工作,需要在eclipse.ini文件中添加-vm设置(详见下一节)。
技巧四:调整你的eclipse.ini
在Eclipse的优化中,这是最令人困惑的地方。网上有海量的文章介绍不同的配置方案。我只是介绍我自己的配置方案。
找到你的eclipse.ini文件:
Windows/Linux:位于$ECLIPSE_HOME(译者注:$ECLIPSE_HOME是Eclipse的路径,这里假设Linux下也是自行安装,而不是通过源安装)
MacOS:位于$ECLIPSE_HOME/Eclipse.app/Contents/MacOS
明白接下来的工作的含义……
eclipse.ini中有两种类型的属性:与Eclipse应用相关的属性;与JVM相关的属性。这些选项具体取决于JDK和Eclipse的版本。下面的是我在网上找到的最新的列表。
要理解这些属性,首先要了解Oracle JVM的内存布局。一般来说,JVM内存分成几个内存池,对象根据不同存在时间位于不同的内存池中。
Eden空间(堆)是用于许多刚创建的对象。垃圾收集器每趟一般都是在这里处理”新代的“对象,并移除所有不再使用的对象。
Survivor空间(堆)含有那些在Eden空间中GC两三趟都没有销毁的对象。这些对象依然属于新生代,但将其移动到更安全的地方,被收集的风险大大降低。垃圾收集器在这里运行的频率要低很多(GC根据以往的经验来判断这里的对象都是经常使用的)。
Tenured空间(堆)含有在Survior空间存活相当一段时间的对象。
永生代(非堆)含有JVM的元数据,如类属性、方法、枚举等。由于这些数据可以在多个JVM间共享。所以永生代分只读和读写两个区域。
代码缓存(非堆)提供了用于编译并存储代码的内存空间。
如果你对此感兴趣,Oracle含有一篇很不错的关于配置垃圾收集的文章,其中详细介绍了所有这些空间的用途。
在eclipse.ini中,可以控制每个内存池的大小。下面的配置是针对我的16G内存设定的,但也可用于8G的内存。
使用位于RAM Disk中的JDK(使用在步骤三中的版本号):
-vm /Volumes/JDKRAMDISK/jdk1.x.y_z.jdk/Contents/Home/
-vm N:/jdk1.x.y_z/bin
禁用字节码验证(有风险)
这是跳过了class文件的验证(class文件的验证的信息参见这里),意味着JVM不会检测使用的class文件。如果使用的class文件被修改过,会有安全风险。自己承担风险(我仅仅是玩的时候用,不会在工作中启用这个选项)。
打开编译器性能优化
-XX:+AggressiveOpts
增加永生代空间(分配新对象的地方)(译者注:在JDK 8中,取消了永生代)
-XX:PermSize=512m
-XX:MaxPermSize=512m
增加最小最大堆的空间(含有新生代和年老代)
-Xms2048m
-Xmx2048m
为新生代增加堆的大小
-Xmn512m
为每个线程设置栈大小
-Xss2m
调整垃圾收集
-XX:+UseParallelOldGC
最后,这里列出其他可能在网上看到的选项。就我个人而言,这些选项都没有加速效果,所以仅仅是用来参考。读者可以在网上找到相应的文档,来了解并使用对应的选项:
-XX:MaxGCPauseMillis=10
-XX:+UseG1GC
-XX:CompileThreshold=5
-XX:MaxGCPauseMillis=10
-XX:MaxHeapFreeRatio=70
-XX:+CMSIncrementalPacing
-XX:+UseFastAccessorMethods
-server
最后,移除所有重复的选项,包括launcher.XXMaxPermSize,因为启用了XX:MaxPermSize选项后,这个选项就没用了。
技巧五:关闭杀毒软件
如果有杀毒软件,要确保这些软件不会检查代码文件夹。将JDK、Eclipse、你的.m2/jar代码库和代码文件夹添加到杀毒软件的白名单。
技巧六:不要在Eclipse中运行SVN和GIT
这是个人偏好。有些人喜欢将Eclipse与团队协同工具结合起来。就我个人而言,这样速度很慢,我宁愿Eclipse专注于开发工作,而不是同时做许多事。我还非常喜欢SVN/GIT命令行。不管怎么说,我把这些工具从Eclipse中移除,发现响应速度更快了。
技巧七:使用键盘
Eclipse的一个有点是其中含有大量快捷键。读者可以自行设置相关快捷键。一般我会重新设置调试键,这样就和Visual Studio Chrome Dev Env的行为相同了。花点时间去学习快捷键。用的快捷键越多,使用Eclipse的体验就越快。
这里不会深入介绍快捷键,读者可以很容易的在网上找到相关资料。下面列出一些必备的快捷键:
Ctrl+Shift+R : jump to resource
Ctrl+Shift+T : jump to class
Ctrl+. : jump to next error
Ctrl+Shift+G : search for references
Ctrl+Shift+P : select matching bracket
Alt+Arrows : go forward / backwards
Ctrl+Space : autocomplete
Ctrl+Shift+F : format source
Ctrl+Shift+O : organize imports
Ctrl+D : delete line
GC 调优是设置哪个文件啊
问题1,关于JVM GC设置的这一大串参数,是跟在 java 启动命令行中。作用是设置 java 虚拟机启动参数。
比如: java -jar basesvr.jar -Xmx5g -Xms5g -XX:+UseG1GC -XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark -Xms88g -Xmx88g
问题2,有关spark.streaming.unpersist
这是配置在 spark-defaults.conf 文件中的,Spark命令:spark-submit会从conf/spark-defaults.conf读取缺省的配置参数,并传给应用
配置文件中,每一行包括一个键和一个值, 由空格分隔. 比如下面的例子:
spark .master spark: //5.6.7.8:7077
spark .executor .memory 512 m
spark .eventLog .enabled true
spark .serializer org .apache .spark .serializer .KryoSerializer
spark.streaming.unpersist true
elasticsearch java 怎么设置 ignore
Elasticsearch对Java虚拟机进行了预先的配置。通常情况下,因为这些配置的选择还是很谨慎的,所以你不需要太关心,并且你能立刻使用ElasticSearch。
但是,当你监视ElasticSearch节点内存时,你可能尝试修改一些配置。这些修改是否会改善你的处境?
这篇博文尝试揭开Elasticsearch配置的神秘面纱,并且讨论最常见的调整。最终,会给出一些推荐的配置调整。
Elasticsearch JVM 配置概览:
这些是Elasticsearch 0.19.11版本的默认配置。
JVM参数 Elasticsearch默认值 Environment变量
-Xms 256m ES_MIN_MEM
-Xmx 1g ES_MAX_MEM
-Xms and -Xmx ES_HEAP_SIZE
-Xmn ES_HEAP_NEWSIZE
-XX:MaxDirectMemorySize ES_DIRECT_SIZE
-Xss 256k
-XX:UseParNewGC +
-XX:UseConcMarkSweepGC +
-XX:CMSInitiatingOccupancyFraction 75
-XX:UseCMSInitiatingOccupancyOnly +
-XX:UseCondCardMark (commented out)
首先你注意到的是,Elasticsearch预留了256M到1GB的堆内存。
这个设置适用于开发和演示环境。开发人员只需要简单的解压发行包,再执行./bin/elasticsearch -f就完成了Elasticsearch的安装。当然这点对于开发来说非常棒,并且在很多场景下都能工作,但是当你需要更多内存来降低Elasticsearch负载的时候就不行了,你需要比2GB RAM更多的可用内存。
ES_MIN_MEM/ES_MAX_MEM是控制堆大小的配置。新的ES_HEAP_SIZE变量是一个更为便利的选择,因为将堆的初始大小和最大值设为相同。也推荐在分配堆内存时尽可能不要用内存的碎片。内存碎片对于性能优化来说非常不利。
ES_HEAP_NEWSIZE是可选参数,它控制堆的子集大小,也就是新生代的大小。
ES_DIRECT_SIZE控制本机直接内存大小,即JVM管理NIO框架中使用的数据区域大小。本机直接内存可以被映射到虚拟地址空间上,这样在64位的机器上更高效,因为可以规避文件系统缓冲。Elasticsearch对本机直接内存没有限制(可能导致OOM)。
由于历史原因Java虚拟机有多个垃圾收集器。可以通过以下的JVM参数组合启用:
JVM parameter Garbage collector
-XX:+UseSerialGC serial collector
-XX:+UseParallelGC parallel collector
-XX:+UseParallelOldGC Parallel compacting collector
-XX:+UseConcMarkSweepGC Concurrent-Mark-Sweep (CMS) collector
-XX:+UseG1GC Garbage-First collector (G1)
UseParNewGC和UseConcMarkSweepGC组合启用垃圾收集器的并发多线程模式。UseConcMarkSweepGC自动选择UseParNewGC模式并禁用串行收集器(Serial collector)。在Java6中这是默认行为。
CMSInitiatingOccupancyFraction提炼了一种CMS(Concurrent-Mark-Sweep)垃圾收集设置;它将旧生代触发垃圾收集的阀值设为75.旧生代的大小是堆大小减去新生代大小。这告诉JVM当堆内容达到75%时启用垃圾收集。这是个估计的值,因为越小的堆可能需要越早启动GC。
UseCondCardMark将在垃圾收集器的card table使用时,在marking之前进行额外的判断,避免冗余的store操作。UseCondCardMark不影响Garbage-First收集器。强烈推荐在高并发场景下配置这个参数(规避card table marking技术在高并发场景下的降低吞吐量的负面作用)。在ElasticSearch中,这个参数是被注释掉的。
有些配置可以参考诸如Apache Cassandra项目,他们在JVM上有类似的需求。
总而言之,ElastciSearch配置上推荐:
1. 不采用自动的堆内存配置,将堆大小默认最大值设为1GB
2.调整触发垃圾收集的阀值,比如将gc设为75%堆大小的时候触发,这样不会影响性能。
3.禁用Java7默认的G1收集器,前提是你的ElasticSearch跑在Java7u4以上的版本上。
JVM进程的内存结果
JVM内存由几部分组成:
Java代码本身:包括内部代码、数据、接口,调试和监控代理或者字节码指令
非堆内存:用于加载类
栈内存:用于为每个线程存储本地变量和操作数
堆内存:用于存放对象引用和对象本身
直接缓冲区:用于缓冲I/O数据
堆内存的大小设置非常重要,因为Java的运行依赖于合理的堆大小,并且JVM需要从操作系统那获取有限的堆内存,用于支撑整个JVM生命周期。
如果堆太小,垃圾回收就会频繁发生,发生OOM的几率会很大。
如果堆太大,垃圾回收会延迟,但是一旦回收,就需要处理大量的存活堆数据。并且,操作系统的压力也会变大,因为JVM进程需要更大的堆,产生换页的可能性就会提高。
注意,使用CMS垃圾收集器,Java不会把内存还给操作系统,因此配置合理的堆初始值和最大值就非常重要。
非堆内存由Java应用自动分配。没有什么参数控制这里的大小,这是由Java应用程序代码自己决定的。
栈内存在每个线程中分配,在Elasticsearch中,每个线程大小必须由128K增加到256K,因为Java7比Java6需要更大的栈内存 ,这是由于Java7支持新的编程语言特征来利用栈空间。比如,引入了continuations模型,编程语言的一个著名概念。Continuations模型对于
协同程序、绿色线程(green thread)、纤程(fiber)非常有用 。当实现非阻塞I/O时,一个大的优势是,代码可以根据线程实际使用情况编写,但是运行时仍然在后台采用非阻塞I/O。Elasticsearch使用了多个线程池,因为Netty I/O框架和Guava是Elasticsearch的基础组件,因此在用Java7时,可以考虑进一步挖掘优化线程的特性。
发挥增加栈空间大小的优势还是有挑战的,因为不同的操作系统、不同的CPU架构,甚至在不同的JVM版本之间,栈空间的消耗不是容易比较的。取决于CPU架构和操作系统,JVM的栈空间大小是内建的。他们是否在所有场景下都适合?例如Sloaris Sparc 64位的JVM Xss默认为512K,因为有更大地址指针,Sloaris X86为320K。Linux降为256K。Windows 32位Java6默认320K,Windows 64位则为1024K。