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

关键字: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. 我的日志分析之道:简单的Web日志分析脚本

    前言 长话短说,事情的起因是这样的,由于工作原因需要分析网站日志,服务器是windows,iis日志,在网上找了找,github找了找,居然没找到,看来只有自己动手丰衣足食. 那么分析方法我大致可分为 ...

  2. 为什么选择图形数据库,为什么选择Neo4j?

    最近在抓取一些社交网站的数据,抓下来的数据用MySql存储.问我为什么用MySql,那自然是入门简单,并且我当时只熟悉MySql.可是,随着数据量越来越大,有一个问题始终困扰着我,那就是社交关系的存储 ...

  3. SQL Server分页进化

    DataReader.Dataset 数据量太大就用datareader,dataset都读到内存里了,datareader是直接读取数据库. DataReader是一个快速的只进游标 DataRea ...

  4. linux 网络之 bond 网卡模式

    Linux bond模式通过多个网卡绑定技术既能增加服务器的可靠性,又增加了可用网络宽带,为用户提供不间断的网络服务: 七种bond模式: 第一种模式:mod=0 ,即:(balance-rr) Ro ...

  5. resolution will not be reattempted until the update interval of repository-group has elapsed or updates are forced

    Failed to execute goal on project safetan-web: Could not resolve dependencies for project com.safeta ...

  6. win10如何获得管理员权限_百度经验

    win10如何获得管理员权限_百度经验http://jingyan.baidu.com/article/0aa223755448db88cd0d6450.html 在右下方任务栏的“搜索web和win ...

  7. Mask RCNN 学习笔记

    下面会介绍基于ResNet50的Mask RCNN网络,其中会涉及到RPN.FPN.ROIAlign以及分类.回归使用的损失函数等 介绍时所采用的MaskRCNN源码(python版本)来源于GitH ...

  8. python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序

    1.有道的翻译 网页:www.youdao.com Fig1 Fig2 Fig3 Fig4 再次点击"自动翻译"->选中'Network'->选中'第一项',如下: F ...

  9. 【windows核心编程】系统消息与自定义钩子(Hook)使用

    一.HOOk Hook是程序设计中最为灵活多变的技巧之一,在windows下,Hook有两种含义: 1.系统提供的消息Hook机制 2.自定义的Hook编程技巧 其中,由系统提供的消息钩子机制是由一系 ...

  10. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...