最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

rust、go、java、python、nodejs各語言內存對比詳解

 更新時間:2026年01月08日 09:59:09   作者:碼刀攻城  
這篇文章主要介紹了rust、go、java、python、nodejs各語言內存對比的相關資料,Rust在內存效率上表現(xiàn)出色,而Go和Python在有GC的語言中表現(xiàn)也較為優(yōu)秀,文中介紹的非常詳細,需要的朋友可以參考下

前言

在高負載業(yè)務場景中,比如Web服務的高頻請求處理、Kafka消息的持續(xù)消費、流式計算的實時數(shù)據(jù)處理,我們常常面臨這樣的挑戰(zhàn):大量短命對象被頻繁創(chuàng)建又銷毀,同時少量長命對象長期占用內存。這種場景下,語言的內存分配與垃圾回收(GC)能力直接決定了系統(tǒng)的穩(wěn)定性和性能上限。

為了探究不同語言在這類場景下的真實表現(xiàn),我們基于GitHub上的5-language-memory-comparison項目(測試地址:https://github.com/code-cheers/5-language-memory-comparison),用Go、Java、Node.js、Python、Rust五種主流語言實現(xiàn)了相同的二叉樹基準測試。測試結果令人驚訝:相同算法邏輯下,內存占用差距竟達數(shù)百倍。本文將深入解析測試場景、核心代碼實現(xiàn),揭秘各語言的內存管理哲學,并給出實際項目中的選型與優(yōu)化建議。

一、測試場景:為什么選擇二叉樹基準?

本次測試采用的binary-trees基準,并非單純的算法驗證,而是精準模擬了真實高負載業(yè)務的內存壓力模型,其核心邏輯如下:

  1. 構造一棵"短命樹"(stretch tree),創(chuàng)建后立即銷毀,模擬臨時對象的創(chuàng)建與回收;
  2. 保留一棵"長命樹"(longLivedTree),模擬長期駐留內存的核心對象;
  3. minDepth=4到指定的maxDepth(步長為2),針對每個深度批量構造2^(maxDepth-depth+minDepth)棵滿二叉樹并完整遍歷;
  4. 輸出每輪遍歷的itemCheck結果,確保各語言實現(xiàn)的邏輯一致性(避免因算法差異影響內存測試結果)。

這種"短命對象高頻流轉+長命對象持續(xù)占用"的模式,與我們日常開發(fā)中遇到的絕大多數(shù)高負載場景高度契合。測試的核心指標是峰值RSS(Resident Set Size),即進程實際占用的物理內存大小,能直觀反映語言的內存分配效率和GC能力。

測試環(huán)境要求

  • Go 1.25+(依賴Go modules)
  • Java 21+(需支持最新JVM特性)
  • Node.js 18+(依賴V8引擎的GC優(yōu)化)
  • Python 3.9+(需CPython解釋器)
  • Rust 1.74+(依賴Cargo構建工具)

二、測試結果:5種語言內存占用大比拼

我們分別以maxDepth=10maxDepth=16為參數(shù)運行測試,得到如下峰值內存占用數(shù)據(jù)(單位:MB):

語言樹深度=10樹深度=16內存增長倍數(shù)
Rust1.428.175.75
Go5.6617.733.13
Python7.5319.662.61
Node.js42.6485.802.01
Java44.42343.587.73

從結果可以清晰看到:

  • Rust展現(xiàn)出極致的內存效率,即使深度翻倍,內存增長也最為平緩;
  • Go和Python在有GC的語言中表現(xiàn)優(yōu)秀,內存占用適中且增長可控;
  • Node.js內存占用明顯偏高,但增長相對平穩(wěn);
  • Java在深度提升到16后,內存占用飆升至343.58MB,是Rust的42倍,差距極為顯著。

三、核心代碼解析:相同邏輯,不同實現(xiàn)

為了確保測試的公平性,五種語言的實現(xiàn)嚴格遵循同一邏輯。下面我們逐一解析各語言的核心代碼,重點關注與內存管理相關的實現(xiàn)細節(jié)。

1. Rust:無GC的極致內存控制

Rust的內存優(yōu)勢源于其獨特的所有權機制——編譯期即可確定對象的生命周期,無需運行時GC掃描。

// rust/src/main.rs
#[derive(Debug)]
struct Node {
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

impl Node {
    // 創(chuàng)建新節(jié)點
    fn new() -> Self {
        Node { left: None, right: None }
    }

    // 構建滿二叉樹
    fn build(depth: usize) -> Option<Box<Node>> {
        if depth == 0 {
            return None;
        }
        Some(Box::new(Node {
            left: Self::build(depth - 1),
            right: Self::build(depth - 1),
        }))
    }

    // 遍歷樹并計算校驗值(確保邏輯正確)
    fn check(&self) -> i32 {
        let mut res = 1;
        if let Some(left) = &self.left {
            res += left.check();
        }
        if let Some(right) = &self.right {
            res += right.check();
        }
        res
    }
}

fn main() {
    let max_depth = std::env::args().nth(1).unwrap().parse::<usize>().unwrap_or(5);
    let min_depth = 4;

    // 1. 構建并銷毀短命樹
    if max_depth >= min_depth + 2 {
        let stretch_tree = Node::build(max_depth + 1);
        println!("Stretch tree check: {}", stretch_tree.as_ref().unwrap().check());
    }

    // 2. 保留長命樹
    let long_lived_tree = Node::build(max_depth);

    // 3. 批量構建并遍歷不同深度的樹
    for depth in (min_depth..=max_depth).step_by(2) {
        let iterations = 1 << (max_depth - depth + min_depth);
        let mut check = 0;

        for _ in 0..iterations {
            let a = Node::build(depth);
            check += a.as_ref().unwrap().check();
        }

        println!("{:>4} trees of depth {:>2} check: {:>4}", iterations, depth, check);
    }

    // 驗證長命樹未被銷毀
    println!("Long lived tree check: {}", long_lived_tree.as_ref().unwrap().check());
}

內存關鍵細節(jié)

  • 使用Box<Node>實現(xiàn)堆上分配,Box是輕量級智能指針,無額外內存開銷;
  • 所有權機制確保節(jié)點在超出作用域后立即釋放內存,無需GC介入;
  • 編譯期靜態(tài)檢查生命周期,避免內存泄漏和懸空指針。

2. Go:并發(fā)GC的平衡之道

Go的內存效率源于其高效的并發(fā)GC和輕量級的運行時設計,在內存占用和開發(fā)效率之間取得了極佳平衡。

// go/main.go
package main

import (
	"fmt"
	"os"
	"strconv"
)

type Node struct {
	left  *Node
	right *Node
}

// 構建滿二叉樹
func NewNode(depth int) *Node {
	if depth == 0 {
		return nil
	}
	return &Node{
		left:  NewNode(depth - 1),
		right: NewNode(depth - 1),
	}
}

// 遍歷校驗
func (n *Node) Check() int {
	if n == nil {
		return 0
	}
	return 1 + n.left.Check() + n.right.Check()
}

func main() {
	maxDepth := 5
	if len(os.Args) > 1 {
		if d, err := strconv.Atoi(os.Args[1]); err == nil {
			maxDepth = d
		}
	}
	minDepth := 4

	// 1. 短命樹
	if maxDepth >= minDepth+2 {
		stretchTree := NewNode(maxDepth + 1)
		fmt.Printf("Stretch tree check: %d\n", stretchTree.Check())
	}

	// 2. 長命樹
	longLivedTree := NewNode(maxDepth)

	// 3. 批量構建遍歷
	for depth := minDepth; depth <= maxDepth; depth += 2 {
		iterations := 1 << (maxDepth - depth + minDepth)
		check := 0

		for i := 0; i < iterations; i++ {
			a := NewNode(depth)
			check += a.Check()
		}

		fmt.Printf("%4d trees of depth %2d check: %4d\n", iterations, depth, check)
	}

	// 驗證長命樹
	fmt.Printf("Long lived tree check: %d\n", longLivedTree.Check())
}

內存關鍵細節(jié)

  • 使用指針*Node直接指向堆上對象,結構體無額外元數(shù)據(jù)開銷;
  • 并發(fā)標記-清除GC,邊運行邊回收內存,停頓時間極短;
  • 基于MPG(M內核線程、P調度單元、G協(xié)程)模型,提前分配必要的管理結構,避免運行時頻繁分配。

3. Python:靈活背后的內存開銷

Python的內存占用偏高,核心原因是其動態(tài)類型系統(tǒng)和對象模型的設計特性。

# python/main.py
import sys

class Node:
    __slots__ = ('left', 'right')  # 優(yōu)化:減少對象元數(shù)據(jù)開銷
    def __init__(self):
        self.left = None
        self.right = None

def build_tree(depth):
    if depth == 0:
        return None
    node = Node()
    node.left = build_tree(depth - 1)
    node.right = build_tree(depth - 1)
    return node

def check_tree(node):
    if node is None:
        return 0
    return 1 + check_tree(node.left) + check_tree(node.right)

def main():
    max_depth = 5
    if len(sys.argv) > 1:
        max_depth = int(sys.argv[1])
    min_depth = 4

    # 1. 短命樹
    if max_depth >= min_depth + 2:
        stretch_tree = build_tree(max_depth + 1)
        print(f"Stretch tree check: {check_tree(stretch_tree)}")

    # 2. 長命樹
    long_lived_tree = build_tree(max_depth)

    # 3. 批量構建遍歷
    for depth in range(min_depth, max_depth + 1, 2):
        iterations = 1 << (max_depth - depth + min_depth)
        check = 0

        for _ in range(iterations):
            a = build_tree(depth)
            check += check_tree(a)

        print(f"{iterations:4d} trees of depth {depth:2d} check: {check:4d}")

    # 驗證長命樹
    print(f"Long lived tree check: {check_tree(long_lived_tree)}")

if __name__ == "__main__":
    main()

內存關鍵細節(jié)

  • 即使使用__slots__優(yōu)化,Python對象仍需存儲類型指針、引用計數(shù)等元數(shù)據(jù);
  • CPython的引用計數(shù)機制需要額外內存維護對象引用狀態(tài);
  • 小對象頻繁創(chuàng)建易導致內存碎片,無法被高效回收。

4. Node.js:V8引擎的GC代價

Node.js基于V8引擎,其內存占用主要來自V8的GC機制和對象模型。

// nodejs/main.js
class Node {
  constructor() {
    this.left = null;
    this.right = null;
  }
}

function buildTree(depth) {
  if (depth === 0) {
    return null;
  }
  const node = new Node();
  node.left = buildTree(depth - 1);
  node.right = buildTree(depth - 1);
  return node;
}

function checkTree(node) {
  if (node === null) {
    return 0;
  }
  return 1 + checkTree(node.left) + checkTree(node.right);
}

function main() {
  let maxDepth = 5;
  if (process.argv.length > 2) {
    maxDepth = parseInt(process.argv[2], 10);
  }
  const minDepth = 4;

  // 1. 短命樹
  if (maxDepth >= minDepth + 2) {
    const stretchTree = buildTree(maxDepth + 1);
    console.log(`Stretch tree check: ${checkTree(stretchTree)}`);
  }

  // 2. 長命樹
  const longLivedTree = buildTree(maxDepth);

  // 3. 批量構建遍歷
  for (let depth = minDepth; depth <= maxDepth; depth += 2) {
    const iterations = 1 << (maxDepth - depth + minDepth);
    let check = 0;

    for (let i = 0; i < iterations; i++) {
      const a = buildTree(depth);
      check += checkTree(a);
    }

    console.log(`${iterations.toString().padStart(4)} trees of depth ${depth.toString().padStart(2)} check: ${check.toString().padStart(4)}`);
  }

  // 驗證長命樹
  console.log(`Long lived tree check: ${checkTree(longLivedTree)}`);
}

main();

內存關鍵細節(jié)

  • V8的GC分為標記、清理、整理三個階段,每個階段都需要臨時分配內存存儲元數(shù)據(jù);
  • JavaScript對象默認繼承自Object.prototype,包含額外的屬性字典開銷;
  • 新生代和老生代的內存分區(qū)機制,導致部分臨時內存無法被即時回收。

5. Java:JVM的"預分配"哲學

Java的內存占用偏高,核心是JVM的設計理念——為了性能提前預留內存。

// java/BinaryTrees.java
public class BinaryTrees {
    static class Node {
        Node left;
        Node right;
    }

    // 構建滿二叉樹
    static Node buildTree(int depth) {
        if (depth == 0) {
            return null;
        }
        Node node = new Node();
        node.left = buildTree(depth - 1);
        node.right = buildTree(depth - 1);
        return node;
    }

    // 遍歷校驗
    static int checkTree(Node node) {
        if (node == null) {
            return 0;
        }
        return 1 + checkTree(node.left) + checkTree(node.right);
    }

    public static void main(String[] args) {
        int maxDepth = 5;
        if (args.length > 0) {
            maxDepth = Integer.parseInt(args[0]);
        }
        int minDepth = 4;

        // 1. 短命樹
        if (maxDepth >= minDepth + 2) {
            Node stretchTree = buildTree(maxDepth + 1);
            System.out.printf("Stretch tree check: %d%n", checkTree(stretchTree));
        }

        // 2. 長命樹
        Node longLivedTree = buildTree(maxDepth);

        // 3. 批量構建遍歷
        for (int depth = minDepth; depth <= maxDepth; depth += 2) {
            int iterations = 1 << (maxDepth - depth + minDepth);
            int check = 0;

            for (int i = 0; i < iterations; i++) {
                Node a = buildTree(depth);
                check += checkTree(a);
            }

            System.out.printf("%4d trees of depth %2d check: %4d%n", iterations, depth, check);
        }

        // 驗證長命樹
        System.out.printf("Long lived tree check: %d%n", checkTree(longLivedTree));
    }
}

內存關鍵細節(jié)

  • JVM啟動時會根據(jù)默認或配置的參數(shù)(-Xms/-Xmx)預分配堆空間,即使應用未使用,也會占用相應內存;
  • 類加載、JIT編譯、線程管理等功能需要額外內存開銷;
  • 對象包含對象頭(存儲類元數(shù)據(jù)、鎖信息等),增加了單個對象的內存占用。

四、深度解析:各語言的內存管理哲學

測試結果的差異,本質上是各語言內存管理哲學的體現(xiàn)——不同的設計取舍,決定了它們在內存效率上的表現(xiàn)。

1. Rust:編譯期內存管理的極致

Rust的核心思想是"所有權+借用檢查",完全拋棄了運行時GC。編譯器在編譯階段就會分析每個變量的生命周期,確定對象何時創(chuàng)建、何時銷毀,并插入對應的內存釋放指令。這種設計帶來兩個核心優(yōu)勢:

  • 零GC開銷:無需后臺線程掃描內存,也沒有GC停頓;
  • 零內存浪費:對象占用的內存恰好滿足需求,無額外管理開銷。

適合場景:對內存敏感、追求極致性能的場景,如嵌入式系統(tǒng)、高性能服務器、區(qū)塊鏈節(jié)點等。

2. Go:并發(fā)GC的實用主義

Go的設計目標是"讓開發(fā)者用簡單的代碼寫出高性能的并發(fā)程序",其內存管理采用了"并發(fā)標記-清除GC":

  • 并發(fā)執(zhí)行:GC與業(yè)務代碼同時運行,停頓時間控制在毫秒級;
  • 分代回收:對新生代對象采用復制算法,老生代采用標記-清除-整理算法;
  • 輕量運行時:僅提供必要的內存管理功能,不額外占用過多資源。

適合場景:高并發(fā)后端服務、云原生應用、中間件等,兼顧開發(fā)效率和性能。

3. Python:動態(tài)類型的靈活代價

Python的內存管理是"引用計數(shù)+分代GC"的結合:

  • 引用計數(shù):主要的內存回收機制,對象引用數(shù)為0時立即釋放;
  • 分代GC:處理循環(huán)引用等引用計數(shù)無法解決的問題;
  • 動態(tài)類型:對象需要存儲大量元數(shù)據(jù),導致單個對象內存開銷大。

適合場景:數(shù)據(jù)分析、腳本開發(fā)、Web后端(低并發(fā))等,優(yōu)先追求開發(fā)效率。

4. Node.js:V8引擎的前端基因

Node.js的內存管理完全依賴V8引擎,其設計初衷是為瀏覽器前端服務:

  • 新生代GC:采用Scavenge算法,快速回收短期對象;
  • 老生代GC:采用Mark-Sweep-Compact算法,回收長期對象;
  • 內存限制:默認堆內存上限較低(64位系統(tǒng)約1.4GB),避免瀏覽器占用過多系統(tǒng)資源。

適合場景:前端工程化、API服務、實時通訊應用等,適合I/O密集型場景。

5. Java:企業(yè)級應用的穩(wěn)定性優(yōu)先

Java的JVM本質上是一個"小型操作系統(tǒng)",內存管理的核心是"穩(wěn)定性+性能":

  • 預分配堆空間:提前預留足夠的內存,避免運行時頻繁擴容;
  • 多種GC算法:支持Serial GC、Parallel GC、G1 GC、ZGC等,可根據(jù)場景選擇;
  • 完善的內存模型:區(qū)分堆、棧、方法區(qū)等,便于內存管理和調試。

適合場景:企業(yè)級應用、電商系統(tǒng)、金融服務等,優(yōu)先追求穩(wěn)定性和可擴展性。

五、拓展:實際項目中的語言選型與內存優(yōu)化

1. 語言選型建議

業(yè)務場景推薦語言選型理由
高并發(fā)、低延遲服務Go/Rust內存效率高,GC停頓短(Rust無GC)
內存敏感型應用(嵌入式)Rust極致內存控制,無運行時依賴
企業(yè)級復雜應用Java生態(tài)完善,穩(wěn)定性強,可擴展性好
數(shù)據(jù)分析、快速開發(fā)Python語法簡潔,第三方庫豐富
前端工程化、I/O密集服務Node.js前后端技術統(tǒng)一,異步I/O性能優(yōu)秀

2. 各語言內存優(yōu)化技巧

Rust優(yōu)化

  • 避免不必要的Box分配,優(yōu)先使用棧上對象;
  • 合理使用Vec等集合類型,減少內存碎片;
  • 利用Rc/Arc管理共享對象,避免重復創(chuàng)建。

Go優(yōu)化

  • 合理設置GOGC環(huán)境變量(默認100),調整GC觸發(fā)時機;
  • 復用對象池(如sync.Pool),減少臨時對象創(chuàng)建;
  • 避免大對象頻繁分配,優(yōu)先使用值類型而非指針。

Python優(yōu)化

  • 使用__slots__減少類實例的元數(shù)據(jù)開銷;
  • 利用array模塊存儲同質數(shù)據(jù),替代列表;
  • 使用內存池(如pymalloc)優(yōu)化小對象分配。

Node.js優(yōu)化

  • 避免創(chuàng)建大量閉包,減少作用域鏈開銷;
  • 使用Buffer處理二進制數(shù)據(jù),替代字符串;
  • 合理設置--max-old-space-size,調整堆內存上限。

Java優(yōu)化

  • 根據(jù)業(yè)務場景選擇合適的GC算法(如ZGC適合低延遲場景);
  • 調整-Xms-Xmx參數(shù),避免堆空間頻繁擴容;
  • 使用對象池復用頻繁創(chuàng)建的對象(如數(shù)據(jù)庫連接池)。

六、總結

內存管理是編程語言設計的核心議題之一,沒有絕對"最好"的語言,只有最適合場景的選擇。Rust用編譯期內存管理實現(xiàn)了極致效率,Go用并發(fā)GC平衡了性能與開發(fā)效率,Java用強大的JVM保障了企業(yè)級應用的穩(wěn)定性,Python和Node.js則在開發(fā)效率和生態(tài)豐富度上占據(jù)優(yōu)勢。

在實際項目中,我們不應盲目追求"內存占用最低",而應根據(jù)業(yè)務場景(如是否高并發(fā)、是否內存敏感、開發(fā)周期要求)綜合考量。同時,掌握各語言的內存管理原理和優(yōu)化技巧,能幫助我們寫出更高效、更穩(wěn)定的代碼。

到此這篇關于rust、go、java、python、nodejs各語言內存對比的文章就介紹到這了,更多相關rust、go、java、python、nodejs內存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • GoLang之go build命令的具體使用

    GoLang之go build命令的具體使用

    本文主要介紹了GoLang之go build命令的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • go語言beego框架jwt身份認證實現(xiàn)示例

    go語言beego框架jwt身份認證實現(xiàn)示例

    這篇文章主要為大家介紹了go語言beego框架jwt身份認證實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang數(shù)組的傳遞詳解

    Golang數(shù)組的傳遞詳解

    今天小編就為大家分享一篇關于Golang數(shù)組的傳遞詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • grom設置全局日志實現(xiàn)執(zhí)行并打印sql語句

    grom設置全局日志實現(xiàn)執(zhí)行并打印sql語句

    本文主要介紹了grom設置全局日志實現(xiàn)執(zhí)行并打印sql語句,包括設置日志級別、實現(xiàn)自定義Logger接口以及如何使用GORM的默認logger,通過這些方法,可以更好地控制和記錄數(shù)據(jù)庫操作的日志信息
    2025-03-03
  • Go語言中服務網(wǎng)格Istio實戰(zhàn)

    Go語言中服務網(wǎng)格Istio實戰(zhàn)

    本文主要介紹了Go語言中服務網(wǎng)格Istio實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • 手把手帶你走進Go語言之條件表達式

    手把手帶你走進Go語言之條件表達式

    條件表達式由條件運算符構成,并常用條件表達式構成一個賦值語句,本文給大家介紹了在Go語言中條件表達式的具體用法,講述的非常詳細,對大家的學習或工作具有一定的參考借鑒價值
    2021-09-09
  • Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List

    Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List

    這篇文章主要介紹了Go語言實現(xiàn)互斥鎖、隨機數(shù)、time、List的相關資料,需要的朋友可以參考下
    2018-10-10
  • golang新手們容易犯的3個錯誤總結

    golang新手們容易犯的3個錯誤總結

    這篇文章主要給大家介紹了關于golang新手們容易犯的3個錯誤,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • Golang合并yaml文件過程逐步講解

    Golang合并yaml文件過程逐步講解

    之前一直從事java開發(fā),習慣了使用yaml文件的格式,尤其是清晰的層次結構、注釋,下面這篇文章主要給大家介紹了關于Golang合并yaml文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 詳解Go多協(xié)程并發(fā)環(huán)境下的錯誤處理

    詳解Go多協(xié)程并發(fā)環(huán)境下的錯誤處理

    這篇文章主要介紹了詳解Go多協(xié)程并發(fā)環(huán)境下的錯誤處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論

伊通| 溧水县| 班戈县| 太仆寺旗| 达孜县| 赤壁市| 肥西县| 神农架林区| 徐汇区| 东港市| 通道| 通江县| 五峰| 应城市| 玉山县| 南京市| 化德县| 长宁县| 高碑店市| 江孜县| 沈丘县| 台中市| 巴南区| 井冈山市| 垣曲县| 临沂市| 瓮安县| 南涧| 湖北省| 蓬溪县| 祁连县| 改则县| 健康| 阳原县| 司法| 英吉沙县| 阳泉市| 鞍山市| 长春市| 沅陵县| 白城市|