HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小?

HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小? 如何获取当前应用的内存占用大小?

在Android开发中‌,可以通过ActivityManager.MemoryInfo结构体查询系统内存状态,其中availMem字段表示可用内存字节数,而总内存与已用内存可通过totalMemavailMem计算得出;相关方法包括getMemoryInfo(),并建议在执行内存密集型操作前检查lowMemory标志以避免OutOfMemoryError。‌

对于iOS应用‌,Mach内核提供mach_task_basic_info结构体,其resident_size成员直接反映物理内存使用量(字节),可通过thread_infoAPI获取。‌


更多关于HarmonyOS鸿蒙Next中如何获取当前应用的内存占用大小?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

在代码中查询:

查询应用堆内存的已分配内存大小使用 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(); 获取应用进程内存信息

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-hidebug#hidebuggetappnativememinfo12

当前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. 故障排除

常见问题

  1. 数据库连接失败

    • 检查MySQL容器是否正常运行
    • 验证数据库连接参数
  2. 端口冲突

    • 确保8080和3306端口未被占用
  3. 构建失败

    • 清理Maven缓存:mvn clean
    • 重新构建Docker镜像

查看日志

# 查看应用日志
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}`);
    }
  }
}

关键点说明:

  1. memoryManager.getMemoryUsage()返回的是当前进程的内存使用情况,包含physMem(物理内存)和virtMem(虚拟内存)。
  2. 需要申请权限:在module.json5中添加ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限(系统应用)或使用普通权限ohos.permission.GET_BUNDLE_INFO
  3. 获取的是应用自身的内存占用,不是系统总内存。如需系统内存信息,需使用其他系统API。
  4. HarmonyOS Next的内存管理基于分布式能力,与传统移动OS有架构差异,建议基于获取的内存数据设置合理的阈值进行监控。

实际开发中,方案一更通用,可在应用任何模块中调用;方案二仅限于Ability上下文环境。根据应用架构选择合适方案即可。

回到顶部