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、文件锁:对于不同进程之间的共享锁机制

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


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


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



你可能感兴趣的:(java)