JVM学习03_new对象的内存图讲解,以及引出static方法(转)

  1. 目录

    1.   -=-讲解对象创建过程中,-=-堆内存和栈内存的情况

         -=-构造函数对类对象的成员变量的初始化过程

         -=-构造函数出栈

         -=-类的方法在不访问类对象的成员变量时造成的内存资源浪费怎么解决?

         -=-引出static方法

    2. 扯淡
      1. --明确概念:
      2.   -=-类:是对现实事物的抽象描述;举例:人,有年龄,姓名,高矮胖瘦等特征;有吃喝睡等行为动作;现实中的人由特征和行为组成{思想这种东东暂时还是不考虑吧}
        1. -=-怎么判别一个类里面时候需要有主函数mian():看这个类是否需要独立运行
        2. -=-描述事物的类有很多,有一个类来调用其他的描述事物的类就可以了,就像是不用给每一个居民家中都配一个警察一样

                       -=-有主函数main的类被称为启动类,也就是在JVM启动的时候就启动的类,启动之后便进去main()中执行语句

                        -=-想描述具体的事物就需要给出具体的形象,比如在校园里面看到一个很漂亮的姑娘,你像被人形容的时候不能和别人说:“我今天在学校里面看到一个女的”。谁听了都想抽你

                        -=-而是应该具体形容:"我今天在学校里面看见一个姑娘,笑靥如花,身材苗条,唇白齿红,她是院系的,我还要了她的手机号码。。。"这样谁听了谁都想问你要手机号。。。。

                        -=-那么怎么把一个抽象的描述人的类具体化呢(也称实例化,就是创造一个实实在在的 人)-java中使用new关键字实现

                        -=-比如 new Person(21,"笑靥如花,唇白齿红,身材高挑");好吧这就是创建一个人的过程。这个实例化(把类具体化的过程)的产物就是创建一个Person类的对象(活生生的人)

        3.   -=-所以人们有时候调侃程序员:没有女朋友怎么办?new 一个对象就可以了、、、、

           -=-可是这个人连个名字都没有,一些给一个唯一的名字吧--->Person p=new Person();这句话就是创建了Person类型的变量[引用类型,还有就是数组和String类型]。比如说:人民一听大众就知道:哦,这是一个汽车类型;一听卡西欧,就知道是手表类型

        4.  现在来说一下
          1.  Person p=new Person();
          2.  [引用数据类型   类型变量指向创建的该类型的对象  = 初始化的值[对象的地址,必须要运行时候才能确定] ]【那些数据在编译时候和运行时候才能确定?】
          3. int i=6;
          4. [基本数据类型  变量 = 初始化值[此处在编译时候就可以确定]]
          5. 好了,现在我们创建好了一个人之后就要像别人描述了:balabalba{也即是创建对象可以被别的类调用和访问}
    3.  --下面才是重点:上面都是。。。。

       --new Person() 根据下面的代码创建的吗?——NO,不是根据.java文件,而是.class文件,这个才是可以被JVM加载和运行的

       --那为什么写下面的.java格式的代码啊?——因为.java文件是给人看的,.class文件一般人都看不懂,,,原来是这样,我智商被鄙视了

    4. 下面具体根据内存图来小小看下 Person p=new Person("周迅",21);这句话到底发生了什么?
      1. 贴出代码


        1

        2

        3

        4

        5

        6

        7

        8

        9

        10

        11

        12

        13

        14

        15

        16

        17

        18

        19

        20

        21

        22

        23

        24

        25

        26

        27

        public class Test {

         

                public static void main(String[] args) {

                    Person p1=new Person("周迅", 21);

                    p1.speak();

                     

                }

        }

         

         

        class Person{

             

            private String name;

            private int age;

         

            public Person(String  name,int age) {

                this.name=name;

                this.age=age;

            }

            public  void speak(){

                 

                System.out.println("周迅在说话");

            }

             

        }

         

        //执行结果:周迅在说话

      2.  
      3.  
      4.  

又看了毕向东老师的教程

 

 

http://www.cnblogs.com/together-sharing-for-freshman/p/4351399.html

 

时间: 2024-10-25 03:16:01

JVM学习03_new对象的内存图讲解,以及引出static方法(转)的相关文章

jvm对大对象分配内存的特殊处理(转)

    前段日子在和leader交流技术的时候,偶然听到jvm在分配内存空间给大对象时,如果young区空间不足会直接在old区切一块过去.对于这个结论很好奇,也比较怀疑,所以就上网搜了下,发现还真有这么回事.以下给出具体代码来说明: 首先定义好jvm内存各个区域的大小.我设定的是eden区8M,from和to各1M,old区10M,总共20M的空间,参数如下:   Shell代码   -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8       紧接着,开

JVM学习(3)——总结Java内存模型

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简介 volatitle关键字 原子性 可见性 有序性 指令重排 先行发生--happen-before原则 解释执行和编译执行 其他语言(c和c++)也有内存模型么?   为什么需要关注Java内存模型?   之前有一个我实习的同事(已经工作的)反讽我:学(关注)这个有什么用? 我没有回答,我牢记一

JVM学习笔记(四)------内存调优

首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM. 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量.特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC

JVM学习笔记(四)------内存调优【转】

转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM. 对JVM内存的系统级的调优主要的目的是减少GC的频率和Fu

JVM学习笔记(三)------内存管理和垃圾回收【转】

转自:http://blog.csdn.net/cutesource/article/details/5906705 版权声明:本文为博主原创文章,未经博主允许不得转载. JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示:   1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结

JVM学习笔记(一)——内存模型

对于Java程序员来说,他们相比C++程序员最幸福的一点就是不用自己管理内存,内存的分配和回收都由虚拟机完成.然而,正是由于该原因,一旦虚拟机内存管理出现问题,比如出现内存泄漏或溢出,排查起来将是非常困难的.所以尽管不用亲自动手管理内存,但是了解虚拟机的内存管理机制还是很有必要的. 运行时数据区域 首先来看下Java虚拟机在运行时的数据区域划分,Java虚拟机在Java程序运行时会将内存区域划分成若干个不同的区域,各自负责不同的职责. 1.1 程序计数器 程序计数器(PC)的概念比较简单,记录当

理解JVM(4)- 堆内存的分代管理

前一篇从整体上了解了一下JVM的运行时数据区,它由_线程私有的栈内存_和_线程共享的堆内存.方法区_组成.本章节将详细了解一下堆内存又被分为哪些区域,或者说JVM是如何把对象分配到这些区域上的 JVM根据对象在内存中存活时间的长短,把堆内存分为新生代(包括一个Eden区.两个Survivor区)和老年代(Tenured或Old).Perm代(永久代,Java 8开始被"元空间"取代)属于方法区了,而且仅在Full GC时被回收.大致如下图 为对象分配空间,就是把一块确定大小的内存从堆中

JVM中的对象生命周期详解

在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段 (Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段 (Unreachable).可收集阶段(Collected).终结阶段(Finalized)与释放 阶段(Free).上面的这7个阶段,构成了 JVM中对象的完整的生命周期.下面 分别介绍对象在处于这7个阶段时的不同情形. 创建阶段 在对象创建阶段,系统要通过下面的步骤,完成对象的创建过程: (1)为对象分配存储空间. (2)开始构造

JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JVM 的内存主要分为3个分区 堆区(Heap)-- 只存对象(数组)本身(引用类型的数据),不存基本类型和对象的引用