我在本地用Jackson可以复现这个问题了。

import java.io.IOException;
import java.util.Map;
import java.util.Random;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Test {
public static void main(String[] args) throws IOException {
// JsonFactory factory = new JsonFactory().disable(JsonFactory.Feature.INTERN_FIELD_NAMES);
// ObjectMapper om = new ObjectMapper(factory);
ObjectMapper om = new ObjectMapper(); Random random = new Random();
while (true) {
System.out.println("Press any key to continue");
System.in.read();
int key = random.nextInt();
System.out.println("Generated key: " + key);
Map<Integer, Boolean> desMap =
om.readValue(String.format("{\"%s\":\"true\"}", key), new TypeReference<Map<Integer, Boolean>>() {});
System.out.println("Read map: " + desMap);
}
}
}

这是我复现的代码,我每次产生一个随机的integer作为map的key,然后用objectMapper反序列化。然后我运行我的另外一个PrintStringTable的类,可以看到每次产生的Integer都会进入Constant Pool中
如果我把构造ObjectMapper的代码改成我注释掉的代码的话,不管产生多少随机Integer key,都不会进入Constant Pool
PrintStringTable类如下

import sun.jvm.hotspot.memory.StringTable;
import sun.jvm.hotspot.memory.SystemDictionary;
import sun.jvm.hotspot.oops.Instance;
import sun.jvm.hotspot.oops.InstanceKlass;
import sun.jvm.hotspot.oops.OopField;
import sun.jvm.hotspot.oops.TypeArray;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.tools.Tool;
public class PrintStringTable extends Tool {
public PrintStringTable() {
}
public static void main(String args[]) throws Exception {
if (args.length == 0 || args.length > 1) {
System.err.println("Usage: java PrintStringTable <PID of the JVM whose string table you want to print>");
System.exit(1);
}
PrintStringTable pst = new PrintStringTable();
pst.execute(args);
pst.stop();
}
@Override
public void run() {
StringTable table = VM.getVM().getStringTable();
table.stringsDo(new StringPrinter());
}
class StringPrinter implements StringTable.StringVisitor {
private final OopField stringValueField;
public StringPrinter() {
InstanceKlass strKlass = SystemDictionary.getStringKlass();
stringValueField = (OopField) strKlass.findField("value", "[C");
}
@Override
public void visit(Instance instance) {
TypeArray charArray = ((TypeArray) stringValueField.getValue(instance));
StringBuilder sb = new StringBuilder();
for (long i = 0; i < charArray.getLength(); i++) {
sb.append(charArray.getCharAt(i));
}
System.out.println("Address: " + instance.getHandle() + " Content: " + sb.toString());
}
}
}

需要用/{jdk_HOME}/lib/sa-jdi.jar进行编译和运行,运行参数是需要attach的pid

修改要点

protected JsonFactory factory = new JsonFactory().disable(JsonFactory.Feature.INTERN_FIELD_NAMES);
protected ObjectMapper mapper = new ObjectMapper(factory).setTimeZone(TimeZone.getDefault());

参考Oracle Java 官方文档

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html (Native Memory Tracking)

Jackson 触发的String.intern() bug, 导致内存持续增加,JVM-Java内存泄漏的更多相关文章

  1. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  2. 《成神之路-基础篇》JVM——Java内存模型(已完结)

    Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...

  3. iOS开发:MKMapView地图内存持续增加的释放解决办法

    内存持续增加的释放解决办法 最近修改一个用到MKMapView的项目,内存一直占用过多,每次拖拽地图时还会增加占用,且一直无法释放. 经过两天的排查,最后锁定是创建的self.map对象在加载地图的时 ...

  4. [jvm]java内存模型

    一.java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一 ...

  5. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  6. 【转】Java内存管理:深入Java内存区域

    转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...

  7. Java内存管理:深入Java内存区域

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的皇帝 ...

  8. JVM Java 内存区域透彻分析(转)

    出处:  Java 内存区域透彻分析  Java8内存模型—永久代(PermGen)和元空间(Metaspace) 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这 ...

  9. JVM内存管理:深入Java内存区域与OOM

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝 ...

随机推荐

  1. matlab练习程序(随机粒子切换特效)

    视频制作软件中一般都会有相邻帧切换的特效,我过去用过vagas好像就有很多切换特效. 我想这个也算是其中一种吧,虽然我不确定实际中到底有没有这种切换. 实际上我只是下班后太无聊了,写着玩的,没什么高深 ...

  2. 多线程 更新 winform 控件的值,以避免UI线程的卡顿

    委托 private delegate void UpdateDGV_AddRes_CallBack(Int32 i,bool Res); 函数实现 private void UpdateDGV_De ...

  3. Sql根据经纬度算出距离

    SELECT  ISNULL((2 * 6378.137 * ASIN(SQRT(POWER(SIN((117.223372- ISNULL(Latitude,0) )*PI()/360),2)+CO ...

  4. 使用embeded tomcat进行嵌入式javaee开发-启动tomcat

    昨天在网上研究了下关于将tomcat嵌入到主程序中进行运行,而不是像以前将一个web项目copy到tomcat中进行运行.之所以这样做的原因,即是因为项目部署到客户方,在进行更新的时候,需要手动地进行 ...

  5. vmware克隆的linux机器网络不通

    当我使用vmware的完全克隆功能克隆出两台虚拟机之后,登录发现网络不通,仔细检查发现几个问题,由于克隆之后默认的eth0网卡在系统中会变成eth1,导致之前的eth0网卡配置信息无法加载,网络不通, ...

  6. 深入JDK源码,这里总有你不知道的知识点!

    Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面最 ...

  7. WAKE-WIN10-SOFT-python配置

    1,anaconda下载,安装 1,1 官网:https://www.continuum.io/downloads 下载:https://repo.continuum.io/archive/ win1 ...

  8. <context:property-placeholder>配置资源文件

    直接在 spring 配置文件里面加上 <context:property-placeholder file-encoding="UTF-8" location=" ...

  9. 使用错误的操作系统用户exp数据导致ORA-15186错误

    生产环境alert日志中出现如下错误:Fri Dec 30 14:28:28 2016Errors in file XXXXXX.trc:ORA-15186: ASMLIB error functio ...

  10. RHEL6.5和RHEL7 的区别(转)

    Rhel6.5实验环境搭建 1)操作系统安装 RHEL7是一站式安装   2)网卡配置文件 RHEL6: /etc/sysconfig/network-scripts/ifcfg-eth0 RHEL7 ...