VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • Golang与Java的区别

 

语言设计上的区别

  • 并发的区别
  • Go
  • 语言是天然的并发语言,运行在用户态,处理器之间的上下文切换消耗可以非常低。
  • Go语言内部设计MPG模型,具体可以参见之前的文章「简单概括Goroutine特点」
  • Goroutine大小默认是4kb
  • Goroutine大小会随着占用内存多少而动态增加,不会固定大小,这样也节省了内存的使用
  • Java
  • 多线程语言,需要OS内核参与线程间上下文切换,消耗性能
  • 线程大小默认1M,可以通过OSS进行线程大小配置,但是也远小于Goroutine中默认的4kb。
  • Java线程大小设置好是固定的
  • 内存分配的区别
  • Go
  • 俗称逃逸分析
  • 内存分配存在两部分:第一部分是动态分配的全局堆,第二部分是运行在Goroutine中的局部栈
  • 人为无法通过特殊的途径让对象分布在某个区域(比如java中的new关键字)
  • 编译时能判断字段占用内存大小且明确生命周期的变量会分配在「局部栈」中,其他情况会动态分配在「全局堆」
  • 栈分配比较便宜,堆分配比较贵;栈就只是栈内分配和栈内分解,堆需要垃圾回收
  • Java
  • new 关键字创建的对象全都分配在堆中,最终通过垃圾回收期进行回收
  • 垃圾收集   
  • Go
  • 三色法
  • 三色法的基础上 增加了 混合写屏障
  • 混合写屏障:避免了对象变更引用时候被当做垃圾进行回收。
  • Java
  • 标记删除
  • 复制删除
  • 标记整理
  • CMS
  • G1
  • 垃圾收集器
  • Serial串行收集器,老年代是Serial Old,不会使用
  • Parallel Scavenge并行收集器,老年代是 Parallel Old。
  • CMS 收集器,运行在老年代;对应的新生代收集器是ParNew
  • G1保留分代收集的特点,增加Region区域,根据标记删除的方式标记需要垃圾回收的Region,进行排序,根据Region由大到小排序 (排序的目的是可以清晰的知道哪些Region占用内存大),再根据垃圾回收所消耗的时间判断 哪些Region需要优先回收。
  • 通讯方式
  • Go
  • 基于CSP原理,通过通讯来共享内存
  • Go中channel关键字
  • Java
  • 通过共享内存在通讯
  • 多线程之间需要用volatile 保证通向内存的可见性

原文链接:https://www.5axxw.com/wenku/zq/5100996b.html


相关教程