一行代码,我优化掉了1G内存占用
阿里妹导读
背景
正文
public class StringPoolDeserializer implements ObjectDeserializer {@SuppressWarnings("unchecked")@Overridepublic <T> T deserialze(DefaultJSONParser parser, Type type, Object o) {if (!type.equals(String.class)) {throw new JSONException("StringPoolDeserializer can only deserialize String");}return (T) ((String) parser.parse(o)).intern();}@Overridepublic int getFastMatchToken() {return 0;}}
public class StringPoolMap extends HashMap<String, String> {@Overridepublic String put(String key, String value) {if (key != null) {key = key.intern();}if (value != null) {value = value.intern();}return super.put(key, value);}}
写在最后
多写一点,String.intern()的实现
‒尝试把this放进一个池子里,如果里面内容相等的东西已经存在了,则返回那个已经存在的地址。
#include "jvm.h"#include "java_lang_String.h"JNIEXPORT jobject JNICALLJava_java_lang_String_intern(JNIEnv *env, jobject this){return JVM_InternString(env, this);}
#include "jvm.h"#include "java_lang_String.h"JNIEXPORT jobject JNICALLJava_java_lang_String_intern(JNIEnv *env, jobject this){return JVM_InternString(env, this);}
oop StringTable::intern(Handle string_or_null_h, const jchar* name, int len, TRAPS) {unsigned int hash = java_lang_String::hash_code(name, len);// 分别在shared table 和local table中查找有无存在的string// 找到则快速返回oop found_string = lookup_shared(name, len, hash);if (found_string != nullptr) {return found_string;}if (_alt_hash) {hash = hash_string(name, len, true);}found_string = do_lookup(name, len, hash);if (found_string != nullptr) {return found_string;}// 没有找到的话,则创建并塞入return do_intern(string_or_null_h, name, len, hash, THREAD);}
网站静态资源访问加速
本方案使用阿里云CDN产品来分发OSS上的网站静态文件,不仅可以降低源站的负载压力,还能够提升网站的访问性能,同时还能在高并发场景下为您节约成本。快点击阅读原文查看详情。