Java C++ 服务比较

1、内存占用,C++占优:jvm的垃圾回收原理下,old区只有到70%才会回收,否则系统为了效率,不会强制做fullgc,因此假如一开始分配了 -xms = xmx = 2g, -xmn = 512m的情况下,整个服务占用内存很容易达到1g以上。   而C++写的服务,由于上次应用自己控制内存,用完马上释放,因此内存占用非常小。 比如apache一个进程常常只占据几十M内存。

2、底层功能应用,C++占优:  C++通过调用操作系统底层API,可以很方便的利用系统提供的更多功能。Java由于为了跨平台,jdk API的限制,很多操作系统的功能被阉割了。

例如:

a、fork,对于C++写的程序,fork是一个很又有的功能。例如redis通过fork出子进程,进行copy on write的数据持久化。apache通过动态fork和kill子进程,更弹性的提供高并发服务。并且通过fork,可以防止一个进程被杀后,立即fork出备份进程,防止服务在主机上整体crash。Java也可以通过Runtime.exec(cmd)执行命令生成新的Java进程,但是只是启动了一个全新的Java进程,并不是fork,并不能复制父进程中的数据。

b、mmap, C++通过内存映射,可以很方便的在不同进程中通信。而Java则很难做到这点。Java只能走本地socket进行通信。

c、管道:C++进程通过管道机制,可以在不同进程间形成数据通道,很方便的相互通信和配合完成功能。

d、文件锁:对于不同进程之间的共享锁机制

e、还是fork,因为fork后,父子进程共享内存、文件描述符,所以多个apache才能监听在一个端口上。这个对于jboss是不可能的。

总之,Java由于jdk API的限制,由于单进程的限制,上层应用无法获取很多进程级别的功能。

3、开发,Java占优:Java的内存处理、越界异常监听、指针地址不可见,使得整个语言非常的安全,程序员不用太过关注内存、指针问题导致整个进程crash的问题,更高效的关注上层业务逻辑的开发就好。Java语言的跨平台性不需要太多关注不同平台的函数差异性。Java的堆栈打印可以很方便的定位问题。

4、程序效率,C++占优:例如对ssl的处理,openssl明显比jsse高效不止一个量级,并且jsse在处理ssl时会造成大量内存零时对象,占用大量内存,从而使得jvm因为高内存占用后不停做gc,消耗了jvm的系统资源。

5、反射, classloader。 Java的proxy机制,spring框架,最底层上必须依赖这些技术。 Java通过反射、classloader技术,将整个框架的灵活性和动态性大大超过了C++程序。理由是Java语言最终是编译为bytecode到jvm容器中运行,所以还是语言可控的。而C++编译,link完之后,就只是一个写死的二进制程序了,最多通过lib技术将一些函数放到外面共用,但语言本身,程序本身,已经定死了,不可能像Java那样,通过一个字符串动态创建一个类。