HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小?
HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小? 如何获取当前应用的内存占用大小?
在Android开发中,可以通过ActivityManager.MemoryInfo结构体查询系统内存状态,其中availMem字段表示可用内存字节数,而总内存与已用内存可通过totalMem和availMem计算得出;相关方法包括getMemoryInfo(),并建议在执行内存密集型操作前检查lowMemory标志以避免OutOfMemoryError。
对于iOS应用,Mach内核提供mach_task_basic_info结构体,其resident_size成员直接反映物理内存使用量(字节),可通过thread_infoAPI获取。
更多关于HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在代码中查询:
查询应用堆内存的已分配内存大小使用 hidebug.getNativeHeapAllocatedSize,
查询空闲内存大小使用 hidebug.getNativeHeapFreeSize。
import { hidebug } from '@kit.PerformanceAnalysisKit'
let nativeHeapAllocatedSize: bigint = hidebug.getNativeHeapAllocatedSize();
let nativeHeapFreeSize: bigint = hidebug.getNativeHeapFreeSize();
在命令行中查询:
使用 --mem pid 命令可以获取总内存占用率;如果指定了 pid,则获取该 pid 对应的内存占用率。
hidumper --mem pid
更多关于HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
let nativeMemInfo: hidebug.NativeMemInfo = hidebug.getAppNativeMemInfo(); 获取应用进程内存信息
当前app的内存使用情况可以得到吗?
使用Docker部署Spring Boot应用
1. 创建Spring Boot项目
1.1 使用Spring Initializr创建项目
访问 https://start.spring.io 创建Spring Boot项目,选择以下依赖:
- Spring Web
- Spring Data JPA
- MySQL Driver
- Lombok
1.2 项目结构
docker-springboot-demo
├── src
│ ├── main
│ │ ├── java/com/example/demo
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller
│ │ │ ├── entity
│ │ │ ├── repository
│ │ │ └── service
│ │ └── resources
│ │ ├── application.properties
│ │ └── Dockerfile
├── pom.xml
└── docker-compose.yml
2. 编写示例代码
2.1 实体类 (User.java)
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
2.2 仓库接口 (UserRepository.java)
public interface UserRepository extends JpaRepository<User, Long> {
}
2.3 控制器 (UserController.java)
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserRepository userRepository;
@GetMapping
public List<User> getAllUsers() {
return userRepository.findAll();
}
@PostMapping
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
}
3. 配置Docker
3.1 创建Dockerfile
在项目根目录创建 Dockerfile:
# 使用OpenJDK 11作为基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 复制Maven构建的jar文件
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]
3.2 创建docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: demo_db
MYSQL_USER: demo_user
MYSQL_PASSWORD: demopassword
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- springboot-network
app:
build: .
container_name: springboot_app
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demo_db?useSSL=false&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: demo_user
SPRING_DATASOURCE_PASSWORD: demopassword
ports:
- "8080:8080"
networks:
- springboot-network
volumes:
mysql_data:
networks:
springboot-network:
driver: bridge
3.3 配置application.properties
# 数据库配置
spring.datasource.url=${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/demo_db}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:demo_user}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:demopassword}
# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
# 服务器配置
server.port=8080
4. 构建和运行
4.1 构建项目
# 使用Maven打包
mvn clean package -DskipTests
# 构建Docker镜像
docker-compose build
4.2 启动应用
# 启动所有服务
docker-compose up -d
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs -f app
4.3 测试应用
# 测试API
curl -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" \
-d '{"name":"John Doe","email":"john@example.com"}'
curl http://localhost:8080/api/users
5. 常用Docker命令
5.1 容器管理
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
# 查看容器日志
docker logs springboot_app
# 进入容器
docker exec -it springboot_app sh
5.2 镜像管理
# 查看镜像
docker images
# 删除镜像
docker rmi <image_id>
# 清理未使用的资源
docker system prune -a
6. 生产环境优化建议
6.1 Dockerfile优化
# 使用多阶段构建减少镜像大小
FROM maven:3.8.4-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
6.2 健康检查
在docker-compose.yml中添加:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
7. 故障排除
常见问题
-
数据库连接失败
- 检查MySQL容器是否正常运行
- 验证数据库连接参数
-
端口冲突
- 确保8080和3306端口未被占用
-
构建失败
- 清理Maven缓存:
mvn clean - 重新构建Docker镜像
- 清理Maven缓存:
查看日志
# 查看应用日志
docker-compose logs app
# 查看数据库日志
docker-compose logs mysql
# 实时查看日志
docker-compose logs -f
8. 总结
通过Docker部署Spring Boot应用可以:
- 实现环境一致性
- 简化部署流程
- 便于扩展和维护
- 提高开发效率
使用Docker Compose可以轻松管理多个容器服务,实现应用的快速部署和迁移。
在HarmonyOS Next中,可通过bundleManager.getBundleStats接口获取应用内存占用。使用BundleStats对象的memorySize属性即可获得当前应用的内存使用大小,单位为字节。
在HarmonyOS Next中,获取当前应用的内存占用大小主要依赖于ArkTS/ArkUI框架提供的系统能力。与Android的ActivityManager或iOS的Mach API不同,HarmonyOS提供了更统一和声明式的API。
核心方法是使用@ohos.app.ability.AbilityContext或@ohos.resourceschedule.memoryManager模块。以下是两种常用方案:
方案一:通过memoryManager模块(推荐) 这是获取本应用内存信息的标准方式。
import memoryManager from '@ohos.resourceschedule.memoryManager';
try {
// 获取当前进程的内存信息
let memoryInfo: memoryManager.MemoryUsage = memoryManager.getMemoryUsage();
console.log(`应用物理内存占用: ${memoryInfo.physMem} bytes`);
console.log(`应用虚拟内存占用: ${memoryInfo.virtMem} bytes`);
// 通常关注physMem(物理内存)作为应用的实际内存占用
let usedMemMB = memoryInfo.physMem / (1024 * 1024);
console.log(`应用内存占用: ${usedMemMB.toFixed(2)} MB`);
} catch (err) {
console.error(`获取内存信息失败: ${err.code}, ${err.message}`);
}
方案二:通过AbilityContext 在UIAbility中可以通过context获取:
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage) {
try {
let memoryInfo = this.context.getMemoryUsage();
console.log(`应用内存占用: ${memoryInfo} bytes`);
} catch (err) {
console.error(`获取内存失败: ${err.code}, ${err.message}`);
}
}
}
关键点说明:
memoryManager.getMemoryUsage()返回的是当前进程的内存使用情况,包含physMem(物理内存)和virtMem(虚拟内存)。- 需要申请权限:在
module.json5中添加ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限(系统应用)或使用普通权限ohos.permission.GET_BUNDLE_INFO。 - 获取的是应用自身的内存占用,不是系统总内存。如需系统内存信息,需使用其他系统API。
- HarmonyOS Next的内存管理基于分布式能力,与传统移动OS有架构差异,建议基于获取的内存数据设置合理的阈值进行监控。
实际开发中,方案一更通用,可在应用任何模块中调用;方案二仅限于Ability上下文环境。根据应用架构选择合适方案即可。

