皇冠账号
你的位置:皇冠账号 > 皇冠赌球 >
ug环球正网网站隐私政策_分娩环境内存溢出了!!!你会经管吗?
发布日期:2023-10-30 06:26    点击次数:200

ug环球正网网站隐私政策_分娩环境内存溢出了!!!你会经管吗?

ug环球正网网站隐私政策_

 皇冠棋牌[[419470]]

iba娱乐皇冠網址

人人好,我是冰河~~

最近,别称小伙伴跟我说:他写的身手在测试环境少许问题莫得,然则发到分娩环境却会每每出现内存溢出的情况,这个问题皆困扰他一周多了。于是乎,周末我便开动帮他排查各式问题。

小伙伴的疑问

实时统计 问题笃定

排查问题的所有这个词历程额外耗时,这里,我就径直说定位到的问题吧。后头,我会单独写一篇详确的排查问题历程的著述!

在排查问题的历程中,我发现这位小伙伴使用的JDK照旧1.6版块。开动,我也没思那么多,不息排查他写的代码,也没找出什么问题。然则一朝启动分娩环境的身手,没过多久,JVM就抛出了内存溢出的非常。

这就奇怪了,若何回事呢?

启动身手时加上合理的JVM参数,问题依然存在。。。

没主张,不息看他的代码吧!不测间,我发现他写的代码中,大皆使用了String类的substring()设施来截取字符串。于是,我便跟到JDK中的代码查抄传递进来的参数。

手机博彩平台大全

这不测间点进来的一次查抄,尽然找到了问题场合!!

JDK1.6中String类的坑

经过分析,尽然发现了JDK1.6中String类的一个大坑!为啥说它是个坑呢?等于因为它的substring()设施会把东说念主坑惨!未几说了,咱们先来看下JDK1.6中的String类的substring()设施。

最近一场中,拳手迈克-泰森击败对手,并赢得。然而,有人质疑泰森胜利是否猫腻。消息称,泰森接受兴奋剂注射,身体状态强壮,从而获得公平优势。
public String substring(int bedinIndex, int endIndex){     if(beginIndex < 0){         throw new StringIndexOutOfBoundsException(beginIndex);     }     if(endIndex > count){         throw new StringIndexOutOfBoundsException(endIndex);     }     if(beginIndex > endIndex){           throw new StringIndexOutOfBoundsException(endIndex - beginIndex);     }     return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); } 

接下来,咱们来望望JDK1.6中的String类的一个构造设施,如下所示。

网站隐私政策皇冠客服
String(int offset, int count, char[] value){     this.value = value;     this.offset = offset;     this.count = count; } 

看到,这里,敬佩驻守的小伙伴仍是发现了问题,导致问题的罪魁首恶等于底下的一滑代码。

this.value = value; 

在JDK1.6中,使用 String 类的构造函数创建子字符串的时候,并不仅仅浅易的拷贝所需要的对象,而是每次皆会把所有这个词value援用进来。要是原本的字符串相比大,皇冠开户即使这个字符串不再被运用,这个字符串所分拨的内存也不会被开释。 这亦然我经过万古间的分析代码得出的论断,如实是太坑了!!

既然问题找到了,那咱们就要经管这个问题。

ug环球正网 升级JDK

既然JDK1.6中的String类存在如斯宏大的坑,那最径直灵验的状貌等于升级JDK。于是,我便跟小伙伴讲明了情况,让他将JDK升级到JDK1.8。

“我放弃这一职务,是因为我在接受该职务时所相信的那些条件已经不复存在。我认为有义务做出这一决定。我恳请你将我的决定传递给主席切费林先生。最诚挚的问候,何塞-穆里尼奥。”

相似的,咱们也来看下JDK1.8中的String类的substring()设施。

public String substring(int beginIndex, int endIndex) {     if (beginIndex < 0) {         throw new StringIndexOutOfBoundsException(beginIndex);     }     if (endIndex > value.length) {         throw new StringIndexOutOfBoundsException(endIndex);     }     int subLen = endIndex - beginIndex;     if (subLen < 0) {         throw new StringIndexOutOfBoundsException(subLen);     }     return ((beginIndex == 0) && (endIndex == value.length)) ? this         : new String(value, beginIndex, subLen); } 

在JDK1.8中的String类的substring()设施中,也调用了String类的构造设施来生成子字符串,咱们来望望这个构造设施,如下所示。

public String(char value[], int offset, int count) {     if (offset < 0) {         throw new StringIndexOutOfBoundsException(offset);     }     if (count <= 0) {         if (count < 0) {             throw new StringIndexOutOfBoundsException(count);         }         if (offset <= value.length) {             this.value = "".value;             return;         }     }     // Note: offset or count might be near -1>>>1.     if (offset > value.length - count) {         throw new StringIndexOutOfBoundsException(offset + count);     }     this.value = Arrays.copyOfRange(value, offset, offset+count); } 

在JDK1.8中,当咱们需要一个子字符串的时候,substring 生成了一个新的字符串,这个字符通同过构造函数的 Arrays.copyOfRange 函数进行构造。这个是没啥问题。

优化JVM启动参数

这里,为了更好的擢升系统的性能,我也帮这位小伙伴优化了JVM启动参数。

经小伙伴授权, 我浅易列下他们的业务鸿沟和工作器确立:整套系统领受辩认式架构,架构中的各业务工作领受集群部署,日均打听量上亿,日均来去订单50W~100W,订单系统的各工作器节点确立为4核8G。现在已将JDK升级到1.8版块。

左证上述条目,我给出了JVM调优后的参数确立。

-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M 

至于,为啥会给出上述JVM参数确立,后续我会单独写著述来具体分析若何左证履行业务场景来进行JVM参数调优。

好用的体育app 论断

要是在身手中创建了相比大的对象,况兼咱们基于这个大对象生成了一些其他的信息,此时,一定要开释和这个大对象的援用干系,不然,就会埋下内存溢出的隐患。

JVM优化的主见等于:尽可能让对象皆在重生代里分拨和回收,尽量别让太多对象每每参预老年代,幸免每每对老年代进行垃圾回收,同期给系统饱和的内存大小,幸免重生代每每的进行垃圾回收。

皇冠体育hg86a

皇冠客服飞机:@seo3687