科普篇之Java堆内缓存优化-对象or基本类型

Java普通对象的内存开销(区别于数组),在64位下无指针压缩,不考虑内存对齐(最多7字节),对象头8字节+指向类型信息的指针8字节=16字节

如下声明对象,B对象就比A对象多占用24字节,怎么又多了8个字节?因为B.data中存放的只是指向堆内对象的引用又占用了8字节

class A {

float data;

}

class B {

Float data;//指向堆中对象的引用 

}

一个Float类型对象在64位下,内存占用是24字节(Float对象头8字节+指向Float类型信息的指针8字节+float数据4字节+4字节的内存对齐)

在(科普篇之Java堆内缓存优化-StringCache的使用-优快云博客)中曾提到过召回i2i相似词表中不但有主播id,每个主播id还有一个Float类型的分数用于在线召回时进行排序截断

class AidScore1 {

String aid;

Float score;

}

class AidScore2 {

String aid;

float score;

}

由于基本类型本身占用内存比较小,AidScore2.score占用8个字节(4字节的float+4字节内存对齐),而使用一个包装类型做为类成员变量AidScore1.score就会占用24字节(指向堆中Float对象的引用8字节+Float对象头8字节+指向Float类型信息的指针8字节),使用一个包装类型Float就会多占用16字节,如果当堆内缓存中存在大量的包装类型时,就会额外占用大量内存

在我们的场景中使用float替换Float后通过对比垃圾回收后的内存占用,粗略估计减少了近2G的内存使用

优化前

优化后

### Spring Boot 濒危动植物科普与救助系统的类图设计 在构建基于Spring Boot的濒危动植物科普与救助系统时,UML类图的设计是一个重要的环节。它能够清晰地展示系统中的各个实体及其关系[^1]。 #### 1. 系统核心模块分析 该系统的核心功能可以分为以下几个部分: - **用户管理**:处理用户的注册、登录以及权限分配。 - **动植物信息管理**:存储和维护濒危动植物的相关数据,包括物种名称、分布区域、保护等级等。 - **科普文章发布与管理**:支持管理员或专家撰写并发布关于濒危动植物的知识性文章。 - **求助请求管理**:允许用户提交有关发现濒危动物或植物的信息,并由相关部门进行审核和处理。 这些模块可以通过一系列相互关联的Java类来实现,在Spring Boot框架下通常会涉及`@Entity`, `@Service`, 和`@Controller`等注解定义的不同层结构[^2]。 #### 2. 主要类及属性描述 以下是几个主要的类及其可能包含的关键字段: ##### 用户(User) ```java @Entity public class User { @Id private String userId; private String username; private String password; private Role role; // Getters and Setters omitted for brevity. } ``` ##### 动植物(Species) ```java @Entity public class Species { @Id private Long speciesId; private String commonName; private String scientificName; private ConservationStatus conservationStatus; // Additional fields like habitat, population trend etc. // Relationships with other entities such as Articles or Reports can be defined here using annotations like @OneToMany/@ManyToOne. } ``` ##### 文章(Article) ```java @Entity public class Article { @Id private Integer articleId; private String title; private Date publishDate; @Lob private String content; @ManyToOne(fetch=FetchType.LAZY) private User author; @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE}) private List<Species> relatedSpeciesList = new ArrayList<>(); } ``` 以上代码片段展示了如何利用JPA注解创建数据库表映射对象[^3]。 #### 3. 关系建模 通过上述三个基本模型可以看出它们之间存在复杂的联系。例如,“User”可能会写多“Article”,而每文章又可提及多个不同的“Species”。这种一对多或多对多的关系需借助外键或者联合主键机制加以表达[^4]。 另外值得注意的是,在实际开发过程中还需要考虑异常情况下的事务控制逻辑等问题;同时为了提高用户体验度还可以加入缓存策略减少频繁访问后台服务造成的延迟现象等等[^5]。 ```plantuml class User{ +String userId +String username +Role role } class Species{ +Long speciesId +String commonName +ConservationStatus conservationStatus } class Article{ +Integer articleId +String title +Date publishDate +String content o-- User : writtenBy *-- Species[]: mentions } User "0..*" -- "*" Article : writes Article "1" -- "*" Species : references ``` 此PlantUML脚本描绘了一个简单的类间交互模式图表[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值