java快速排序引起的StackOverflowError异常
写在前面:这篇随笔主要记录一下递归调用引起的虚拟机栈溢出的情况以及通过参数配置了虚拟机栈大小来使递归调用可以顺利执行。并没有对涉及到的一些概念进行详细的解释(因为我自己目前对这些概念并不是特别清楚),可以用于参考的关键字:
关键字:java虚拟机栈,栈溢出,栈帧
今天在对比快速排序与冒泡排序时,通过代码分别实现了最简单的快速排序与冒泡排序(从小到大排序),代码如下:
/**
* 冒泡排序
*/ public class BubbleSortDemo {
public static void main(String[] args) {
int[] nums = new int[100000];
for (int i = nums.length - 1, j = 0; i >= 0; i--, j++) {
nums[j] = i;
}
long start = System.currentTimeMillis();
bubbleSort(nums);
long end = System.currentTimeMillis();
System.out.println((end - start) + "ms");
} public static void bubbleSort(int[] nums) {
int swapCount = -1;
while (swapCount != 0) {
swapCount = 0;
for (int i = 0; i < nums.length - 1; i++) {
int iItem = nums[i];
int jItem = nums[i + 1];
if (iItem > jItem) {
swap(nums, i, i + 1);
swapCount++;
}
}
}
} /**
* 交换数组nums[]中i和j位置的两个元素
*/
public static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
/**
* 快速排序
*/ public class QuickSortDemo {
public static void quickSort(int[] nums, int leftIndex, int rightIndex) {
if (nums.length <= 1 || leftIndex >= rightIndex) {
return;
} int pivot = nums[leftIndex];
int left = leftIndex;
int right = rightIndex; while (left < right) {
while (left < right && nums[right] >= pivot) {
right --;
}
if (left < right) {
nums[left] = nums[right];
left ++;
}
while (left < right && nums[left] <= pivot) {
left ++;
}
if (left < right) {
nums[right] = nums[left];
right --;
}
}
nums[left] = pivot;
quickSort(nums, leftIndex, left - 1);
quickSort(nums, left + 1, rightIndex);
} public static void quickSort(int[] nums) {
if (nums != null) {
quickSort(nums, 0, nums.length - 1);
}
} public static void main(String[] args) {
int[] nums = new int[100000];
for (int i = nums.length - 1, j = 0; i >= 0; i--, j++) {
nums[j] = i;
}
long start = System.currentTimeMillis();
quickSort(nums);
long end = System.currentTimeMillis();
System.out.println((end - start) + "ms");
} }
在它们的main函数中,我生成了length=100000的从大到小排列的有序数组对两个排序算法进行测试,观察它们的执行时间。
对于冒泡排序,对100000个有序数组进行排序,花费了12833ms。
对于快速排序,对100000个有序数组进行排序,因为快速排序采用了递归来实现,程序抛出了StackOverflowError异常,本来以为是哪个地方陷入了死循环导致的,后来经过排查,其实是因为虚拟机栈溢出,函数调用的太深了。通过设置虚拟机参数-Xss10m,为虚拟机栈分配了10M的内存,使这个算法可以正常执行。最后,快速排序花费了4830ms。
java快速排序引起的StackOverflowError异常的更多相关文章
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- Java虚拟机三:OutOfMemoryError异常分析
根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例 ...
- Java编程的逻辑 (24) - 异常 (上)
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java异常(三) 《Java Puzzles》中关于异常的几个谜题
概要 本章介绍<Java Puzzles>中关于异常的几个谜题.这一章都是以代码为例,相比上一章看起来更有意思.内容包括:谜题1: 优柔寡断谜题2: 极端不可思议谜题3: 不受欢迎的宾客谜 ...
- Java从零开始学十九(异常)
一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...
- JAVA项目中常用的异常知识点总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- OutOfMemoryError异常 和 StackOverflowError异常
OutOfMemoryError异常 StackOverflowError异常 程序计数器 无 无 Java虚拟机栈 如果虚拟机栈可扩展,扩展时无法申请到足够内存 线程请求的栈深度大于虚拟机所 ...
- java电商项目常见异常
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- java提高篇(十六)-----异常(一)
Java的基本理念是“结构不佳的代码不能运行”!!!!! 大成若缺,其用不弊. 大盈若冲,其用不穷. 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因 ...
随机推荐
- java.io.Serializable 序列化问题【原】
java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...
- C#字体与Rectangle简单对应关系
在1920*1080 无缩放分辨率下,Rectangle要至少是字体的2倍+2才不会被遮挡.
- W3C规范
连接:https://www.w3cschool.cn/xuexiw3c/xuexiw3c-standards.html W3C 代码标准规范 由 路飞 创建, 最后一次修改 2017-01-03 W ...
- luogu P2516 [HAOI2010]最长公共子序列
传送门 首先那个\(O(n^2)\)的dp都会吧,不会自己找博客或者问别人,或是去做模板题(误) 对以下内容不理解的,强势推荐flash的博客 我们除了原来记录最长上升子序列的\(f_{i,j}\), ...
- delphi-TTcpServer与TTcpClient
最简单的TTcpServer与TTcpClient通信实例-Delphi_海盗船长_新浪博客http://blog.sina.com.cn/s/blog_5383794d0100nt9u.html d ...
- jquery选择器最后一个,倒数第二个元素
<div> <p>1</p> <p>2</p> <p>3</p> <p>4</p> < ...
- python 面向对象的类
参考<learn python hard way> 网址:https://learnpythonthehardway.org/book/ex41.html class X(Y) " ...
- Linux用户相关指令
⒈添加用户 ①useradd [Options] 用户名 useradd -d 指定用户目录 用户名 useradd -g 用户组 用户名 ⒉指定/修改用户密码 ①passwd 用户名 ⒊删除用户(建 ...
- 【黑客免杀攻防】读书笔记6 - PE文件知识在免杀中的应用
0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描. 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的. 修改区段名 1.1 移动PE文件头位置免杀 工具:PeC ...
- 那些IT行业的经典定律
几十年来,IT界有一些非常著名的定律,蕴含着行业发展的大智慧,非常有趣,略作收集总结,再加上一丁点自己的浅见~ 一.摩尔定律:价格不变,集成电路上可容纳的元器件数目,约每隔18个月便会翻一倍,性能也将 ...