精华内容
下载资源
问答
  • 栈内存的操作方式类似数据结构中的栈。优势在于存取速度比较快,仅次于寄存器,数据还可以共享,缺点是存在栈中的数据大小与生存期必须是确定的。 堆(heap)是一个程序运行动态分配的内存区域,在java中,构建对象...

    初步了解在JVM中的内存分配知识
    区别在于:
    (stack)是由编译器自动分配和释放的一块内存区域,主要存放一些基本数据类型(四型八类)的变量、指令代码和常量和对象的引用地址。
    栈内存的操作方式类似数据结构中的栈。优势在于存取速度比较快,仅次于寄存器,数据还可以共享,缺点是存在栈中的数据大小与生存期必须是确定的。
    (heap)是一个程序运行动态分配的内存区域,在java中,构建对象时所需要的内存从堆中分配,这些对象时new时指令显式建立,分配方式类似于数据结构中的链表。堆内存在使用完毕后,是有垃圾回收器隐式回收的。
    堆的优势在于动态分配内存大小,其生存期也不必事先告诉编译器。在使用完毕后,java的垃圾回收器会自动收走这些不再使用的内存块。缺点是由于在运行时才动态分配内存,相对于栈内存,存取速度较慢。

    初步认识四类八种基本数据类型
    整型:byte short int long
    浮点型: float double
    逻辑型:boolean
    字符型:char
    在这里插入图片描述
    初步认识equals与==的区别:
    ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
    ==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
    ==指引用是否相同, equals()指的是值是否相同
    用一张图可以简要的表现他们之间的关系:
    在这里插入图片描述

    代码测试一:
    !

    equals与==的区别详解:

    =:比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。 equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
    String s=“abcd"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String s=“abcd”;形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象, 如果没有,则在常量池中新创建一个"abcd”,下一次如果有String s1 = “abcd”;又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象。
      equals:而String s = new String(“abcd”);和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。也可以这么理解: String str = “hello”; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello"。如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String (“hello”) 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。

    代码测试二:
    在这里插入图片描述

    展开全文
  • JVM in a nut shell

    2009-12-23 12:40:00
    JVM的内存里面,大概可以分为方法区和堆、栈:方法区里面存放ClassLoader加载进来的对象"模板"(对象方法、静态数据、对象协同数据……)Java运行时的对象都是创建在堆里的栈和C++的栈的概念差多,栈帧是指一个...
    从项目可靠性和人力资源方面考虑,PM决定用Java构建next generation system. 所以现在,让我们开始JAVA之旅。
    JVM的内存里面,大概可以分为方法区和堆、栈:
    方法区里面存放由ClassLoader加载进来的对象"模板"(对象方法、静态数据、对象协同数据……)
    Java运行时的对象都是创建在堆里的
    栈和C++的栈的概念差多,栈帧是指一个子程序(方法)的栈框架,由于是JVM上的栈,所以栈不必是一个连续的内存、由于是JVM,字节码
    是不直接和CPU 寄存器打交道的(也就是字节码中没有操作CPU 寄存器的指令)、而且栈中的数据都是以字长(如32bit)为单位,byte等都会
    以一个int的空间来压入栈中,long和double总是有64bit(两字长),一样压入栈中。 int 等不是对象,而是基本数据类型,所以可以直接
    入栈,否则像其它对象就要先在堆中创建,然后再压入引用了。和C++中一样,每个线程都有自已单独的栈空间。
    展开全文
  • 1. Storm 技术Storm 运行在JVM之上,大部分功能都是通过Java与Clojure进行开发。 Storm主要接口都是通过Java进行开发,但绝大多数逻辑都是Clojure进行实。 Python主要用来实现Storm后台程序以及管理命令...

    1. Storm 技术栈

    Storm 运行在JVM之上,大部分功能都是通过Java与Clojure进行开发。
    Storm的主要接口都是通过Java进行开发,但绝大多数的逻辑都是由Clojure进行实。
    Python主要用来实现Storm的后台程序以及管理命令程序。

    2. Storm环境搭建

    在搭建Storm环境之前,需要对Java以及Zookeeper的环境进行配置

    2.1 安装基础依赖

    2.1.1 安装JDK

    1. 下载安装包:http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz
    2. 解压缩:tar -xvf jdk-8u144-linux-x64.tar.gz
    3. 设置环境变量,在/etc/profile输入以下内容
    JAVA_HOME=/usr/java/jdk-8u144-linux-x64
    CLASSPATH=.:$JAVA_HOME/lib.tools.jar
    PATH=$JAVA_HOME/bin:$PATH
    export JAVA_HOME CLASSPATH PATH
    1. 执行source /etc/profile
    2. 验证:java -version

    2.1.2 安装Zookeeper

    安装过程参见:http://blog.csdn.net/eric_sunah/article/details/43969603

    2.2 本地调试/开发

    如果还没有搭建集群,又想试一下Storm的运行效果,可以通过本地运行的方式运行,提交Topology的方式如下:

    LocalCluster cluster = new LocalCluster();
    cluster.submitTopology("word-count", conf, builder.createTopology());

    2.3 手动配置集群

    当并发量较大时,需要将Topology提交到集群中运行,本章主要介绍手动搭建集群的方式

    集群配置流程如下:
    1. 环境信息
    - storm的版本:1.1.0
    - OS版本:Ubuntu 14.04
    2. 机器角色分配

    Host 角色
    192.168.5.137 Nimbus,Supervisor,UI
    192.168.5.138 Supervisor
    192.168.5.139 Supervisor
    192.168.5.140 Supervisor

    3. 在192.168.5.137上下载storm:http://www.apache.org/dyn/closer.lua/storm/apache-storm-1.1.1/apache-storm-1.1.1.tar.gz
    4. 解压缩:tar –zvxf apache-storm-1.1.1.tar.gz –C /usr/local/
    5. 配置环境变量/etc/profile

    export STORM_HOME==/usr/local/storm    
    export PATH=$STORM_HOME/bin:$PATH 
    1. 修改storm.yaml,Storm发行版本解压目录下有一个conf/storm.yaml文件,用于配置Storm。以下配置选项是必须在conf/storm.yaml中进行配置的:
    # Storm使用的Zookeeper集群地址
    storm.zookeeper.servers:
         - "192.168.5.138"
         - "192.168.5.139"
         - "192.168.5.140"
    # Storm集群Nimbus机器地址,各个Supervisor工作节点需要知道哪个机器是Nimbus,这里提供两个做主备
    nimbus.seeds: ["192.168.5.137", "192.168.5.138"]
    # Nimbus和Supervisor进程用于存储少量状态,如jars、confs等的本地磁盘目录,需要提前创建该目录并给以足够的访问权限。
    storm.local.dir: "/root/storm/wkdir"
    # Storm ui的端口
    ui.port: 9999
    # 对于每个Supervisor工作节点,需要配置该工作节点可以运行的worker数量。每个worker占用一个单独的端口用于接收消息,该配置选项即用于定义哪些端口是可被worker使用的。默认情况下,每个节点上可运行4个workers,分别在6700、6701、6702和6703端口
    supervisor.slots.ports:
         - 6700
         - 6701
         - 6702
         - 6703
    1. 将192.168.5.137的/usr/local/apache-storm-1.1.1 目录同步到其他几个节点
    2. 每个节点都执行 source /etc/profile
    3. 启动进程:Stor也是快速失败(fail-fast)的系统,Storm可以在任意时刻被停止,并且当进程重启后被正确地恢复执行。这也是为什么Storm不在进程内保存状态的原因,即使Nimbus或Supervisors被重启,运行中的Topologies不会受到影响。
      以下是启动Storm各个后台进程的方式:

      • Nimbus: 在Storm主控节点上运行 “storm nimbus &”
      • Supervisor: 在Storm各个工作节点上运行” storm supervisor &”
      • UI: 在Storm主控节点上运行 “storm ui &”

      注意事项:

      • Storm后台进程被启动后,将在Storm安装部署目录下的logs/子目录下生成各个进程的日志文件。
      • Storm UI必须和Storm Nimbus部署在同一台机器上,否则UI无法正常工作
      • 为了方便使用,可以将bin/storm加入到系统环境变量中
    4. 验证:登录http://192.168.137:9999/index.html 查看集群情况

    2.4 提交Topology

    如果Topology已经生成好了Jar包,可以通过以下方式提交Topology

    ./storm jar storm_demo.jar com.eric.storm.sample.WordCountTopolopgyAllInJava

    3 配置说明

    Storm中包含了大量的配置,至于集群的配置信息可以参考 http://192.168.5.137:9999/index.html 中的 Nimbus Configuration 部分的内容。
    关于配置的解释,可以参考官方文档:http://storm.apache.org/releases/1.1.1/Configuration.html

    4 自动化配置集群

    当集群规模比较大时,集群的管理是一个复杂的问题。Puppet提供了对Storm 集群进行管理的一套脚本。需要的同学可以自行研究下,github地址:https://github.com/miguno/puppet-storm

    展开全文
  • JVM异常 在java中,异常分为显示异常和隐式异常两种。...在某个方法中生成了异常,一般我们会得到这个异常的栈轨迹,这个内容就是由JVM来生成的。JVM会从当前出现异常的方法开始,逐一向下访问所在线程的

    JVM异常

    在java中,异常分为显示异常和隐式异常两种。显示异常指java应用抛出的异常,程序遇到了无法执行的逻辑,通过throw抛出异常;隐式异常指虚拟机在执行过程中,碰到错误无法执行下去,不得不停止执行,自动抛出异常,比如对象执行方法,结果该对象为Null,那么会出现NPE。

    关于异常的内容

    异常篇

    为什么不能通过异常来处理业务逻辑

    异常实例的构建过程十分复杂。在某个方法中生成了异常,一般我们会得到这个异常的栈轨迹,这个内容就是由JVM来生成的。JVM会从当前出现异常的方法开始,逐一向下访问所在线程的栈帧,并且记录下各种异常相关的信息,异常所在的类、方法、行。

    JVM是如何捕捉异常的

    在java文件编译后生成的字节码文件中,每个方法都带有一个异常表,异常表中含有from、to、target三种指针及不活的异常的类型,如果没有try、catch模块,那么捕获的异常类型为any。
    当程序触发异常时,Java 虚拟机会从上至下遍历异常表,检查当前异常触发的索引是否在异常表中某个异常的监控范围内,如果在范围内,那么jvm会判断所抛出的异常与异常表查询的异常类型是否匹配,匹配的话那么跳转到该条异常所指定的字节。
    如果遍历完了异常表没有查询到对应的异常,那么会弹出栈帧,将异常抛出到该方法的调用者,继续执行这个流程。

    JVM中的finally

    finally模块在java语言中是必须执行的,在编译的时候,通过将finally中代码块分别在try模块的最后和catch模块的最后都复制了一份,通过这样来保证finally的必定执行。如下面代码及class文件内容。

    public class TestException {
    
        private int tryValue;
        private int catchValue;
        private int finalValue;
    
        public void test() {
            try {
                tryValue = 1;
            } catch (Exception e) {
                catchValue = 2;
            } finally {
                finalValue = 3;
            }
        }
    
        /**
         * 在索引为5和索引为19的位置可以看到,代码里并没有的为finalValue赋值的内容在这里出现了,
         * 这是在编译的时候,将finally模块的内容添加过来保证finally的执行,执行结束后直接跳转到return.
         * 那么在索引27的位置,依旧出现了finally的模块内容,这是因为可能在catch模块出现异常,
         * 这个finally模块的内容是为了保证catch模块里异常后必定被执行(可看下面异常表)
         *  public void test();
         *     descriptor: ()V
         *     flags: ACC_PUBLIC
         *     Code:
         *       stack=2, locals=3, args_size=1
         *          0: aload_0
         *          1: iconst_1
         *          2: putfield      #2                  // Field tryValue:I
         *          5: aload_0
         *          6: iconst_3
         *          7: putfield      #3                  // Field finalValue:I
         *         10: goto          35
         *         13: astore_1
         *         14: aload_0
         *         15: iconst_2
         *         16: putfield      #5                  // Field catchValue:I
         *         19: aload_0
         *         20: iconst_3
         *         21: putfield      #3                  // Field finalValue:I
         *         24: goto          35
         *         27: astore_2
         *         28: aload_0
         *         29: iconst_3
         *         30: putfield      #3                  // Field finalValue:I
         *         33: aload_2
         *         34: athrow
         *         35: return
         *       // 方法中的异常表
         *       Exception table:
         *          from    to  target type
         *              0     5    13   Class java/lang/Exception
         *              0     5    27   any
         *             13    19    27   any
         */
    }
    
    

    finally中return覆盖try中返回值

    从字节码的角度来看finally中return是如何覆盖try中return的

    public class TestException {
    
        private int tryValue;
        private int catchValue;
        private int finalValue;
    
        public int test() {
            try {
                tryValue = 1;
                return tryValue;
            } catch (Exception e) {
                catchValue = 2;
            } finally {
                finalValue = 3;
            }
            return finalValue;
        }
    
        /**
         * return在finally外版本
         * public int test();
         *     descriptor: ()I
         *     flags: ACC_PUBLIC
         *     Code:
         *       stack=2, locals=3, args_size=1
         *          0: aload_0
         *          1: iconst_1
         *          2: putfield      #2                  // Field tryValue:I
         *          5: aload_0
         *          6: getfield      #2                  // Field tryValue:I
         *          9: istore_1      // 将tryValue写回return变量中
         *         10: aload_0
         *         11: iconst_3
         *         12: putfield      #3                  // Field finalValue:I  // 为finalValue赋值
         *         15: iload_1      // 取return变量写入栈顶
         *         16: ireturn      // 返回栈顶变量
         *         17: astore_1
         *         18: aload_0
         *         19: iconst_2
         *         20: putfield      #5                  // Field catchValue:I
         *         23: aload_0
         *         24: iconst_3
         *         25: putfield      #3                  // Field finalValue:I
         *         28: goto          39
         *         31: astore_2
         *         32: aload_0
         *         33: iconst_3
         *         34: putfield      #3                  // Field finalValue:I
         *         37: aload_2
         *         38: athrow
         *         39: aload_0
         *         40: getfield      #3                  // Field finalValue:I  // 取对象中finalValue
         *         43: ireturn          // 返回栈顶变量
         *       Exception table:
         *          from    to  target type
         *              0    10    17   Class java/lang/Exception
         *              0    10    31   any
         *             17    23    31   any
         */
    }
    
    public class TestException {
        
        private int tryValue;
        private int catchValue;
        private int finalValue;
    
        public int test() {
            try {
                tryValue = 1;
                return tryValue;
            } catch (Exception e) {
                catchValue = 2;
            } finally {
                finalValue = 3;
                return finalValue;
            }
        }
        /**
         * return在finally模块里版本
         * 最大的变化在索引12之后,获取到了对象中的finalValue,写入栈顶,然后返回,这里相当于覆盖了return变量里的值,因此try中的return失效了。
         * public int test();
         *     descriptor: ()I
         *     flags: ACC_PUBLIC
         *     Code:
         *       stack=2, locals=3, args_size=1
         *          0: aload_0
         *          1: iconst_1
         *          2: putfield      #2                  // Field tryValue:I
         *          5: aload_0
         *          6: getfield      #2                  // Field tryValue:I
         *          9: istore_1
         *         10: aload_0
         *         11: iconst_3
         *         12: putfield      #3                  // Field finalValue:I
         *         15: aload_0
         *         16: getfield      #3                  // Field finalValue:I
         *         19: ireturn
         *         20: astore_1
         *         21: aload_0
         *         22: iconst_2
         *         23: putfield      #5                  // Field catchValue:I
         *         26: aload_0
         *         27: iconst_3
         *         28: putfield      #3                  // Field finalValue:I
         *         31: aload_0
         *         32: getfield      #3                  // Field finalValue:I
         *         35: ireturn
         *         36: astore_2
         *         37: aload_0
         *         38: iconst_3
         *         39: putfield      #3                  // Field finalValue:I
         *         42: aload_0
         *         43: getfield      #3                  // Field finalValue:I
         *         46: ireturn
         *       Exception table:
         *          from    to  target type
         *              0    10    20   Class java/lang/Exception
         *              0    10    36   any
         *             20    26    36   any
         */
    }
    
    
    展开全文
  • Java虚拟机

    2018-01-20 13:22:29
    第一部分从宏观角度介绍了整个Java技术体系、JavaJVM的发展历程、模块化,以及JDK编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域划分原理以及各种内存溢出...
  • Java面向对象一些概念和原理

    千次阅读 2013-11-30 22:59:27
    1 简答题(写概念,思原理) 1.1 什么是类。...类是用于构建对象模板,对象实质就是内存中一块存储区域,其数据结构定义它类来决定。 1.2 请简述JVM内存结构堆,和方法区分别存储内容。 参考答案:
  • 它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...
  • 最里层,还有一个Java的 Smart card版本,原本在Java的文件之中并没有这样定义 但是将亡画在JⅦ内部是很合理的。因为 SmartCard版本具攴持java.lang*这个核心类, 比起JM所支持的核心类更少,但它也有属」自凵的扩充类,...
  • java 面试题 总结

    2009-09-16 08:45:34
    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    26.java的awt和swing组件的GUI设计的关键 27.对于java流的认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理模式。 30.你编写过applet吗?applet的安全权限如何?试列举java application或者...
  • java_api1.9,1.6中文版

    2018-05-08 11:26:20
    235: 测试类-文件javac生成属性 236: 解析器api纳什恩 237: Linux/AArch64港口 238: 多释放罐文件 240: 删除jvm tihprof代理 241: 移除在工具 243: javajvm编译程序接口 244: TLS应用层协议协商扩展 245: 验证...
  • 如果其他线程完成工作都是后台任务,那么应该降低它们优先级,从而提高前台程序响应性。 活锁 要解决这种活锁问题,需要在重试机制中引入随机性(randomness)。为了避免这种情况发生,需要让...
  • 1. Jvm内存空间结构是什么样? 1 程序计数器 1 Java栈 1 本地方法 2 堆 2 方法区 3 2. Jvm堆内存划分结构和优化 3 2.1. 原理 6 2.1.1. 年轻代 6 2.1.2. 年老代 6 2.1.3. 持久代 7 2.2. 参数说明 8 2.3. 疑问...
  • Java经典编程300例(code)

    千次下载 热门讨论 2013-01-09 10:26:53
    实例003 输出“*”组成三角形 3 实例004 输出符号表情 5 第2章 Eclipse开发工具 6 实例005 下载并运行Eclipse工具 7 实例006 为Eclipse安装汉化包 8 实例007 使用Eclipse注释代码 10 实例008 使用Eclipse格式化...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    程序可以采用 JAVA 开发,但是因为它虚拟机 (Virtual Machine) Dalvik ,是将 JAVA bytecode 转成 自 己格式,回避掉需要付给 SUN 有关 JAVA 授权费用。 对手机制造者影响 � Android 是款开源移动计算...
  • Google Android SDK开发范例大全(完整版)

    热门讨论 2011-11-03 10:32:46
    Android 平台是 Open Handset Alliance 成果,Open Handset Alliance 组织一群共同致力于构建更好移动电话公司组成。这个组织 Google 领导,包括移动运营商、手持设备制造商、零部件制造商、软件解决方案...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

java的栈由jvm构建

java 订阅