首页 > 试题广场 >

(1) 当一个对象被当做一个参数传递到方法后,此方法可改变这

[问答题]

(1) 当一个对象被当做一个参数传递到方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?()

(2) 对于JVM内存配置参数:-Xmn10240m -Xmx10240m -Xmx5120m -XXSurvivorRatio=3 Survivor区总大小分别为()、()

(3) JAVA 中为了保证线程对共享资源操作的完整性,用关键字()为共享资源加锁来解决这个问题。(说明:多项填空填写格式:分号+空格 或 其他明显的分割标识,区分开即可)

(1):Java 永远是值传递(pass-by-value),包括传递对象。看下面的例子:
public static void main(String[] args){
    Dog dog = new Dog("dog1");
    foo(dog);
   if (dog.getName().equals("dog1")){ //true
        System.out.println("Java pass by value");
    } else if (dog.getName().equals("dog2")){ //false
        System.out.println("Java pass by reference");
    }
}

void foo(Dog d){
    d = new Dog("dog2");
}
在这里,main函数中的dog变量是一个引用(地址),我们将其传递给foo(Dog d)函数时,是将dog 的地址变量值赋给了foo(Dog d) 函数中的局部变量 d. 如果是引用传递的话,传参不会有对另一个变量的赋值动作,形参仅仅是实参的一个别名( alias ).使用形参和使用实参没有任何区别。这时,函数 foo 对d的重新赋值就是对函数 main 中 dog变量的重新赋值。(d 和 dog本质上都是地址变量,不是一个存储数据的对象)。
具体可参考以下资料:

(2).题目应该有问题,前三个jvm参数应该为:-Xms 10240m -Xmx 10240m -Xmn 5120m。否则,没办法做。
先来解释这四个参数:
 1:-Xms 10240m:指定JVM 堆(heap) 最小值为10240m.
 2:-Xmx 10240m:指定 JVM 堆(heap) 最大值为 10240m. 即最小和最大值 相同,指定堆不可扩展。
 3:-Xmn 5120m:指定新生代(Young Generation)大小为 5120m。
4:-XX:SurvivorRatio = 3:指定新生代中Eden区和一个Survivor 区的空间比例为:3:1。

下图为JVM Heap简单的内存分布图:
 
简单说一下:整个Java 堆分为三个区域:新生代,老年代,永久代(新版的Hotspot JVM去了永久代),本题只涉及新生代。新生代分为一个Eden 区和两个大小相同的Survivor区,用来实现复制GC算法。根据上面的参数,新生代为5120m,Eden区和一个Survivor区为 3 : 1。可算得一个Survivor区大小为: 5120/5 = 1024m。两个Survivor区的大小相同,答案为:1024m 1024m。

关于JVM内存布局是重点,上面只是简单介绍,可参考周志明大大的<<深入理解Java虚拟机>>。

(3).synchronized 关键字用来加互斥锁。

若有问题,望大神指正。谢谢。
发表于 2017-01-23 17:20:46 回复(0)

第一个问题 容易错

发表于 2017-11-03 09:59:47 回复(0)