精华内容
下载资源
问答
  • 什么是栈分配栈分配是java虚拟机提供的一种优化技术,基本思想是对于那些线程私有的对象(指的是可能被其他线程访问的对象),可以将它们打散分配在栈,而不是分配在堆。分配在栈的好处是可以在函数调用...

    什么是栈上分配

    栈上分配是java虚拟机提供的一种优化技术,基本思想是对于那些线程私有的对象(指的是不可能被其他线程访问的对象),可以将它们打散分配在栈上,而不是分配在堆上。分配在栈上的好处是可以在函数调用结束后自行销毁,而不需要垃圾回收器的介入,从而提供系统的性能。

    栈上分配的一个技术基础是进行逃逸分析。逃逸分析的目的是判断对象的作用域是否有可能逃逸出函数体。

    下面的代码显示了一个逃逸的对象:

    public class PartionOnStack {

    static class User{

    private int id;

    private String name;

    public User(){}

    }

    private static User user;

    public static void foo() {

    user=new User();

    user.id=1;

    user.name="sixtrees";

    }

    public static void main(String[] args) {

    foo();

    }

    }

    因为上面的代码中的User的作用域是整个Main Class,所以user对象是可以逃逸出函数体的。下面的代码展示的则是一个不能逃逸的代码段。

    public class PartionOnStack {

    class User{

    private int id;

    private String name;

    public User(){}

    }

    public void foo() {

    User user=new User();

    user.id=1;

    user.name="sixtrees";

    }

    public static void main(String[] args) {

    PartionOnStack pos=new PartionOnStack();

    pos.foo();

    }

    }

    代码来帮忙

    通过上面的分析,我们知道java虚拟机会帮助我们在栈上进行分配,我们设置了1亿次alloc的对象创建,每个User对象实例需要占用16字节的空间,如果没有优化,累计的空间申请将有1.5GB这么大,如果我们的堆空间设置的值小于1.5GB的话,就会发生GC。代码如下:

    public class PartionOnStack {

    class User{

    public int id;

    public String name;

    }

    public void foo() {

    User user=new User();

    user.id=1;

    user.name="sixtrees";

    }

    public static void main(String[] args) {

    System.out.println("start-----------");

    long beginTime=System.currentTimeMillis();

    PartionOnStack pos=new PartionOnStack();

    for(int i=0;i<100000000;i++)

    {

    pos.foo();

    }

    long endTime=System.currentTimeMillis();

    System.out.println("总共运行----"+(endTime-beginTime)+"ms");

    }

    }

    使用下面的参数运行上面的代码

    -server -XMX10m -Xms10m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations

    运行的结果如下所示:

    1487432822179.jpg

    对于大量的零散小对象,栈上分配提供了一种很好的对象分配策略,栈上分配的速度快,并且可以有效地避免垃圾回收带来的负面的影响,但由于和堆空间相比,栈空间比较小,因此对于大对象无法也不适合在栈上进行分配。

    展开全文
  • 1、类创建对象的两种方式类创建对象有两种方式...想法一:如果只能在堆创建对象的话也就意味着能在栈创建对象,而我们知道要创建对象必须调用类的构造函数,在这里有很多人就会想到将构造函数设置为私有的,这样

    1、类创建对象的两种方式

    类创建对象有两种方式,一种是静态创建对象:A a;还有一种方式是动态建立A* pa=new A;
    这两种方式是不同的,第一种方式是为对象在栈上开辟空间,另一种方式是为对象在堆上开辟空间。

    2、如何让一个类只在堆上创建对象?

    想法一:如果只能在堆上创建对象的话也就意味着不能在栈上创建对象,而我们知道要创建对象必须调用类的构造函数,在这里有很多人就会想到将构造函数设置为私有的,这样一来就只能通过new来创建对象,可是一旦将构造函数设置为私有的new也无法对对象进行初始化了。
    new为创建对象需要两步,即先调用库函数operator new开辟空间,后调用类的构造函数对空间进行初始化。此时如果将构造函数设置为私有的,new就无法初始化对象了,只能为对象分配空间。

    想法二:其实在创建对象的时候,编译器会先检查类的析构函数能否调用,因为编译器要保证开辟出去的空间要能回收回来呀,所以此时如果将类的析构函数设置为私有的,就编译器就不会调用类的构造函数在栈上创建对象了。但是问题又来了,一般析构函数是要在对象的生命周期完结之后进行一些清理工作的,即如果使用new运算符在堆上开辟空间了,析构函数中必然要用delete对空间进行释放,如果将析构函数设置为私有的,就不能将堆上申请的空间释放掉了,此时可以将delete定义在类的一个公有成员函数中,在类外显示地调用一下这个成员函数就可以将堆上申请的空间释放掉了。
    注意:必须要在类内的成员函数内使用delete来释放空间,因为如果在类外使用delete来释放空间的话,delete就会调用类的析构函数,此时析构函数是私有的,不能进行调用,而在类内疚可以进行调用了。

    3、如何只在栈上创建对象

    只能在栈上创建对象也就是说不能在堆上创建对象,因为用new在堆上创建对象分为两步,因此只要让new不能调用operator new库函数就可以了,因此只要自己在类内重载一个operator new函数,并将其声明为私有的即可。
    注意:重载了operator new也必须重载operator delete

    展开全文
  • DIV层位于flash对象作者:genius 日期:2005-11-15 在公司主页放了一个浮动广告式的Online Support,是一个浮动层,可是在浮动到Flash时,就会被Flash挡住,该死,无论我怎么设置Z轴都是在Flash这下,看来...

    让DIV位于flash对象之上

    在公司主页上放了一个浮动广告式的Online Support,是一个浮动,可是在浮动到Flash上时,就会被Flash挡住,该死,无论我怎么设置Z轴都是在Flash这下,看来还是Flash动画招人喜欢啊,哈哈。
    看来在CSS上是找不到什么出路了,看看Flash吧。在DW8中,对Flash的参数提供还是太少,还不如以前的FrontPage,又记不起来Flash控制的参数了,搜吧。
    功夫不负有心人,终于找到了,设“wmode”的值为“Opaque”,表示将Flash置于最底
    点到Flash上,属性,点参数,再点那个加号添加参数“wmode”的值为“Opaque”,OK,搞定。
    现在我的图片可以随便飘啦,哈哈。
    代码是这样的:
    <PARAM name="wmode" value="Opaque" />

    l20051115143710.jpg
     
    试了一下,还有一种方法也可以实现,就是将Flash设为透明显示,也不会挡住浮动的
    <PARAM name="wmode" value="transparent" />
    展开全文
  • 但是其实其中还是有未考虑到的地方,比如在新建一个model对象的时候,会报错:ActiveRecord::ActiveRecordError: can not update on a new record object意思是你能在一个新建对象上调用update方法!对应的代码如下:...

    在第一篇中我们讨论了如何控制model的hook流.

    但是其实其中还是有未考虑到的地方,比如在新建一个model对象的时候,会报错:

    ActiveRecord::ActiveRecordError: can not update on a new record object

    意思是你不能在一个新建对象上调用update方法!

    对应的代码如下:

    def was_deleted=(new_val)
        unless self.was_deleted
            update_column(:was_deleted,new_val)
        end
    end

    无疑在update和new时都会调用该方法,所以我们必须搞清楚到底是什么原因然后才能做出处理.恰好rails提供一个changed?方法,官方的解释为:

    Returns true if any of the attributes have unsaved changes, false otherwise.

    注意是unsaved changes!!!如果是新建那么changed?自然返回true,所以我们重构如下:

    def was_deleted=(new_val)
        unless self.was_deleted
            if !changed?
                update_column(:was_deleted,new_val)
            else
                #do something ...
            end
        end
    end

    问题是在else中做点什么,如果啥都不做was_deleted属性不会更新的哦!

    第一次尝试如下:

    alias :"was_deleted=" :"org_was_deleted="
    
    def was_deleted=(new_val)
        unless self.was_deleted
            if !changed?
                update_column(:was_deleted,new_val)
            else
                org_was_deleted=(new_val)
            end
        end
    end

    看上去不错,但实际运行会报错,提示找不到org_was_deleted=方法,因为org_was_deleted=是was_deleted=的别名,所以实际就是找不到was_deleted=方法!?你可能会奇怪,如果没有这个方法为什么会调用自定义的方法呢???

    其实很简单,该model类中的确没有对应的was_deleted=方法,该方法是ActiveRecord::Base类(或其超类)自动生成的,所以我们不用操心自己创建别名了,只要简单的调用super即可,最终的代码如下:

    def was_deleted=(new_val)
        unless self.was_deleted
            if !changed?
                update_column(:was_deleted,new_val)
            else
                super
            end
        end
    end
    展开全文
  • python精讲 可变对象与可变对象

    千次阅读 2020-07-22 15:46:35
    文章目录对象可变对象与不可变对象可变对象不可变对象 对象 Python 中的变量不是装有对象的“容器”,而是贴在对象的“标签”。 真正的存贮位置是内存中 在python中,可变对象包括:list、set、dict、自定义对象...
  • C++ 如何对象只在堆或栈创建

    千次阅读 2017-04-01 00:06:43
    在C++中,为了某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该() 正确答案: B 你的答案: D (错误) 将构造函数设为私有 将析构函数设为私有 将构造函数和析构函数均设为私有 没有...
  • 这时用户还能查看其内容,但无疑能再编辑它了.那么用rails的model验证和hook如何实现这样的效果呢?首先编辑执行的是update方法,所以我们必须在before_update下功夫:before_update do |r| #do something e
  • 然后在对象上 承诺是JavaScript开发的启示,它使我们可以享受异步处理并避免回调地狱。 许多新的API(例如Battery API , Cache API和其他API)都使用promise API。 您可能知道的一个事实是,您可以向任何对象...
  • 这能能实现呢?仔细想想,其实也是可以滴。 在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 1、静态建立类对象:是由编译器为对象在栈...
  • 我们要获取页面这个id为imooc的div元素,然后给这个文本节点增加一段文字:“hello,world”,并且文字颜色变成红色。 通过标准JavaScript处理: var p = document.getElementById('imooc'); p.in...
  • 这能能实现呢?仔细想想,其实也是可以滴。在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。1、静态建立类对象:是由编译器为对象在栈空间中...
  • 能在栈创建对象, 所以我们首先就构造函数随便被调用 首先要将构造函数私有化 构造函数私有化之后, 也无法在堆创建对象 所以我们要提供一个接口供外部调用, 通过这个接口创建对象 因为构造函.
  • 两步让对象变数组

    2020-03-24 23:55:14
    在javascript中,数组也是对象类型,但是真正意义对象和数组还是有区别,一般的json对象具备数组的方法和属性的。 案例: //对象 var arr = { 0 : 'javascript', 1 : 'java', 2 : 'node' } // ...
  • std::thread对象在所有路径都无法连接 每个 std::thread 对象的状态都是这两种中的一种:joinable(可连接的)或unjoinable(可连接的)。一个 可连接的std::thread 对应一个底层异步执行线程,例如,一个 ...
  • 昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)分配空间? 一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配...
  • 如何JS自动拖动某一个对象到另外一个对象上面,我要的效果是拖动一个表情到编辑器,点击按钮的时候用js自动调用,请各位大侠吝指导?
  • 不要让对象成为奴隶

    2008-06-10 19:26:00
    [写这篇文章纯粹是为了提高大家对对象的认识。此间不同的论点适用...身上的枷锁是他们能挣脱,而心灵的枷锁确他们愿或是知道逃离!不是奴隶的人,永远愿意主动去思考,为什么奴隶要成为奴隶!而成为奴

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,093
精华内容 4,837
关键字:

对象不让上