简而言之:我有一个完成运行的线程,但没有收集垃圾.
长:请参阅以下示例代码:
public void saveSomething() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// heavy memory access (~400 MB), finishes after ~10sec
}
});
thread.start();
}
Run Code Online (Sandbox Code Playgroud)
好的,所以这个线程在一段时间后开始并完成.在此期间使用了大量内存,这没关系.但我的问题是:
线程完成后,内存未设置为空闲
我不知道如何确保这一点.完成的线程,不再使用,应该收到垃圾收集,据我所知; 但这似乎不会发生在这里:(
从jvisualVM看这个截图:

1:我通过调用触发线程启动 saveSomething()
2:线程很久以前就已经完成了(我通过调试看到了它),我在jvisualvm中按下了"Perform GC"
正如你所看到的,在我强制GC之后,一切都按照我想要的方式工作.但这必须自动发生.我怎么能这样做,我做错了什么?
如果您需要更多信息,请询问.注意:似乎在一天(希望更短)后,内存恢复正常,GC可能只是"慢"或者不是经常定时?
当我按下快捷方式重命名变量(恰好是"主菜单">"重构">"重命名..."快捷方式)时,将选择整个单词.
是否有可能改变行为,以便简单地激活重构并且光标保持在原位(它已经存在,这很好)并且我可以直接添加或删除字符?
现在,如果我有一个变量"myVarible"并且我将光标放在"i"和"b"之间以添加"a",请按快捷键,然后键入"a",我的整个变量变为"a" ,因为快捷方式选择了整个单词.
在Eclipse中,这似乎已经是默认行为了,我更喜欢它.我如何在Intellij中更改此内容?
如果我点击Windows 8右下角的迷你日历(我猜可能是7),我想查看周数.我的系统在Win8.1 Pro下运行.
图像显示了我的意思:http: //s7.directupload.net/images/140904/c7a88vg9.jpg
可以看出,左侧的周数缺失. 我的问题很简单:可以通过配置来完成,如果可以,在哪里?好像不......
我只是简化了一些事情来重构代码的很多部分.现在我需要重构测试以使它们再次变绿,这并不难.
但是现在我有点挣扎,因为我看到我不再需要一些我的.when()声明,因为这些Mocks将不再被调用.问题是他们没有让我的测试变成红色,所以我只能通过仔细检查每个测试并将其与代码进行比较来识别它们,这有点令人烦恼并导致让它变成这样.
有没有可能使未使用.when()抛出错误等?就像从未发生的验证一样?这就像在setUp:Mockito.enableDebugMode()或其他任何事情那样做,也许有这样的可能性?..
最好
我知道你只能验证void方法.但我实际上问自己为什么.
我最近偶然发现了一个单元测试,我真的需要验证是否已经进行了某次调用.确切地说,它是"newFolder.mkdirs()".在我看来,这种方法的行为几乎是"无效的".但作为一个"功能",开发者为此函数提供了一个布尔返回类型,以查看操作是否成功.
很好,但是在我的测试中,我并不关心那些我扔掉我的嘲笑的地方.我只是想确保完成这个调用,就像我想要确保完成重要的void调用一样.
那么现在有可能这样做吗?我对此非常感兴趣,甚至无法想象这个小问题的解决方法:/有人有一个好的,简短的想法?
我完全错了:你可以验证一切.我放错了括号.
我有:
verify(newFolder.mkdirs());
Run Code Online (Sandbox Code Playgroud)
我需要:
verify(newFolder).mkdirs();
Run Code Online (Sandbox Code Playgroud)
傻我;)
我经常使用 Maven 发布插件。到目前为止,它工作得完美无缺,但有一件事让我烦恼。看看我刚刚触发的最新发布命令(mvn release:prepare):
我开发了当前版本 1.4.0-SNAPSHOT(构建了一些新功能等)。这是“正常”版本系列,我不会修补此版本,而是会带来一个新版本。我的 1.4.0 现已完成并发布。
之后我想开发 1.5.0 版本,即下一个版本,因为这是我新计划的版本。但是发布插件会针对补丁级别提出建议/自动完成(第三个数字,在我的例子中是 1.4.1-SNAPSHOT)。我想要它的次要级别(第二个数字,因此它建议 1.5.0-SNAPSHOT)。
如果需要修复,我通常会分支一个标签,修复错误,并发布补丁(我的情况为 1.4.1),然后将其合并回我的主干,为 1.5.0 版本提供相同的错误修复。我不确定这是否是“正确的方式”,或者是否存在真正正确的方式,但这就是我们在公司的工作方式。
所以我的问题是:有没有办法调整maven发布设置,以便它建议较小的更新而不是补丁更新?
截至今天,我需要手动输入我想要的版本(没什么大不了的,但我很好奇 Maven 是否能够在这里支持我)。
PS:我发现了一些SO问题,但他们的答案不太适合我。而且它们已经有几年历史了,也许现在有适当的解决方案,不需要一些常规脚本或类似的......:
是否可以使用 DOSKEY 调用别名?简单的例子..我想做这样的事情:
DOSKEY a=someCommand
DOSKEY b=someOtherCommand
DOSKEY c=andAThirdCommand
:: How to do this? -> DOSKEY all=a+b+c
Run Code Online (Sandbox Code Playgroud)
我已经知道我可以通过写这个来做到这一点:
DOSKEY all=someCommand ^& someOtherCommand ^& andAThirdCommand
Run Code Online (Sandbox Code Playgroud)
但在重用东西的意义上,我想重用上面定义的别名。有可能如我所愿吗?
谢谢!
PS:在这里看到了这个,但这不是一个令人满意的答案。不过好像行不通。:(
每次我遇到这个问题时,我都会问自己同样的问题:是否有一种更简单且不那么烦人的方法可以将字符串从末尾剪下 X 个字符。
假设我得到了"Helly there bla bla"- 为什么 - 我需要切断最后 2 个字符,导致"Helly there bla b". 我现在会做以下事情:
String result = text.substring(0, text.length() - 2);
Run Code Online (Sandbox Code Playgroud)
我宁愿做这样的事情:
String result = text.cutOffEnd(2);
Run Code Online (Sandbox Code Playgroud)
我知道那里有很多 String 库,但不知道其中很多,而且我从未见过类似的东西,所以我希望你们中的某个人可能更了解 :)
编辑:
问:为什么不构建自己的 util 方法/类?
A:我不想使用自己的 util 方法。我不会为“空或空”或其他琐碎的事情编写 util 方法。我认为必须已经有一些可用的东西,因为我会说很多人在他们的一生中经常需要这种功能。另外:我在许多不同的项目中工作,只是想依赖一个简单的库调用,比如“Strings.nullToEmpty(str)”等。我只是不会自己构建类似的东西,尽管它很简单。
问:为什么text.substring(0, text.length() - 2);不够好?
A:和我想要的功能比起来就很笨重了。另外,请想一想:如果您确定字符串,它会变得更加不方便:
String result = otherClass.getComplicatedCalculatedText(par1, par2).substring(0,
otherClass.getComplicatedCalculatedText(par1, par2).length() - 2);
Run Code Online (Sandbox Code Playgroud)
显然我需要使用一个局部变量,这在这一点上是不必要的......因为它可能只是:
String result = otherClass.getComplicatedCalculatedText(par1, par2).cutOffEnd(2);
Run Code Online (Sandbox Code Playgroud) 当我点击java编辑器中的某个单词时,它会将它与所有出现的内容一起标记,这很精彩.正如您在我的屏幕截图中看到的那样,我将其定制为绿色,此绿色也将显示在右侧的滑动条附近.
我不喜欢的东西:左边是红色标记的箭头,旁边是行号.他们"向我"展示了它的发生情况,但老实说它们并没有给我任何利润,因为我明亮的绿色标记比我用这些箭头更快地识别出来.另外,这是令人讨厌的部分,这些箭头会阻止我的调试点的可见性,这些调查点将放在这样的箭头下面.您是否看到第二个箭头实际上隐藏了调试点?我也不...
那么:有没有办法通过eclipse首选项禁用这些箭头?
我很好奇,如果它在某种程度上可能,并不总是直接在一个流中.想象一下这个示例代码:
List<Employee> employees = [...];
employees.stream()
.map(Employee::getCity)
.map(City::getCountry)
.map(countryService::determineHazardLevel)
.filter(level -> level > 5) // integer
// this line not possible anymore as I drifted away from my employees ...
.forEach(employee -> employee.setPriority(HIGH))
Run Code Online (Sandbox Code Playgroud)
我迭代一份员工名单,并希望他们设置一个优先权标志,如果他们住在一个危险等级为5或更高的国家的城市.
我喜欢像上面那样走上小道,但找不到办法去做.我"不被允许"沿着城市,国家,危险等级进一步流动,最终我需要我开始的员工对象,在他身上设置旗帜.
我只知道Java,所以我甚至不知道在其他可能更实用的编程语言中是否真的可以实现.
我可以使用以下代码作为解决方法,但它会更清洁:
List<Employee> employees = [...];
employees.stream()
.forEach(employee -> {
Optional<Integer> lvl = Optional.of(employee)
.map(Employee::getCity)
.map(City::getCountry)
.map(countryService::determineHazardLevel)
.filter(level -> level > 5); // integer
lvl.ifPresent(employee.setPriority(HIGH));
}
Run Code Online (Sandbox Code Playgroud)
也许我只是把它弄得一塌糊涂,需要把它看得完全不同......
PS:我刚刚在记事本中写了这些东西,不确定我是否犯了一些错误,但我希望这个想法能够实现.简单地说,我看起来像这样:普通的流是像这样的命令A, B, C, D.但我想做的是A, B, B1, B2, B3, C, D.但是沿着B路走下去后,我无法回到我的"主流".