小编Pet*_*rch的帖子

OpenJDK JVM是否会将堆内存返回给Linux?

我们有一个长期存在的服务器进程,很快就需要大量的RAM.我们看到,一旦JVM从操作系统获得内存,它就永远不会将其返回给操作系统.我们如何要求JVM将堆内存返回给操作系统?

通常,这些问题的接受答案是使用 -XX:MaxHeapFreeRatio-XX:MinHeapFreeRatio.(参见例如 1,2,3,4).但是我们像这样运行java:

java -Xmx4G -XX:MaxHeapFreeRatio=50 -XX:MinHeapFreeRatio=30 MemoryUsage
Run Code Online (Sandbox Code Playgroud)

仍然在VisualVM中看到这个:

Visual VM内存使用情况

显然,JVM并不尊重,-XX:MaxHeapFreeRatio=50因为heapFreeRatio非常接近100%而且远不及50%.无需点击"执行GC"即可将内存返回给操作系统.

MemoryUsage.java:

import java.util.ArrayList;
import java.util.List;

public class MemoryUsage {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Sleeping before allocating memory");
        Thread.sleep(10*1000);

        System.out.println("Allocating/growing memory");
        List<Long> list = new ArrayList<>();
        // Experimentally determined factor. This gives approximately 1750 MB
        // memory in our installation.
        long realGrowN = 166608000; //
        for (int i = 0 ; i < realGrowN …
Run Code Online (Sandbox Code Playgroud)

java memory-management heap-memory

52
推荐指数
1
解决办法
2856
查看次数

perl的autodie.pm中的错误?

我期待着:

#!/usr/bin/perl
use autodie;
# autodie in effect here
{
    no autodie;
    # autodie is not in effect here
}
# autodie should be in effect here because of the supposedly lexical scope
# of autodie, but this doesn't die:
open my $i, '<', '/nonexistent';
Run Code Online (Sandbox Code Playgroud)

我的基础是perldoc autodie:

"autodie"编译指示具有词法范围,这意味着使用"autodie"更改的函数和子例程只会更改其行为,直到封闭块,文件或"eval"结束

此外,{ no autodie }(在范围内)甚至是概要的一部分

use/no warnings 表现得像我期望的那样:

#!/usr/bin/perl
use warnings;
{
    no warnings;
}
# This *does* generate a warning
print undef;
Run Code Online (Sandbox Code Playgroud)

我错过了什么或者您是否同意autodie中的错误?我没有在autodie buglist中找到任何东西 …

perl

29
推荐指数
1
解决办法
1189
查看次数

perl:为什么Devel :: Refcount :: refcount和Devel :: Peek :: SvREFCNT不一致?

我正在阅读如何访问Perl哈希的引用计数?,并有两个Devel::Refcount::refcountDevel::Peek::SvREFCNT提出了建议.

但他们没有返回相同的引用计数.这是为什么?

这是一个修改过的例子perldoc Devel::Refcount:

use Devel::Peek;
use Devel::Refcount;

my $anon = [];

printf "Anon ARRAY $anon has %d/%d reference\n",
    Devel::Refcount::refcount($anon),
    Devel::Peek::SvREFCNT($anon);

my $otherref = $anon;

printf "Anon ARRAY $anon now has %d/%d references\n",
    Devel::Refcount::refcount($anon),
    Devel::Peek::SvREFCNT($anon);
Run Code Online (Sandbox Code Playgroud)

打印出:

Anon ARRAY ARRAY(0x8b10818) has 1/1 reference
Anon ARRAY ARRAY(0x8b10818) now has 2/1 references
Run Code Online (Sandbox Code Playgroud)

注意最后2/1的差异......

(如果事实证明我没有做一些愚蠢的事情,我会添加一个链接,如何访问Perl哈希的引用计数?到这里)

perl

15
推荐指数
2
解决办法
513
查看次数

守夜人:比`.pause(1000)`更好的方法来避免脆弱的测试?

是否.pause(1000)真的是最好的做法有等待表单提交?我正在寻找一种方法来可靠地提交表单,而不必知道由于表单提交而出现的页面的详细信息.

从这个例子主页使用.pause(1000)等待表单提交,讽刺的是没有任何工作更长的时间,但这个版本与修改CSS选择器版本的功能:

module.exports = {
  'Demo test Google' : function (client) {
    client
      .url('http://www.google.com')
      .waitForElementVisible('body', 1000)
      .assert.title('Google')
      .assert.visible('input[type=text]')
      .setValue('input[type=text]', 'rembrandt van rijn')
      .waitForElementVisible('button[name=btnG]', 1000)
      .click('button[name=btnG]')
      .pause(1000)
      // This selector is different from the home page's - this one
      // works...
      .assert.containsText('ol#rso div.g:first-of-type',
        'Rembrandt - Wikipedia')
  }
};
Run Code Online (Sandbox Code Playgroud)

.pause(1000)确保提交表单的问题是如何确定超时.如果超时太长,它要么让我们的测试变慢,要么如果超时太短,要么让它们变脆.缓慢的硬件,服务器上的其他进程,月球对齐,你可以命名它可以影响应该是什么"好"的超时值.

有没有更好的方式说:"等待表格在继续之前提交"?

.waitForElementVisible('body', VERY_LONG_TIMEOUT)相反,我们已经进行了实验,似乎工作并且不需要花费更长的时间,但我猜这也不可靠.它只能起作用,因为"当前"页面已经消失(这次),所以我们正在等待"新"页面的主体出现.明天会发生一些奇怪的事情,它会比正常情况更快,并且.waitForElementVisible('body')会立即返回,因为旧页面仍然存在.==也很脆弱.那是对的吗?

如果是这样,有比一些不太脆的方式.pause(1000)还是 .waitForElementVisible('body')?特别是如果我们对提交后返回的页面了解不多,那么我们不能 .waitForElementVisible('.element-only-on-new-page')呢?

我问的原因是我们的测试看起来更像是:

module.exports = {
  'Test1 - submit form' : function (client) { …
Run Code Online (Sandbox Code Playgroud)

javascript nightwatch.js

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

GCP:如何修剪/维护 Artifact Registry 存储?

我们已经开始使用 Google Cloud Platform 的Artifact Registry,其定价为公价。英国公关。月。

但我如何才能看到正在使用多少存储空间以及使用了什么存储空间?

看起来所有推送的图像默认情况下都会永久保存。那么对于每个构建,存储库只会不断增长?如何(自动?)删除旧版本,只保留最新的可用版本(或 N 个或标记图像)?

给我们定价似乎不诚实。GB,但没有提供任何方法来调查或修剪正在使用的存储量,所以我希望我们错过了一些东西。

编辑添加:我们有 CI/CD 管道每天创建 20-50 个新图像。从长远来看,必须手动删除它们是不可维护的。

编辑添加:本质上我正在寻找sethvargo/gcr-cleaner:删除 Google 容器注册表中未标记的图像引用,作为一项服务,但用于 ArtifactRegistry 而不是 ContainerRegistry,它将替换它。或者启发 gcr-cleaner 的 shell 脚本要点(也仅限 GCR)。

google-cloud-platform google-artifact-registry

13
推荐指数
2
解决办法
5982
查看次数

如何优雅地创建在X下启动WSL程序的Windows快捷方式

xfce4-terminal我在通过 Windows 任务栏上的按钮从 VcXsrv 下的 WSL 安装启动时遇到了一些困难。完成后,除了 xfce4-terminal 之外,我不需要任何 DOS 框/控制台/终端。我已经可以使用了,但是它太丑了。有人有更干净的方法吗?

\n

这是我所做的工作:我在桌面上使用此目标创建了一个 Windows 快捷方式(全部在一行中,为了便于阅读,用换行符分隔):

\n
C:\\Windows\\System32\\wscript.exe\n    \\\\wsl$\\Ubuntu-20.04\\home\\peter\\bin\\windows\\startTerminal.vbs\n
Run Code Online (Sandbox Code Playgroud)\n

startTerminal.vbs灵感来自10 Ways To Run Batch Files And Hide The Console Window \xe2\x80\xa2 Raymond.CC(少数不需要为此安装单独程序的解决方案之一!),它包含:

\n
CreateObject("Wscript.Shell").Run "C:\\Windows\\System32\\wsl.exe -u peter --exec /home/peter/bin/windows/startTerminal.sh",0,True\n
Run Code Online (Sandbox Code Playgroud)\n

startTerminal.sh包含:

\n
export DISPLAY=localhost:0.0\nxfce4-terminal --command=/bin/zsh\n
Run Code Online (Sandbox Code Playgroud)\n

尽管我在 ~/.zshrc 中设置了 DISPLAY 环境,但显然需要设置 DISPLAY。除非您运行登录 shell,否则 wsl.exe 显然不会执行此操作。

\n

一旦所有这些都正常工作,我可以将快捷方式拖到任务栏并单击那里。

\n

我数数3,三个文件合作来实现这个简单的目标?我可以在不安装外部程序的情况下将其限制为一两个吗?

\n

windows x11 windows-subsystem-for-linux

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

Windows 版 WSL2 和 Docker Desktop 的网络问题

长话短说

\n

在使用 WSL2 和 Windows 版 Docker Desktop 时,我似乎不断遇到网络问题。

\n

通常,我可以通过查找 WSL2 实例的 IP 地址并从容器内部引用该 IP 地址,从 Docker 容器内部访问从 WSL2 实例(WSL2 所说的“分发”)启动的端口。但今天由于某种原因这不起作用了。当遇到 WSL2+DockerDesktop 问题时,我已经习惯了重新启动,但现在我想最终了解到底出了什么问题。

\n

我非常确定,当我稍后重新启动时,一切都会好起来的。

\n

您知道如何调试这个东西吗?

\n

我还有一个公司 Forticlient VPN,可能会搞砸。但在这件事上我别无选择......;-(

\n

细节

\n

我找到了IP:

\n
WSL2:\xc2\xbb ip -br a\nlo               UNKNOWN        127.0.0.1/8 ::1/128 \nbond0            DOWN           \ndummy0           DOWN           \nsit0@NONE        DOWN           \neth0             UP             172.26.183.209/20 fe80::215:5dff:fef9:cc5c/64 \n
Run Code Online (Sandbox Code Playgroud)\n

所以 WSL2 机器的 IP 地址是172.26.183.209

\n

现在,我有一个 Web 服务器在 WSL2 进程中侦听端口 8080,可以通过http://172.26.183.209:8080访问它,正如 WSL2 所确认nmapcurl

\n …

networking docker windows-subsystem-for-linux docker-desktop wsl-2

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

如何回显“$@”以便结果是有效的 bash 并保持正确的引用?

我该怎么放wrapper.sh,如果我想这样的:

wrapper.sh "hello world" arg2 '' "this ' thing"
Run Code Online (Sandbox Code Playgroud)

输出:

Now please run:
other-command "hello world" arg2 '' "this ' thing"
Run Code Online (Sandbox Code Playgroud)

我意识到原始引用丢失并且输出可能会以不同的方式引用并且很好,只要other-command在命令被剪切'n'粘贴到外壳时获得正确的参数。

我知道"$@"哪个适用于调用其他程序,但不适用于回显有效的 bash,STDOUT据我所知。

这看起来很不错,但需要 Perl String::ShellQuote(我想避免):

$ perl -MString::ShellQuote -E 'say shell_quote @ARGV' other-command "hello world" arg2 '' "this ' thing"
other-command 'hello world' arg2 '' 'this '\'' thing'
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 请注意零长度 arg 是如何丢失的:

$ perl -E 'say join(" ", map { quotemeta $_ } @ARGV)' other-command …
Run Code Online (Sandbox Code Playgroud)

bash

11
推荐指数
2
解决办法
204
查看次数

RabbitMQ:针对消费者缓慢的大型队列限制快速生产者

我们目前正在使用RabbitMQ,其中一个持续超快的生产者与受限于有限资源的消费者(例如,慢速MySQL插入)配对.

我们不喜欢声明队列x-max-length,因为一旦达到限制,所有消息都将被删除或死信,我们不想丢失消息.

添加更多的消费者很容易,但他们都将受到一个共享资源的限制,因此无法使用.问题仍然存在:如何减缓生产者的速度?

当然,我们可以在Redis,memcached,MySQL或生产者读取的其他内容中添加一个流控制标志,如同对类似问题的回答指出的那样,或者更好的是,生产者可以定期测试队列长度并限制自己,但是这些看起来像是我的黑客.

我主要质疑我是否有一个根本的误解.我原以为这是一个常见的场景,所以我想知道:

限制生产者的最佳做法是什么?这是如何用RabbitMQ完成的?或者你以完全不同的方式做到这一点?

背景

假设生产者实际上知道如何通过正确的输入减慢自己的速度.例如,硬件传感器或硬件随机数生成器,可以根据需要生成任意数量的事件.

在我们特定的实际案例中,我们有一个用户可以用来添加消息的API.我们不想吞噬和丢弃消息,而是通过让我们的API在队列"满"时返回错误来应用反压,因此调用者/用户知道要退回,或者让API阻塞直到消费者赶上.我们不控制我们的用户,因此无论消费者的速度有多快,我都可以创建一个更快的生产者.

我希望有类似于TCP套接字的API,其中write()可以阻止,并且select()可以使用它来确定句柄是否可写.因此要么拥有RabbitMQ API块,要么在队列已满时返回错误.

throttling rabbitmq

9
推荐指数
1
解决办法
2581
查看次数

无法在Docker中使用sudo命令,显示"bash:sudo:command not found"

我使用以下命令"docker run -it b.gcr.io/tensorflow/tensorflow:latest-devel"安装了TensorFlow,我需要在Windows机器上设置TensorFlow服务.我按照" https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/setup.md "中的说明进行操作,并在安装TensorFlow服务依赖项时运行下面提到的sudo命令:

docker run -it b.gcr.io/tensorflow/tensorflow:latest-devel
Run Code Online (Sandbox Code Playgroud)

显示以下错误:

sudo apt-get update && sudo apt-get install -y \
     build-essential \
     curl \
     git \
     libfreetype6-dev \
     libpng12-dev \
     libzmq3-dev \
     pkg-config \
     python-dev \
     python-numpy \
     python-pip \
     software-properties-common \
     swig \
     zip \
     zlib1g-dev
Run Code Online (Sandbox Code Playgroud)

sudo docker tensorflow-serving

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