写在前面:这篇随笔主要记录一下递归调用引起的虚拟机栈溢出的情况以及通过参数配置了虚拟机栈大小来使递归调用可以顺利执行。并没有对涉及到的一些概念进行详细的解释(因为我自己目前对这些概念并不是特别清楚),可以用于参考的关键字:

关键字: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异常的更多相关文章

  1. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  2. Java虚拟机三:OutOfMemoryError异常分析

    根据Java虚拟机规范,虚拟机内存中除过程序计数器之外的运行时数据区域都会发生OutOfMemoryError(OOM),本文将通过实际例子验证分析各个数据区域OOM的情况.为了更贴近生产,本次所有例 ...

  3. Java编程的逻辑 (24) - 异常 (上)

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  4. Java异常(三) 《Java Puzzles》中关于异常的几个谜题

    概要 本章介绍<Java Puzzles>中关于异常的几个谜题.这一章都是以代码为例,相比上一章看起来更有意思.内容包括:谜题1: 优柔寡断谜题2: 极端不可思议谜题3: 不受欢迎的宾客谜 ...

  5. Java从零开始学十九(异常)

    一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...

  6. JAVA项目中常用的异常知识点总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  7. OutOfMemoryError异常 和 StackOverflowError异常

      OutOfMemoryError异常  StackOverflowError异常  程序计数器 无 无 Java虚拟机栈 如果虚拟机栈可扩展,扩展时无法申请到足够内存 线程请求的栈深度大于虚拟机所 ...

  8. java电商项目常见异常

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  9. java提高篇(十六)-----异常(一)

         Java的基本理念是“结构不佳的代码不能运行”!!!!! 大成若缺,其用不弊. 大盈若冲,其用不穷. 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因 ...

随机推荐

  1. HDU - 3973 AC's String(Hash+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...

  2. git常用命令及含义

    Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调 ...

  3. 获取客户端的请求IP地址

    获取客户端的请求IP地址 package com.microClass.util; import javax.servlet.http.HttpServletRequest; import java. ...

  4. 让富文本编辑器支持复制doc中多张图片直接粘贴上传

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧? 我希望打开文档doc直接复制粘贴到富文本编辑器,直接发布 感觉这个似乎很困难 ...

  5. DPM 目标检测1

    1. Origin 原始目标检测: HOG梯度模型+目标匹配 为了提过对目标形变的鲁棒性(多视角->多组件): 目标形态多样性—>多个模型 目标的动态变化多视角—> 子模型 目标形变 ...

  6. HTML5的学习(三)HTML5标签

    3.HTML5新添加的标签 标签 描述 <article> 定义文章. <aside> 定义页面内容之外的内容. <audio> 定义声音内容. <bdi&g ...

  7. 解决Centos下yum无法更新

    问题: http://mirrors.cloud.aliyuncs.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - ...

  8. Linux的7个运行级别

    0:关机 1:单用户(找回丢失密码)此模式下所有用户不需要密码即可登录,可用于重置密码 2:多用户状态没有网络服务 3:多用户状态有网络服务 ★ 4:系统未使用保留给用户 5:图形界面 ★ 6:系统重 ...

  9. nodejs对mongodb数据库的增删改查操作(转载)

    首先要确保mongodb的正确安装,安装参照:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian-or-ubuntu-l ...

  10. linux 同步IO: sync、fsync与fdatasync、sys_sync【转】

    本文转自:http://blog.csdn.net/cywosp/article/details/8767327 和 http://www.2cto.com/os/201204/126687.html ...