最终定位到的代码如下:
@RestControllerpublic class IndexController { @RequestMapping("/user/process") public String processUserData() throws InterruptedException { ArrayList<User> users = queryUsers(); for (User user: users) { //TODO 业务处理 System.out.println("user:" + user.toString()); } return "end"; } /** * 模拟批量查询用户场景 * @return */ private ArrayList<User> queryUsers() { ArrayList<User> users = new ArrayList<>(); for (int i = 0; i < 5000; i++) { users.add(new User(i,"zhuge")); } return users; }}public class User { private int id; private String name; // 1024B * 100 = 100KB byte[] a = new byte[1024*100]; public User(){} public User(int id, String name) {super();this.id = id;this.name = name; } public int getId() {return id;} public void setId(int id) {this.id = id;} public String getName() {return name;} public void setName(String name) {this.name = name;}}发现User类中定义了一个byte[] a 成员变量 , 占了100KB,在queryUsers()中 , 一次性在内存中添加了500M的对象数据 , 明显不合适 , 需要根据上述中的运行时内存数据区域阈值进行优化 , 尽量消除这种朝生夕死的对象导致的full GC.
总结:到这里 , 调优案例就结束了 , 整个过程考虑了jvm的各个调优知识点 , 相信有心的读者可以学到一些知识点 。
经验总结扩展阅读
- 441010怎么算24点
- MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选
- JVM调优工具使用手册
- JVM运行时数据区域详解
- JVM学习笔记——内存模型篇
- 星之彼端最强阵容搭配思路参考攻略
- jvm双亲委派机制详解
- 万字详解JVM,让你一文吃透
- JVM学习笔记——类加载和字节码技术篇
- 航海王热血航线欢乐海钓玩法思路是什么