我正在开发一个Android应用程序,它提供了一个简单的HTTP/HTTPS服务器.如果配置了HTTPS服务,则在每个连接上都会观察到增加的本机内存使用量,这最终会导致应用程序崩溃(oom),而使用HTTP配置会使本机内存使用量保持相对恒定.应用程序的Java VM在两种配置中保持相对稳定.
该应用程序提供一个HTML页面,其中包含一个定期轮询的javascript(每秒一次json轮询),因此使用HTTPS配置调用应用程序页面并保持页面打开几个小时将导致提到的内存不足,因为增加本机内存使用量.我测试了许多在互联网上找到的SSLServerSocket和SSLContext配置,但没有运气.
我在各种Android设备和各种Android版本上观察到相同的问题,从2.2到4.3开始.
处理客户端请求的代码对于HTTP/HTTPS配置都是相同的.两种配置的唯一区别是服务器套接字的设置.而在HTTP服务器套接字的情况下,一行类似于这个"ServerSocket serversocket = new ServerSocket(myport);" 做这项工作,在HTTPS服务器设置的情况下,采用设置SSLContext的常规步骤 - 即设置密钥管理器并初始化SSLContext.现在,我使用默认的TrustManager.
有人知道使用OpenSSL的Android默认TLS提供程序中的任何内存泄漏问题吗?我应该考虑一些特殊的东西来避免本机内存中的泄漏吗?任何提示都受到高度赞赏.
更新:我还尝试了两个TLS提供程序:OpenSSL和JSSE,方法是在SSLContext.getInstance("TLS",providerName)中显式提供提供程序名称.但这并没有改变任何事情.
这是一个代码块,用于演示该问题.只需创建一个示例应用程序,将其放入主活动的onCreate底部,然后构建并运行应用程序.确保您的Wifi已开启并按以下地址调用HTML页面:
https://android device IP:9090
Run Code Online (Sandbox Code Playgroud)
然后观看adb日志,过一会儿你会看到本机内存开始增加.
new Thread(new Runnable() {
public void run() {
final int PORT = 9090;
SSLContext sslContext = SSLContext.getInstance( "TLS" ); // JSSE and OpenSSL providers behave the same way
KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );
KeyStore ks = KeyStore.getInstance( KeyStore.getDefaultType() );
char[] password = KEYSTORE_PW.toCharArray();
// we assume the keystore is in the app assets
InputStream sslKeyStore = getApplicationContext().getResources().openRawResource( R.raw.keystore …Run Code Online (Sandbox Code Playgroud)