小编Ste*_*ann的帖子

直接缓冲存储器

我需要从 Web 请求返回一个相当大的文件。该文件大小约为 670mb。在大多数情况下,这会正常工作,但一段时间后会抛出以下错误:

java.lang.OutOfMemoryError: Direct buffer memory
    at java.nio.Bits.reserveMemory(Bits.java:694) ~[na:1.8.0_162]
    at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) ~[na:1.8.0_162]
    at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) ~[na:1.8.0_162]
    at sun.nio.ch.Util.getTemporaryDirectBuffer(Util.java:241) ~[na:1.8.0_162]
    at sun.nio.ch.IOUtil.read(IOUtil.java:195) ~[na:1.8.0_162]
    at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:159) ~[na:1.8.0_162]
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65) ~[na:1.8.0_162]
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109) ~[na:1.8.0_162]
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103) ~[na:1.8.0_162]
    at java.nio.file.Files.read(Files.java:3105) ~[na:1.8.0_162]
    at java.nio.file.Files.readAllBytes(Files.java:3158) ~[na:1.8.0_162]
Run Code Online (Sandbox Code Playgroud)

我已将堆大小设置为 4096mb,我认为这应该足以处理此类文件。此外,当发生此错误时,我使用 jmap 进行了堆转储来分析当前状态。我发现了两个相当大的byte[],应该是我要返回的文件。但是堆的大小只有 1.6gb 左右,还没有接近配置的 4gb。

根据类似问题中的一些其他答案(/sf/answers/2798899351/),我尝试在返回此文件之前运行手动 gc。问题仍然存在,但现在只是偶尔出现。一段时间后问题出现了,但是当我再次运行相同的请求时,似乎垃圾收集处理了导致问题的任何问题,但这还不够,因为问题显然仍然可能发生。有没有其他方法可以避免这个内存问题?

java memory heap-memory out-of-memory

8
推荐指数
2
解决办法
1万
查看次数

具有自定义 JSON 响应的 Feign 错误解码器

我有一个 API,它将以自定义响应消息的形式返回失败,同时仍然发送 Http 200 响应。例子:

Status: 200
Body: {
   "code":404,
   "message":"Data not found",
   "data":{},
   "status":"ERROR"
}
Run Code Online (Sandbox Code Playgroud)

我当前的 ErrorDecoder 实现:

public class ApiFeignErrorDecoder implements ErrorDecoder {

    private final Gson gson;

    public ApiFeignErrorDecoder(Gson gson) {
        this.gson = gson;
    }

    @Override
    public Exception decode(String methodKey, Response response) {

        try {
            ApiResponse apiResponse = gson.fromJson(response.body().asReader(), BaseApiResponse.class);
            ResponseStatus status = apiResponse.getStatus();
            switch (status) {
                case SUCCESS:
                    return null;
                case FAIL:
                    return new Exception("Failure message recorded");
                case ERROR:
                    return new Exception("Error message recorded");
                default:
                    return new …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-cloud-feign feign

6
推荐指数
1
解决办法
2万
查看次数

Hibernate 使用不可变列表初始化集合

我有以下实体:

@Entity(name = "courses")
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Singular
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Collection<Comment> comments = new ArrayList<>();

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private User createdBy;

    public void addComment(Comment comment) {
        comments.add(comment);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从数据库加载课程时,评论将使用持久包进行初始化。当我调用 时出现问题addComment(comment),然后出现此异常:

Caused by: java.lang.UnsupportedOperationException: null
    at java.base/java.util.AbstractList.add(AbstractList.java:153) ~[na:na]
    at java.base/java.util.AbstractList.add(AbstractList.java:111) ~[na:na]
    at org.hibernate.collection.internal.PersistentBag.add(PersistentBag.java:408) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]
Run Code Online (Sandbox Code Playgroud)

看来休眠分配的 Persistant Bag 是一个Collection.EmptyList不可变的,因此无法添加任何注释。

我需要更改什么才能添加评论?

java hibernate jpa

6
推荐指数
1
解决办法
2202
查看次数

Vue 类组件属性未在实例上定义

我遇到的问题是,在应用程序从服务器后端获取一些数据后,我的 UI 无法更新。

我有以下代码:

<template>
  <div v-if="restaurant">
    <div class="center logo-container">
        <img class="img-fit" v-bind:src="'/api/restaurant/logo/' + restaurant.id" alt=""/>
    </div>
    <h2 class="title center dm-text-header">{{ restaurant.name }}</h2>
    <h4 class="subheading center">{{ restaurant.address.street }}, {{ restaurant.address.city }}</h4>     
  </div>
</template>

<script lang="ts">
import axios from 'axios';
import { Options, Vue } from "vue-class-component";
import { Tag } from "./Tag";
import { Restaurant } from "./Restaurant";

@Options({
  props: {
  }
})
export default class Menu extends Vue {  
  // hardcoded for testing 
  restaurantId =  "8ykw9ljq";   

  tagUrl = "/api/menu/" …
Run Code Online (Sandbox Code Playgroud)

javascript typescript vue.js vue-component vue-class-components

2
推荐指数
1
解决办法
1109
查看次数