Java优化 - 领域对象

白色玫瑰 程序猿

时间: 2023-07-11 阅读: 1 字数:3250

{}
Java优化 - 领域对象\nDomain objects表达程序里的业务概念。比如电子商务系统里的Order、OrderItem和DeliverySchedule。这些类型之间有相关关系(Order可以包含多个OrderItem实例)。例如:\npublic class Order {\n private final long id;\n private final List<Orde...

Java优化 - 领域对象

Domain objects表达程序里的业务概念。比如电子商务系统里的Order、OrderItem和DeliverySchedule。这些类型之间有相关关系(Order可以包含多个OrderItem实例)。例如:

public class Order {
   private final long id;
   private final List<OrderItem> items = new ArrayList<>();
   private DeliverySchedule schedule;

   public Order(long id) {
      this.id = id;
   }

   public DeliverySchedule getSchedule() {
      return schedule;
   }

   public void setSchedule(DeliverySchedule schedule) {
      this.schedule = schedule;
   }

   public List<OrderItem> getItems() {
      return items;
   }

   public long getId() {
      return id;
   }
}

public class OrderItem {
   private final long id;
   private final String description;
   private final double price;

   public OrderItem(long id, String description, double price) {
      this.id = id;
      this.description = description;
      this.price = price;
   }

   @Override
   public String toString() {
      return "OrderItem{" + "id=" + id + ", description=" +
            description + ", price=" + price + '}';
   }
}

public class DeliverySchedule {
   private final LocalDate deliveryDate;
   private final String address;
   private final double deliveryCost;

   private DeliverySchedule(LocalDate deliveryDate, String address,
                      double deliveryCost) {
      this.deliveryDate = deliveryDate;
      this.address = address;
      this.deliveryCost = deliveryCost;
   }

   public static DeliverySchedule of(LocalDate deliveryDate, String address,
                             double deliveryCost) {
      return new DeliverySchedule(deliveryDate, address, deliveryCost);
   }

   @Override
   public String toString() {
      return "DeliverySchedule{" + "deliveryDate=" + deliveryDate +
            ", address=" + address + ", deliveryCost=" + deliveryCost + '}';
   }
}

可以看到,领域类型之间有所有权关系,见下图。当然,领域对象图的叶子节点,大部分是简单的数据类型,比如字符串、原始类型和LocalDateTime。 Domain objects graph

使用jmap -histo命令,可以查看堆内状态,当然,也可以使用GUI工具,比如VisualVM。学习这些工具,可以诊断领域对象的内存泄漏情况。 另一个常见的领域对象泄漏行为是“所有代”效应-特定类型的对象没有被回收。这意味着他们会存活足够长时间成为Tenured,经过足够多的survive回收之后,有很大的代计数(generational count)。 如果我们绘制每个代计数的每个数据类型的字节数量的直方图,可以看到泄漏的领域对象跨越所有的代。应该查看领域对象相关的数据集的大小,看这些值是否合理。 而短期存活的领域对象能导致浮动垃圾问题。回想一下并发回收的SATB约束-如果在标记周期开始后分配的对象,无论有多短命,也被认为是活的。领域对象泄漏能导致高的GC标记时间,根本原因是单个长期存活的对象会让整个对象链长期存活。

原文地址:https://blog.csdn.net/weixin_43364172/article/details/86519616?ops_request_misc=&request_id=7358bddffa5a4b5a842fdc40cf8ff8c5&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~koosearch~default-2-86519616-null-null.142^v88^insert_down28v1,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

本文章网址:https://www.sjxi.cn/detil/bb0d0d0fa831458ea07fe5081439904e

最新评论

当前未登陆哦
登陆后才可评论哦

湘ICP备2021009447号

×

(穷逼博主)在线接单

QQ: 1164453243

邮箱: abcdsjx@126.com

前端项目代做
前后端分离
Python 爬虫脚本
Java 后台开发
各种脚本编写
服务器搭建
个人博客搭建
Web 应用开发
Chrome 插件编写
Bug 修复