jvm内存最大最小设置 JAVA开发常用的性能优化有哪些?

[更新]
·
·
分类:互联网
2110 阅读

jvm内存最大最小设置

JAVA开发常用的性能优化有哪些?

JAVA开发常用的性能优化有哪些?

没有系统地整理过,就说一些常见的吧,想到什么说什么,有一些关于代码细节,有些可能是一些方法和习惯。
避免过多地创建Java对象:比如在循环中创建对象,创建和回收都需要花费时间;
尽量使用局部变量,或者换一句换说,要根据变量的作用域,把变量定义在合适的地方;
尽量减少计算/操作:这里其实要注意的点很多,一个简单的例子,入参给了10个ID去查询数据库,是循环10遍执行where id,还是执行1遍where id in(list);
使用StringBuffer、Collection的时候,如果能够确认长度/元素数量的话,尽量指定长度/元素数量;因为默认值是比较小的,当它们在做扩展的时候,会有一定性能损耗;
基本数据类型转为字符串,用toString()而不是 ;
在finally块中关闭Stream,要养成好习惯;
尽量少使用正则表达式;非要用的话,尽量把Pattern缓存下来;
如果要多线程处理,请使用线程池;
如果不是必须,用HashMap、ArrayList,而不是HashTable、Vector;根据需要选择使用ArrayList还是LinkedList,反正我一般都是用ArrayList;
在必要的时候捕捉异常,并且不要通过异常控制代码逻辑和业务流程;
一些在数据库中的配置参数(不会经常变化),可以在项目启动的时候或第一次使用的时候,从数据库中查询出来,放到内存或缓存中;不要每次用的时候都去数据库里面查一遍;
接上条,尽量使用懒加载,也就是项目启动的时候创建or第一次使用的时候创建,选择后者;
有些开发人员喜欢用HashMap放一些缓存数据,不如直接使用开源的缓存框架,他们会做的更好;
能在客户端做的话,就不要在服务端做;能在服务端程序里面做的话,就不要在数据库里面做;比如要做where time sysdate-1,那么就在程序中把sysdate-1算出来,再交给SQL。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

metaspace默认大小?

在Java8及以后的版本中,我们可以使用以下命令设置元空间的初始大小和最大大小:-XX:MetaspaceSizeN-设置元空间的初始(和最小大小)。-XX: MaxMetaspaceSizeN-设置元空间的最大大小。
什么是元空间Metaspace Size大小?
从我们的角度来看,需要注意的是,Metaspace的默认最大大小是无限的。相反,java7及更早版本的PermGen在32位JVM上的默认最大大小为64mb,在64位JVM上为82mb。
Metaspace是否会进行收集垃圾?
一旦类元数据使用量达到“MaxMetaspaceSize”,就会触发死类和类加载器的垃圾收集。显然需要对元空间进行适当的监视和调优,以限制此类垃圾收集的频率或延迟。
什么是Java中的元空间内存?
简单地说,Metaspace是一个新的内存空间——从Java8版本开始;它取代了旧的PermGen内存空间。最大的区别在于它如何处理内存分配。因此,默认情况下,本机内存区域会自动增长。
Java8中PermGen空间的替代品是什么?
在Java8中,PermGen空间被元空间取代。PermSize和MaxPermSizeJVM参数将被忽略,如果在启动时出现,则会发出警告。类元数据的大多数分配现在都是从本机内存中分配的。
PermGen是永久生成代的缩写,它是一个特殊的堆空间,它与主Java堆分开,JVM在主堆中跟踪已加载类的元数据。在Java8中,PermGen被重命名为Metaspace—有一些细微的区别。从我们的角度来看,需要注意的是Metaspace有一个无限制的默认最大大小。相反,java7及更早版本的PermGen在32位JVM上的默认最大大小为64mb,在64位版本上为82mb。当然,这些不同于初始尺寸。Java7和更早版本的初始PermGen空间大约为12-21MB。
值得一提的是,在Java7之前,内部字符串通常保存在PermGen上。
这会导致:永久代内存溢出
无论何时需要调整PermGen/Metaspace的大小,JVM都会像对待标准堆一样进行调整。调整这些空间的大小需要一个完整的GC,这通常是一个昂贵的操作。它通常可以在启动时观察到,当许多类被加载时。尤其是当应用程序依赖于许多外部库时。如果在启动过程中有很多完整的gc,通常就是因为这个。在这种情况下,增加初始大小可以提高启动性能。
要增加PermGen,我们有以下命令:
-XX: PermSizeN-设置永久生成空间的初始(和最小大小)。
-XX: MaxPermSizeN-设置永久生成空间的最大大小。
在Java 8及更高版本中,我们可以使用以下命令设置元空间的初始大小和最大大小:
-XX: MetaspaceSizeN-设置元空间的初始(和最小大小)。
-XX: MaxMetaspaceSizeN-设置元空间的最大大小。
对于与Java进程在内存空间中使用的区域相关的大小调整,需要考虑以下几个方面。
Java堆:管理Java对象的空间
元空间:管理类信息的空间
其他空间:堆栈空间,以及java vm和本机方法使用的C堆空间
可以使用以下两种方法来调整上述空间的大小:
注意:
如果上面计算的元空间的最大大小小于64 MB,则该空间的最大大小将设置为64 MB。Java堆和其他空间的最大大小计算如下:将((MaxSizeFallSpaces-100MB)-64 MB)的结果分配给Java堆和其他空间,比例分别为75%和15%。
如果在Java操作环境变量中指定了设置最大大小的Java选项(无论是-Xmx还是-XX:MaxMetaspaceSize),则根据“使用JavaOPTS环境变量指定”中描述的方法确定每个空间的最大大小。
在具有高多重性的请求或具有深调用堆栈的方法的情况下,如果进程输出下面的消息并失败,则表示超出容器中的最大内存值,因此需要在“指定使用JAVAOPTS环境变量”中描述的调优。
exit_description: out of memory, exit_status: 143
使用JAVA_OPTS环境变量指定Metaspace默认大小
指定一个Java选项,该选项设置Java_OPTS环境变量中每个空间的大小。
估计每个空间所需的最大大小,并使用Java选项进行设置,以使空间的总大小不超过(maxSizeOfAllSpaces(默认为1gb)-300mb的结果)(请参阅注1)。300 MB被分配给管理Java应用程序进程的空间。
用户应该验证并负责选择正确的Java选项,而不是Java选项中的-Xmx和-XX:MaxMetaspaceSize。
注意:
请参阅下表,并确保空间的最大大小总和不超过(maxSizeOfAllSpaces(默认为1 GB)-300 MB)的结果。不要省略表中的两个Java选项,因为如果省略了指定最大大小的Java选项,java VM会自动确定最大大小。
对于剩余的空间,从(maxSizeOfAllSpaces减去maxJavaHeapSize和maxMetaspaceSize的总和-300 MB)没有Java选项来配置其他空间。
字节大小可以用-Xmx和-XX:MaxMetaspaceSize指定。以下字符可以指定为单位:
对于KB(千字节):“k”或“k”
对于MB(兆字节):“m”或“m”
对于GB(GB):“g”或“g”