标签归档:repl

fastjson与awt

晚上在repl下模拟一个json的解析时发现,当调用fastjson时会在我的dock上弹出一个Java应用的icon,如下图:

这通常是程序里引用awt/swing之类的情况下才会发生,我很奇怪fastjson怎么会引起,对repl添加启动参数-J-verbose:class看看到底是否有加载awt先关的类:

看来温少考虑到了这种类型的解析场景,在代码里有相关的引用。

觉得心烦的话,启动repl时加一个java.awt.headless=true参数吧。

scala2.11的repl下增加了kind命令

scala2.11的repl中新增了kind命令,见这里,对于kind的理解也可参考之前的文章

不过,下载了scala2.11-m3版本,发现kind命令并没有用 *号的方式来表达.

scala> :k Int
scala.Int's kind is A

scala> :k class Test{}
Test's kind is A

scala> :k List
scala.collection.immutable.List's kind is F[+A]

scala> :k class C[M[_]]
C's kind is X[F[A]]

scala> :k class C[M2[M1[_]]]
C's kind is Y[X[F[A]]]

对于自身类型,kind命令不采用*号表示,而是用 A 来表示。对于构造器类型 * -> * 采用 F[A]描述。

分享ppt: jvm内存管理

去年分享的,里面的一些参数与当前线上的实际情况可能已对不上,仅供参考。

slideshare下载,或微盘下载

希望你能借鉴里面使用scala repl(再配合其他工具如jconsole)来做jvm参数调节的测试,比如:

repl很适合做诸如此类的测试。

scala2.10的repl下:cp命令不能工作

今天发现2.10的repl下:cp命令 (设置classpatch)不能正常工作。2.9.x正常。

scala> :cp /data/tmp/demo/
Added '/data/tmp/demo'.  Your new classpath is:
".:/data/tmp/demo"
Nothing to replay.

//虽然cp命令没报任何问题,但在import的时候不灵
scala> import test.A1
<console>:7: error: not found: value test
   import test.A1
          ^

2.10.1仍存在此bug,很低级啊,看来每个大版本发布后没几个小版本fix bug是很不稳定的。
先用启动时的-cp参数替代了:

scala -cp /data/tmp/demo/
// work
scala> import test.A1
import test.A1

查了一下这个bug:https://issues.scala-lang.org/browse/SI-6502
早就有人报了,他们觉得优先级不高,一拖再拖,要到2.10.2修复,估计在急着修复其他bug。

repl杂记

  1. repl下无法定义package
    脚本其实是在一个对象的方法中运行的,定义package自然是非法的

  2. 获取jvm系统属性

     scala> sys.props.foreach(println) //或
     scala> for((k,v) <- sys.props) println(k+"="+v)
    
  3. repl启动的jvm参数通过 -J来设定

     scala -J-Xms1g -J-Xmx1G -J-XX:+UseConcMarkSweepGC 
    
  4. repl的字体颜色可以改变

     scala> Console.GREEN //字体切换为绿色,repl背景颜色也可以改
    
  5. repl设置classpath

     1) 启动后,可以通过 :cp /data/demo/whj.jar 来增加jar文件到classpath里
     2) 启动前:scala -cp /data/demo/whj.jar
    

repl下的几种模式

  1. paste mode
    最常用的一种模式,粘贴多行程序时很方便,:paste可以缩写为:pas

  2. silent mode
    安静模式,不会输出每个表达式的类型和值;在定义变量时如果不想要输出,可以用:silent启用安静模式;退出安静模式也用:silent

  3. power mode
    支持的命令和方法经常变化,比如这里这里提到的tip都已发生了变化。这个模式并不针对普通用户,并且cpu耗费很高,通常用不着。

  4. wrap mode
    觉得这个模式挺有用的,比如说对所有的方法在运行时wrap一个time函数以统计方法的执行时间。
    参考这里。但不知道为何后来给去掉了,见这里的说明。

repl下的javap

scala> :javap 在我的笔记本上(linux)不能工作:javap unavailable on this platform
搜索后:http://www.scala-lang.org/node/10703

在启动时将 tools.jar设置到classpath即可:

$ scala -cp /data/program/java/lib/tools.jar

不过另外的问题是在REPL下使用 javap不如在命令行下更清晰,比如 object A{def foo(){}} 在命令行下实际编译成了2个class 一个 A.class 另一个 A$.class

A.class反编译的内容为:

public final class A extends java.lang.Object{
    public static final void foo();
}

A$.class反编译的内容为:

public final class A$ extends java.lang.Object implements scala.ScalaObject{
    public static final A$ MODULE$;
    public static {};
    public A$();
}

在 REPL下用:javap看到的是合在一起的:

scala> :javap A
Compiled from "<console>"
public final class A$ extends java.lang.Object implements scala.ScalaObject{
    public static final A$ MODULE$;
    public static {};
    public void foo();
    public A$();
}

另,对于jdk1.7,目前在repl下javap还不work