看看这个Scala代码:
def rec(n: Int) {
if (n > 1) {
val d = n / 2
rec(d)
// if (d > 1) // abort loop
rec(n/d)
}
}
Run Code Online (Sandbox Code Playgroud)
此代码将导致无限循环.由于尾递归优化,我没有得到StackOverflowError.
用jad反编译我得到了这个Java代码:
public void rec(int n)
{
int d;
for(; n > 1; n /= d)
{
int i = n;
d = i / 2;
rec(d);
}
}
Run Code Online (Sandbox Code Playgroud)
在循环的最后一行,该方法调用自身,因此我不理解尾调用位置.谁可以解释这个?
我很想知道这一点,因为这会使它们变得不那么有用.如果是这样,有没有办法让内存在主要GC上仅被"垃圾"弱引用?
新的Java程序员经常对编译错误消息感到困惑,例如:
"不兼容的类型:从double到int的可能有损转换"
对于这行代码:
int squareRoot = Math.sqrt(i);
Run Code Online (Sandbox Code Playgroud)
这个错误意味着什么,你如何解决它?
你好!
我是一名初级 Java 和 Android 开发人员,最近在处理我的应用程序的内存管理方面遇到了麻烦。我将把这篇文章分成几个部分,以使其更清晰易读。
这是一个由几个阶段(级别)组成的游戏。每个阶段都有一个玩家的起点和一个出口,引导玩家进入下一个阶段。每个阶段都有自己的一套障碍。目前,当玩家到达最后阶段(我目前只创建了 4 个)时,他/她会自动回到第一阶段(1 级)。
一个名为GameObject(扩展Android.View)的抽象类定义了玩家和游戏中存在的所有其他对象(障碍物等)的基本结构和行为。所有对象(本质上是视图)都绘制在我创建的自定义视图中(扩展 FrameLayout)。游戏逻辑和游戏循环由一个侧线程(gameThread)处理。这些阶段是通过从 xml 文件中检索元数据来创建的。
除了我的代码中所有可能的内存泄漏(我一直在努力寻找和解决所有这些问题)之外,还有一个与垃圾收集器发生相关的奇怪现象。我将使用图像,而不是用文字来描述它并冒着让您感到困惑的风险。孔子说:“千言万语”。好吧,在这种情况下,我刚刚让您免于阅读 150,000 个单词,因为我下面的 GIF 有 150 帧。
描述:第一张图片代表我的应用程序在第一次加载“stage 1”时的内存使用情况。第二个图像 (GIF) 首先表示第二次加载“阶段 1”时我的应用程序的内存使用时间线(这种情况发生,如前所述,当玩家击败最后一个阶段时),然后是四个强制启动的垃圾收集由我。
您可能已经注意到,这两种情况在内存使用方面存在巨大差异(几乎 50MB)。第一次加载“第一阶段”时,当游戏开始时,应用程序使用 85MB 内存。第二次加载同一个stage的时候,稍晚一点,内存使用量已经是130MB了!这可能是由于我的一些糟糕的编码,因此我不在这里。你有没有注意到,在我强行执行了 2 次(实际上是 4 次,但只有前 2 次重要)垃圾收集之后,内存使用情况又回到了它的“正常状态”(与第一次加载舞台时的内存使用情况相同)?这就是我所说的奇怪现象。
如果垃圾收集器应该从不再被引用的内存对象中删除(或者至少只有弱引用),为什么你在上面看到的“垃圾内存”只有在我强行调用GC和不是关于GC的正常执行?我的意思是,如果我手动启动的垃圾收集可以删除这个“thrash”,那么正常的GC执行也可以删除它。为什么没有发生?
我什至尝试在切换阶段时调用System.gc(),但是,即使垃圾收集发生这种情况,这种“颠簸”内存不会像我手动执行GC那样被删除。我是否遗漏了一些关于垃圾收集器如何工作或 Android 如何实现它的重要信息?
我花了几天时间搜索、研究和修改我的代码,但我找不到为什么会这样。StackOverflow 是我最后的选择。谢谢!
注意:我打算发布一些可能与我的应用程序源代码相关的部分,但由于问题已经太长了,我将在这里停止。如果您觉得需要检查某些代码,请告诉我,我将编辑此问题。
我已经读过: …
我能够在 VSCode 中格式化 Java 代码,但现在我看到“没有安装 'java' 文件的格式化程序。” 作为:
当然,语言支持是通过 redhat 语言支持插件提供的。这可以重新初始化吗?
看起来是其他人至少看到的问题,尽管错误消息可能略有不同。
版本信息:
Version: 1.41.1
Commit: 26076a4de974ead31f97692a0d32f90d735645c0
Date: 2019-12-18T15:04:31.999Z
Electron: 6.1.5
Chrome: 76.0.3809.146
Node.js: 12.4.0
V8: 7.6.303.31-electron.0
OS: Linux x64 4.18.0-25-generic snap
Run Code Online (Sandbox Code Playgroud) 我使用 JLink 工具创建了一个缩小的 JRE
jlink --add-modules java.base,jdk.crypto.ec --output jre
Run Code Online (Sandbox Code Playgroud)
我创建了一个非常基本的应用程序,它连接到 https://www.example.com
当我使用 JDK 运行此应用程序时,一切正常。当我使用缩小的 JRE 运行它时,我得到以下信息:
Exception in thread "main" javax.net.ssl.SSLException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:320)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:263)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:258)
at java.base/sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1313)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:408)
at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1515)
at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:527)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:334)
at URLTest.printResponseCode(URLTest.java:68)
at URLTest.main(URLTest.java:47)
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.base/sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:102)
at java.base/sun.security.validator.Validator.getInstance(Validator.java:181)
at java.base/sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:300)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:176)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:189) …Run Code Online (Sandbox Code Playgroud) 我发现这些命令可以使用 ADB 添加/删除代理:
#To Add Proxy
adb shell settings put global http_proxy 192.168.1.252:8080
#To Remove Proxy
adb shell settings put global http_proxy :0
Run Code Online (Sandbox Code Playgroud)
same是否还可以在命令 或中添加another代理username和password?
Atm 会弹出一个窗口,要求输入此信息,但我还想使用 ADB 添加它。
有没有办法将javadoc(由JavaDoc Ant Task生成的/ doc文件夹)嵌入到包含我的.class文件的库jar中?
我不想发送源代码,并希望用户能够在eclipse中看到javadoc注释,而无需通过Referenced Libraries选项卡并将JavaDoc zip添加到我的第三方库.
它可能会被问到某个地方,但我找不到它.
请告诉我两者之间的确切区别:
ArrayList list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
和
ArrayList<?> list = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚这两者之间的确切区别.
谢谢...
我尝试了解如何为 Kotlin\xe2\x80\x99s 挂起函数创建 @Around 方面(例如,测量在此函数中花费的时间,或自定义 @Transactional 方面):
\n\n@Timed("my-timer")\nsuspend fun test() {\n println("before")\n delay(50) // invokes ProceedingJoinPoint#proceed() before this line\n println("after")\n}\nRun Code Online (Sandbox Code Playgroud)\n\n由于该函数有一个挂起函数调用,因此 @Aroundspect\xe2\x80\x99sproceed 函数将在delay() 调用之前被调用。但显然我\xe2\x80\x99d喜欢测量在该函数中花费的全部时间。
\n\n解决问题的正确方法是什么?也许我可以以某种方式订阅该方法的最后一个延续,或者类似的东西?
\njava ×7
android ×3
adb ×1
aop ×1
aspectj ×1
collections ×1
corretto ×1
format ×1
generics ×1
ide ×1
java-11 ×1
javadoc ×1
jlink ×1
jvm ×1
kotlin ×1
memory-leaks ×1
performance ×1
pretty-print ×1
scala ×1