j***a语言有死循环,j***a死循环语句

kodinid 27 0

大家好,今天小编关注到一个意思的话题,就是关于java语言有死循环问题,于是小编就整理了2个相关介绍Java语言有死循环的解答,让我们一起看看吧。

  1. java中while(true)死循环会造成JVM内存溢出吗?
  2. jdk8中的ConcurrentHashMap究竟为什么高效?

j***a中while(true)死循环会造成JVM内存溢出吗?

1、把局部变量定义在死循环里面会造成栈溢出,诸如下面的定义:

while(true){

java语言有死循环,java死循环语句-第1张图片-安济编程网
图片来源网络,侵删)

int x=1;

int arr[]= new int[10];

}

java语言有死循环,java死循环语句-第2张图片-安济编程网
(图片来源网络,侵删)

因为栈空间存储局部变量、参数对象,栈是有默认深度的,我记得是128M(记忆问题,错了请指出)。

2、把对象定义在起循环里面会产生堆内存溢出,诸如下列定义:

while(true){

java语言有死循环,java死循环语句-第3张图片-安济编程网
(图片来源网络,侵删)

Person p = new Person();

}

如果是死循环,那有可能会产生内存溢出,而内存溢出一般有三种可能:

比如循环内一直创建对象放入到list中(保证对象一直被引用),那么就会出现堆内存溢出OutOfMemoryError:J***a heap space。

而如果j***awebjsp文件比较多或者第三方jar比较大超出了MaxPermSize设置,那么就会出现永久代内存溢出OutOfMemoryError: PermGen space(j***a8中永久代被移除)。

而如果jvm占用了服务器的大量内存,那么有可能出现无法创建新的线程错误OutOfMemoryError: unable to create new native thread 。

这三种内存溢出的情况,第一种和第三种都有可能出现在死循环中

在实际的开发中,通常的内存溢出,都是由于开发人员编程不当造成的。所以我们开发人员编写代码应该合理使用内存,比如强软弱虚引用的合理使用,自定义内存分配,以此来降低内存溢出出现的概率。

希望我的回答对你有所帮助


jdk8中的ConcurrentHashMap究竟为什么高效?

源码来窥其一斑!

我们都知道hashMap不是线程安全的,因为在扩容方法中很容易出现死循环,hashTable使用锁的方式比较简单暴力,几乎在所有操作方法上都加了synchronized锁,导致总体性能很差,concurrentHashmap凭借线程安全且性能优异一直都是高并发中的首选key-value型数据结构

concurrentHashmap的高性能有以下原因:

一,分段锁:jdk8中对concurrentHashmap进行了改进,抛弃了jdk7中新建segment作为分段锁的过程,jdk8中虽沿用了这种分段锁的思想,却直接使用数组中的数据作为分段锁保证concurrentHashmap在上锁的时候只针对数下标下的数据进行上锁(比如如果数组长度为256,那么每次put平均只有1/256的数据被锁),而大多数其他的数据还是能进行正常的增删改操作,无需阻塞等待,这无疑极大的降低了锁的粒度,提升了性能。

二,红黑树 :jdk8中引入了红黑树结构,在单个数组下标内的数据达到8以后,会自动转换为红黑树进行存储,使用大O表示法表示效率的话,红黑树的查找效率为O(log(n)),而链表的效率为O(n),当数据量越来越大的时候,红黑树的效率明显好于链表,所以concurrentHashmap性能得到很大提升;

现在我们主要从put方法中的主要方法来分析性能的提升:

spread(key.hashCode());//作用是再次哈希,减少冲突 ,源码如下

其中涉及到的位运算

>>> 16:无符号右移16位,空位以0补齐 。

^:异或运算符-->相同为0,不同为1; &:与运算符-->全1得1,否则0;

到此,以上就是小编对于j***a语言有死循环的问题就介绍到这了,希望介绍关于j***a语言有死循环的2点解答对大家有用。

标签: 溢出 内存 循环