1.有关java健壮性特点的真相

很多书上都说java健壮性的特点是因为java使用数组代替了c++的指针;c++最令人头痛的问题就是内存问题,java的健壮性使编程人员不用再考虑内存的问题;这种观点和想法是不对,java虽然有垃圾回收机制,不需要程序员去delete内存,但是在编码的时候还是应该考虑到内存的,尽量不要去浪费jvm的内存;这里就涉及到了java的堆栈问题。

2.java堆栈的区别

堆:存放类类型,用new建立,垃圾自动回收机制负责回收,速度慢

1).堆是一个“运行时”数据区,类实例化对象是从堆上去分配空间的,也就是说堆上空间都是通过new指令建立的;

2).与c++的区别就是java不需要显示的去释放堆,而是由垃圾回收机制负责,这是因为堆是动态分配内存大小的,即程序运行的时候分配;

3).这也产生了一个问题,堆空间的数据内存读取比较慢。

栈:存放基本数据类型,速度快

1).栈主要存放基本数据类型(byte、short、int、long、float、double、boolean、char)和对象句柄;

2).数据可以共享;何为共享?这里说的共享不是程序员决定的而是由jvm来控制,指系统自动处理的方式,比如说:int a = 10;int b= 10;这里的a、b变量指向的栈上空间地址是同一个,这就是所谓的“数据共享”;jvm的处理逻辑:java虚拟机去处理int a = 10的时候先去栈上创建一个变量作为a的引用,然后去查栈去找有没有10的值,如果有就将a指向10,如果没有就把10存进来。

3).相对于堆来说速度快;

4).栈数据的大小与生存期是确定的,缺乏灵活性。

例:int a = 0;

3.实例化对象的方法

比如说String这个类的实例可以由两种方法建立:

String str = new String(“yangkai”);

String str = “yangkai”;

分析:这两个方式创建的额对象是不同的,依照咱们上面介绍的堆栈知识应该对这种String的实例有所了解了吧!第一种采用new方式的在堆上开辟空间没调用一次就会创建一个对象;第二种是现在栈上创建String对象的引用,然后存储“yangkai”再让str引用;下次再调用str,如果栈上有就不会再次创建了;所以一般比较String变量的时候都采用两种方式,equals()和“==”;一般“==”判断的是对象是否相等即是否是同一个对象;判断出来两个String对象相等了说明这个字符串是存放在栈的,数据是共享的,这两个字符串是同一个对象;而equals()判断两个对象的内容是否相等,比如判断堆上的字符串的内容只能通过equals()方法来判断,“==”判断的可能是false,因为每一个string在堆上都是以一个String对象存储的。

4.如何控制内存,这里教你查看jvm内存的使用

当前虚拟机的最大内存: Runtime.getRuntime().maxMemory();

循环前虚拟机已占内存: Runtime.getRuntime().totalMemory();

下面使用两个案例来监测jvm内存:

package com.hudong.memory;

/**

*

* @Title: MemoryTest.java

* @Copyright: Copyright (c)2005

* @Description:

*

* 测试java虚拟机的内存占用情况

* @Created on 2014-1-21 上午11:40:35

* @author杨凯

*/

public class MemoryTest {

/**

* @param args

*/

public static void main(String[]args) {

testStringBuffer();

// testString();

}

/**

* 测试String实例对象的占用的内存

*/

public static void testString() {

String str = new String("abcdefghijklmn");

int count = 0;

System.out.println("当前虚拟机的最大内存:" + Runtime.getRuntime().maxMemory()/ 1024 / 1024 + "m------" + Runtime.getRuntime().maxMemory()+ "byte");

System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory()/ 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory()+ "byte");

while (true) {

try {

str += str;

count++;

} catch (Error e) {

System.out.println("循环次数:" + count);

System.out.println("字符串循环后的大小为:" + str.length() / 1024 / 1024 + "m-=-=-=" + str.length() + "byte");

System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory()/ 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory()+ "byte");

System.out.println("遇到错误:" + e);

break;

}

}

/*

* 运行结果:

* 当前虚拟机的最大内存:793m------832438272byte

循环前虚拟机已占内存:127m====133234688byte

循环次数:23

字符串循环后的大小为:112m-=-=-=117440512byte

循环前虚拟机已占内存:642m====673669120byte

遇到错误:java.lang.OutOfMemoryError: Java heap space

*/

}

/**

* 测试StringBuffer实例对象的占用的内存

*/

public static void testStringBuffer(){

StringBuffer sb = new StringBuffer("abcdefghijklmn");

int count = 0;

System.out.println("当前虚拟机的最大内存:" + Runtime.getRuntime().maxMemory()/ 1024 / 1024 + "m------" + Runtime.getRuntime().maxMemory()+ "byte");

System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory()/ 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory()+ "byte");

while (true) {

try {

sb.append(sb);

count++;

} catch (Error e) {

System.out.println("循环次数:" + count);

System.out.println("字符串循环后的大小为:" + sb.length() / 1024 / 1024 + "m-=-=-=" + sb.length() + "byte");

System.out.println("循环前虚拟机已占内存:" + Runtime.getRuntime().totalMemory()/ 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory()+ "byte");

System.out.println("遇到错误:" + e);

break;

}

}

/*

* 运行结果:

* 当前虚拟机的最大内存:793m------832438272byte

循环前虚拟机已占内存:127m====133234688byte

循环次数:23

字符串循环后的大小为:112m-=-=-=117440512byte

循环前虚拟机已占内存:539m====566108160byte

遇到错误:java.lang.OutOfMemoryError: Java heap space

*/

}

}

分析:以上两个程序用来说明String和StringBuffer两个占用内存的情况;其他资料上面介绍这两个类的使用的时候得出的结果是:Stringbuffer比String循环后得到的字符串字节大;而我在这测试的时候得到结果两个类得到的字符串大小是一样的,区别是耗费的额虚拟机的内存大小不一样,后者明显的比前者小。

注:安装完jdk之后jvm默认的大小是63m,上面我测试的时候是将jvm的配置文件的xmx大小调大之后的。

java栈的回收_JAVA的堆栈和内存、垃圾回收解说相关推荐

  1. java 2分代复制垃圾回收_Java对象的后事处理——垃圾回收(二)

    1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好.更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在. --< ...

  2. java虚拟机学习-JVM调优总结-新一代的垃圾回收算法(11)

    java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深 ...

  3. java垃圾回收 分代_Java-垃圾回收机制-通用的分代垃圾回收机制

    分代垃圾回收机制是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的回收算法,以便提高回收效率.Java虚拟机将对象分为三种状态:年轻代.年老代.持久代.JVM将 ...

  4. jvm学习第十、十一天、十二天—垃圾回收器1、垃圾回收的相关概述2、 垃圾回收相关算法3、 垃圾回收器

    标题:jvm学习第十.十一天.十二天-垃圾回收器 学习内容: 1.垃圾回收的相关概述 2. 垃圾回收相关算法 3. 垃圾回收器 内容详情: 1.垃圾回收的相关概述 什么是垃圾( Garbage)? 垃 ...

  5. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  6. 解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程

    解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程 来源:模板无忧 作者:编辑整理更新时间:2009-07-19点击:114 A survey of garbage col ...

  7. C++实现内存“垃圾”回收机制

    题目描述:当前我国计算机专业的数据结构与算法一般采用C++C++C++语言实现数据结构及相关算法(也有个别学校采用C语言实现数据结构及相关算法),但是C++C++C++及CCC语言由于采用指针的原因, ...

  8. java栈空异常_Java如何处理空堆栈异常?

    在Java编程中,如何处理空堆栈异常? 本例展示了如何使用Date类的System.currentTimeMillis()方法和Stack类的s.empty(),s.pop()方法来处理空堆栈异常. ...

  9. java 全局变量 内存不回收_JAVA知识梳理:内存管理与垃圾回收机制

    相对于C,C++来说,java程序员最幸运的事就是不用进行内存控制,很少会出现内存溢出的异常.但是这也不是绝对的,当出现oom的时候,如果不了解虚拟机是如何使用内存的,排查错误将会成为一项艰难的任务. ...

最新文章

  1. kubernetes创建资源的两种方式
  2. tomcat配置多个web网站的配置详解
  3. ​ICML 2021 Long Oral | 顺序不可知的交叉熵函数
  4. 流浪宠物救助网站前端页面_全国爱心人士齐聚鞍山 救助流浪猫狗
  5. ASP.NET2.0快速入门--高级数据方案(3)
  6. 【SpringCloud】服务注册之 zookeeper
  7. Python中使用Unicode对中文进行编码和解码
  8. 05章项目: QuickHit快速击键
  9. 华三交换机如何进入配置_H3C交换机应该如何安装配置解析
  10. 安卓新手入门基础知识
  11. 记录-使用TM1640 数码管驱动芯片
  12. nRF51822 DTM 测试 不能连续发送数据
  13. python库文件简介整理
  14. uniapp使用艺术字
  15. linux 无法定位程序,三步搞定无法定位程序输入点 于动态链接库上
  16. 正点原子IMX6UL底板硬件设计指南
  17. dw中css目标规则命名,css 常用样式命名规则
  18. php大华视频监控接入,大华摄像头实时视频接入Demo
  19. favicon.ico介绍,网页图标的制作动态网页图标
  20. 如何寻找出色的产品经理

热门文章

  1. python快速入门 pdf-Python快速入门 (第3版) PDF 下载
  2. python与人工智能编程-总算明白python人工智能编程入门案例
  3. python详细安装教程linux-Linux下python3.7.0安装教程
  4. python飞机大战源代码-python版飞机大战代码分享
  5. python 网站文件下载-python从网站上下载东西
  6. python解释器是什么-python解释器都有什么
  7. php和python对比-python学习笔记一和PHP的一些对比
  8. python3.6.5安装教程-[教程]Centos下使用Yum安装python3.6.5
  9. 自学python清单-python学习清单
  10. python语言入门w-Python完全小白入门指南