一. jdk的内存:jdk的bin目录常见命令

1. javac.exe:编译java源代码的,生成java字节码文件(*.class)

2. java.exe:启动一个jvm,来运行指定class字节码文件

3. javap.exe:(javap -c  java type.class)反汇编Java字节码成Java源代码。

二. Jvm的内存

1.栈内存:函数的{ }之间定义的变量均在JVM的stack栈内存中存储(在定义其变量的时候,开辟空间,当执行到函数右大括号时,栈内存回收)

注:简单类型定义的变量直接存储数值,引用类型定义的变量存储的是地址。

2.堆内存:存储新new的对象(new的时候开辟空间, 闲置时则靠GC(Garbage Collection垃圾回收器)来回收堆内存)

注:堆里只存储新new的对象

JVM内存简单示例:

3. int型

1. int a=10;

int b=10;

//简单类型,变量里存储的是数值

System.out.println(a==b);

//因为存储的是数值,所以此处比较的是数值大小。

//结果:true

2. Integer b=new Integer(10);

Integer d=new Integer(10);

//引用类型,变量里存储的是地址,new的对象(10)在堆里。

System.out.println(b==d);

//因为存储的是地址,b,d 地址不相等。/

/结果:false

System.out.println(b.equals(d));

//此处是对b, d 进行调用函数equals(),比较其数值的大小。

//结果:true

3. Integer b=new Integer(10);

Integer e=10;

Integer f=10;

//此处调用Integer.valueOf()函数,相当于

Integer.valueOf(10)

if(data>=-128&&data<=127)

{

return Integer.cache(data);//返回的是缓存池里的固定地址

}

else{

return new Integer(data);//返回的是新new出来的地址

}

//注:用Integer e=?;定义变量时,当变量的值?在-128——//127之间时,e的地址均在常量池里找。

System.out.println(e==f);

//因为e,f的变量值均在-128——127之间,所以在常量池中查找,

//且e ,f 存储的是地址,即结果为true

System.out.println(e==b);

//因为b是用Integer e=?;方式定义的,且在-128——127范//围内,所以地址在常量池里查找。而b是新new的地址,所以结果:false。

装包:Integer e=10;//(将一个数值赋给引用变量,此时就要进行装包,装包的实质就是调用 Integer.valueOf(10);找到在缓存池中的位置,返回地址。)

Integer.valueOf(10)

if(data>=-128&&data<=127){

return Integer.cache(data);//返回的是缓存池里的固定地址

}else{

return new Integer(data);//返回的是新new出来的地址

}

拆包:int b=a;    (当两个变量进行比较,一个为数值,一个为地址时,此时就要对引用地址的变量进行拆包)

//a.intValue()

{

return  Value;//返回其数值

}

例题分析:

*在jdk1.5的环境下,有如下4条语句:

Integer i01=59;   //  要装包

int i02=59;

Integer i03= Integer.valueOf(59);

Integer i04= new Integer (59);

以下输出结果为false的是( C )

A. System.out.println(i01== i02);

//1是装包后,地址在常量池里找的。2存的是数值。所以此时两者进行比较要对i01进行拆包,然后在进行比较。True

B. System.out.println(i01== i03);

//1是装包后,地址在常量池里找的。3是1的具体语句,所以3也是装包后,地址在常量池里找。  True

C. System.out.println(i03== i04);

//3是装包后,地址在常量池里找的。

//4是新new的,地址是新开辟的。  False

D. System.out.println(i02==i04);

//2存的是数值。4是新new的地址。所以此时进行拆包,两者均拆为数值,然后进行比较。  true

4.string型

1.String  str1=new String("hello world");//str1存储的是新new的地址

String  str2=new String("hello world");  //str2存储的是新new的地址

String  str3="hello world";                     //str3进行了装包,并且地址是在常量池里查找的

System.out.println(str1=str2);

System.out.println(str1=str3);

System.out.println(str1.equals(str2));

5.Byte型.Short型.long型.Float型.Double型与Integer型用法一样。

但Byte型的范围为-128——127,所以Byte data1=Byte.valueOf(59);均在常量池中查找。

6.例题1

1 public classliti {2 public static voidmain(String[] args) {3 int a=10;4 int b=20;5 swap(a,b); //调用swap方法对变量,a b 的值进行交换

6 System.out.println(a+" "+b);7 }8 private static void swap(int a,intb)9 {10 int temp=a;11 a=b;12 b=a;13

14 }15 }

代码结果:

分析:

当程序开始执行时,首先调用了main()方法,所以JVM在栈内存中给main()方法开辟了一块内存,在main()方法内存中

定义了两个变量 a, b ,并分别给其赋值10,20。接着又调用了swap()方法,于是JVM在栈内存中给swap()方法也开辟了一块

内存,在swap()方法内存中,定义了一个变量temp,并将a的值赋给temp,然后将 a b 的值进行交换,当出了swap()方法的

右大括号时,swap内存被回收,因为swap()方法中无任何返回值,所以随着内存被回收,在swap内存中进行的一切运算也

将归零。而此时main()方法中 a 和 b 变量的值仍为10 和20,这时候打印出来的结果仍为a=10,b=20.

7.例题二

1 public classliti {2 public static voidmain(String[] args) {3 int[] arr=new int[2];4 arr[0]=10;5 arr[1]=20;6 swap(arr,0,1); //交换数组元素arr[0],arr[1]的值

7 System.out.println(arr[0]+" "+arr[1]);8 }9

10 private static void swap(int[] arr, int i, inti1) {11 int temp=arr[0];12 arr[0]=arr[1];13 arr[1]=temp;14

15 }16 }

运行结果:

分析:

当程序在执行时,首先调用了main()方法,所以Jvm在栈内存中给main()方法开辟了一块内存,在这块内存中

定义了一个数组变量,其变量中存储的是数组的地址,然后根据地址又在堆内存中给数组元素进行了赋值,接着

调用swap()方法,所以Jvm在栈内存中给swap()方法开辟了一块内存 ,  在这块内存中定义了一个数组变量,并将

main()方法中的数组变量arr的值(地址)赋给它,swap()方法根据变量arr中的地址,在堆内存中找到该数组,并将

数组元素arr[0] 和arr[1]的值进行交换。此时swap()方法执行完毕,swap内存被Jvm回收。因为main()方法和swap()

方法引用的是一个数组地址,所以此时main()方法中的数组的值也被就改变了,所以在main()方法中打印arr数组元

素的值,结果为arr[0]=20;arr[1]=10。

8.例题

1 importjava.util.Arrays;2 public classliti {3 public static voidmain(String[] args) {4 String str="good";5 char[] ch={'a','b','c'};6 change(str,ch);7 System.out.println(str+" "+Arrays.toString(ch));8 }9

10 private static void change(String str, char[] ch) {11 str="test.ok";12 ch[0]='g';13 }14 }

代码结果:

分析:

当程序在执行时,首先调用了main()方法,所以Jvm在栈内存中给main()方法开辟了一块内存,在这块内存中

先定义了一个字符类型变量,该变量中存储的是该字符串在堆中的地址,然后定义了一个字符数组变量,

其变量中存储的是数组的地址,然后根据地址又在堆内存中给字符数组元素进行了赋值。接着调用change()方法,

所以Jvm在栈内存中给change()方法开辟了一块内存,在change内存中,定义了一个字符串变量,并将main()方法

中的字符串变量的值(地址)赋给它,还定义了一个字符数组变量,同样的,并将main()方法中的字符数组变量的值

(地址)赋给它,然后在该方法中又将字符串“good”在堆中(字符串常量池)的地址赋给str,接着又根据ch的地址

在堆中找到字符串数组,并将堆中的数组元素ch[0]='a';变成ch[0]='g';随着change()方法执行完毕,change()方法

的内存被回收,而此时main()方法中的str变量仍存储的是“good“的地址,虽然ch也存储的仍是数组在堆中的地址

但数组内的值却发生了变换。所以打印出来的结果str不变,ch变。

java引用类型内存_Java的引用类型的内存分析相关推荐

  1. java 基本类型内存_java基本数据类型、内存分析、装包拆包

    2019-09-13   18:01:23 idea快捷键: file->settings->Keymap->搜索关键字 Increase Font Size   增大字体    c ...

  2. java 指定 内存_java 运行时指定内存大小

    java -jar -Xms1024m -Xmx1536m -XX:PermSize=128M -XX:MaxPermSize=256M XXX.jar java  -Xms128M -Xmx512M ...

  3. java 数组 内存_Java 中数组的内存分配

    Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...

  4. java 字符串倍_java字符串拼接与性能分析详解

    假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用"+"的话将得到最低的性能.但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder ...

  5. java 漏洞挖掘_Java XXE漏洞典型场景分析

    本文首发于oppo安全应急响应中心: 0x01 前言: XML 的解析过程中若存在外部实体,若不添加安全的XML解析配置,则XML文档将包含来自外部 URI 的数据.这一行为将导致XML Extern ...

  6. java 递归原理_Java中递归原理实例分析

    本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中 ...

  7. java lambda 实现_Java 8 Lambda实现原理分析

    PDF文档已上传Github 为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢 ...

  8. java mysql 配置_Java连接MySQL数据库详细分析

    一:工具 eclipse MySQL5.7 MySQL连接驱动:mysql-connector-java-5.1.44-bin.jar下载地址 二:加载驱动 2.1 在工程目录中创建lib文件夹,将下 ...

  9. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  10. java 自定义标签_Java自定义标签用法实例分析

    本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...

最新文章

  1. 二代三代转录组测序分析实战班
  2. Python 学习 —— Numpy 、Pandas 傻傻分不清楚
  3. tikhonov正则化 matlab_4 L1和l2正则化详解(花书7.1 参数范数惩罚)
  4. 数据结构-哈希与映射
  5. linux查看redis表内所有数据,Redis数据库(list类型)
  6. magic_quotes_gpc与magic_quotes_runtime区别
  7. 【java笔记】模拟B/S服务器
  8. 物联网卡购买最关注的六个点
  9. 基于粒子群优化算法的BP神经网络预测模型(Matlab代码实现)
  10. spss常态检验_spss中正态性检验表怎么分析
  11. gitlab修改服务器地址,GitLab服务器IP地址设置
  12. java毕业设计_企业销售合同管理系统
  13. UG\NX二次开发 判断两个圆柱面共轴的思路
  14. python k折交叉验证,python中sklearnk折交叉验证
  15. 获取历史和实时股票数据接口
  16. 当你电脑网络显示正常,但是网页却无法上网时,你应该..
  17. 日志管理logging的使用
  18. python 使用wxpy实现获取微信好友列表 头像 群成员
  19. 写给Python社群的第2课:Python逻辑语句,天天要写的 if 和 while
  20. 微软校招面试题3-15 (一道经典算法,一道比较难的题目)

热门文章

  1. HTML网页设计制作 dreamweaver网页源代码 北京故宫旅游景点网站设计
  2. PyQt5项目:网速监控器
  3. 个人数据泄露问题的数据_非个人的个人数据
  4. sccm服务器远程,sccm服务器是什么
  5. 机械秒表的使用方法_秒表、机械秒表、504秒表,505无暂停机械秒表
  6. angular 脏值检测基础流程
  7. 100 个常见的 PHP 面试题和答案分享
  8. MATCH和INDEX函数
  9. FPGA Verilog语言常用语法
  10. 手工脱壳之 ASPack压缩壳【随机基址】【重定位表加密】