成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從編譯角度看Kotlin內存優化

移動開發
今天我們來聊一聊由JetBrains開發的一種用于現代多平臺應用的靜態編程語言——Kotlin。

作者|閆永俊,單位:中國移動智慧家庭運營中心

?Labs 導讀

今天我們來聊一聊由JetBrains開發的一種用于現代多平臺應用的靜態編程語言——Kotlin。

Kotlin可以被編譯為Java字節碼,也可以被編譯成JavaScript,方便在沒有JVM的設備上運行。除此之外,Kotlin還可以被編譯成二進制代碼直接運行在機器上。

在Google I/O2017中,Google宣布在Android上為Kotlin提供一等支持。目前,Kotlin已經成為Android應用開發的首選語言。

Kotlin相對于Java來說,有很多優點,如空安全、更加易用的Lambda表達式、支持擴展、眾多的語法糖等。但是較少有人提及Kotlin的從編譯角度上對Java做的內存優化,這里我們通過反編譯的方法略窺一二。

Part 01  Java內部類持有外部類的引用

Java中有一個普遍的認知,Java中內部類會持有外部類的引用,使用不當就容易造成內存泄漏。參看下面例子。

我們編寫如下代碼來驗證。

我們先創建一個父類,用于觀察子類是否會調用finalize方法。?

public class BaseActivity extends AppCompatActivity {
@Override
protected void finalize() throws Throwable {
Log.e("yanlog", "BaseActivity finalize:" + this);
super.finalize();
}
}

我們創建一個子類,子類中創建一個不會終止的Thread。?

public class TmpJavaActivity extends BaseActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}

通過測試會發現,BaseActivity的finalize方法始終無法被調用,即外部類TmpJavaActivity始終無法被回收。我們使用反編譯工具jadx來觀察下反編譯后的smail代碼。


通過上述反編譯后的smail代碼可以看到,Java會將外部類對象作為參數傳遞給內部類對象,一旦內部類無法釋放,會造成外部類一直無法被釋放。從而造成內存泄漏。

Part 02  kotlin內部類非必要不持有外部類引用

上述同樣的代碼,我們使用Kotlin寫一遍,如下所示:?

class TmpActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_tmp)
val thread = Thread {
while (true) {
Thread.sleep(1000)
}
}
thread.start()
}
}

我們通過觀察日志發現,外部類TmpActivity可以被正?;厥铡O旅嬷苯涌聪聅mail源碼。

圖片

從上述smail源碼可以看到,與Java語言不同,Kotlin中的內部類會被編譯成一個普通的類。因為內部類實際運行不依賴外部類,所以編譯后,不會將外部類作為內部類構造方法的參數傳遞給內部類,即該內部類不會持有外部類的應用,所以不會造成內存泄漏。

但是如果內部類實際需要持有外部類引用呢?我們來觀察如下代碼?

class TmpActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_tmp)
val thread = Thread {
while (true) {
Log.e("yanlog","thread"+this@TmpActivity)
java.lang.Thread.sleep(1000)
}
}
thread.start()
}
}

觀察反編譯后的smail源碼如下

圖片

通過上述源碼可以看到,在構造內部類的對象時,會將外部類的引用傳遞給內部類,從而造成內存泄漏。

通過上述兩個例子可以看到。Kotlin語言中,內部類非必要不會持有外部類的引用,較Java而言,減少了內存泄漏的場景。?

責任編輯:未麗燕 來源: 移動Labs
相關推薦

2024-12-10 00:00:10

MySQLJOIN算法

2020-02-04 09:53:05

數據安全數據泄漏信息安全

2019-04-28 16:10:50

設計Redux前端

2015-05-05 11:04:31

CoreOS自動化運維

2013-09-16 16:01:23

Android開發代碼

2019-11-27 10:11:22

勒索病毒網絡安全

2020-11-19 10:09:55

漏洞逆向角度證書覆蓋

2017-09-06 15:54:14

2012-04-29 10:37:28

APP

2010-07-16 09:00:20

開源RedOffice紅旗2000

2021-01-06 09:47:51

內存Go語言

2022-02-17 08:16:23

MMU內存管理

2018-07-26 07:21:12

2009-07-08 19:44:56

2021-10-14 08:58:48

Java冒泡排序

2014-07-14 15:19:43

IT信息工程運維

2013-12-11 21:48:38

OpenStack

2017-11-20 16:17:50

智慧城市

2024-01-19 09:21:35

攜程開源

2021-04-28 22:42:36

SaaS軟件技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.亚洲成人网 | 欧美不卡一区 | 欧美综合久久久 | 午夜一区| 精品免费看 | 伊人久久综合 | 影音先锋欧美资源 | 亚洲欧洲小视频 | 99精品久久 | 在线免费观看毛片 | 久久久久无码国产精品一区 | 在线看国产 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 久久国产精品一区二区三区 | 亚洲成人免费网址 | 久久极品| 全免费a级毛片免费看视频免费下 | 97精品超碰一区二区三区 | 欧美 日韩 在线播放 | 久热国产精品视频 | 亚洲免费在线观看视频 | av黄色在线观看 | 天天干成人网 | 日本不卡免费新一二三区 | 亚洲精品电影在线观看 | 亚洲欧美一区二区三区情侣bbw | 成人影院在线 | 国产视频福利一区 | 国产精品视频一二三区 | 日韩免费 | 日日摸夜夜添夜夜添精品视频 | 日本大香伊一区二区三区 | 婷婷福利| 国产精品一区一区三区 | av一级在线观看 | 艹逼网 | 中文字幕国产 | 国产精品久久久99 | 国产精品久久久久久久粉嫩 | 亚洲欧美国产一区二区三区 | 中文字幕第一页在线 |