fyzn12
RSS SITEMAP

Articles

  • Linux部署springboot的jar包

    linux部署springboot的jar包 执行jar包的命令和在windows操作系统上是一样 java -jar jarName-0.0.1-SNAPSHOT.jar 注: 关闭服务器连接时会关闭此程序进程,(推荐测试可用) 将jar程序设置成后台运行,并且将标准输出的日志重定向至文件msg.log(可以自定义) nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 & 详解: nohup nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。 在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup命令,添加 &(表示“and”的符号)到命令的尾部。 nohup是no hang up的缩写,就是不挂断的意思。 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。 在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。 nohup和&的区别 &:指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出 nohup:不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系, 例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行。 nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &; 在上面的例子中,0:stdin (standard input),1:stdout (standard output),2:stderr (standard error); 2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到msg.
  • Synchronized底层实现

    java创建对象 new Object()创建对象时在内存中的分布–正对于64位 1. 对象头 1) mark word:标记字段 32位长度为32bit,64位系统上长度为64bit hashcode、GC分代年龄、锁信息(锁标志、锁记录)等 在32位系统上mark word长度为32bit,64位系统上长度为64bit。为了能在有限的空间里存储下更多的数据,其存储格式是不固定的,在32位系统上各状态的格式如下: 可以看到锁信息也是存在于对象的mark word中的。 > * 当对象状态为偏向锁(biasable)时,mark word存储的是偏向的线程ID; > * 当状态为轻量级锁(lightweight locked)时,mark word存储的是指向线程栈中Lock Record的指针; > * 当状态为重量级锁(inflated)时,为指向堆中的monitor对象的指针。 2) klass word :类型指针 3) array size :数组对象:数组长度 2. 实例数据 所有属性加起来的大小 3.对齐填充 实例数据不一定有,取决于实例数据,针对于JVM来说实例数据是8的整数倍,当实例数据不满足这一条件时,对其填充会将其补足为8的整数倍。 如对象属性加起来为63字节,那么对其填充就是1字节,则实例数据就是64字节。 重量级锁 重量级锁是我们常说的传统意义上的锁,其利用操作系统底层的同步机制去实现Java中的线程同步。 重量级锁的状态下,对象的mark word为指向一个堆中monitor对象的指针。 一个monitor对象包括这么几个关键字段:cxq(下图中的ContentionList),EntryList ,WaitSet,owner。 其中cxq ,EntryList ,WaitSet都是由ObjectWaiter的链表结构,owner指向持有锁的线程。 当一个线程尝试获得锁时,如果该锁已经被占用,则会将该线程封装成一个ObjectWaiter对象插入到 cxq 的队列尾部,然后暂停当前线程。当持有锁的线程释放锁前,会将cxq中的所有元素移动到EntryList中去,并唤醒EntryList的队首线程。
  • 为什么实现Serializable接口就可以序列化

    为什么实现Serializable接口就可以序列化 什么是序列化和反序列化 序列化就是指把Java对象转换为字节流写入硬盘的过程。 public static void writeObject(Object obj, String dstFilePath) throws IOException { ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dstFilePath)); out.writeObject(obj); out.close(); } 反序列化就是指把硬盘上的二进制文件用字节流读入内存中,恢复为Java对象的过程 public static Object loadObject(String fromFile) throws IOException, ClassNotFoundException { ObjectInputStream in = new ObjectInputStream(new FileInputStream(fromFile)); Object obj = in.readObject(); in.close(); return obj; }
  • NIO 学习笔记

    1. NIO 学习笔记 1.1 概念了解 java的NIO是一个可以代替标准Java IO API的IO API从java1.4开始。 工作方式的比较: - Java NIO: Channel and Buffer (通道和缓冲区) 数据总是从通道读取到缓冲区, 或者是从缓冲区写入到通道中。 - 标准IO: 标准IO基于字节流和字符流进行操作 Java NIO: Non-blocking IO(非阻塞IO) java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他 事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。 Java NIO: Selectors(选择器) Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。 核心组成部分 Channels Buffers Selectors 其他组件 其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。 1.2 Channel 和 Buffer 基本上所有的IO在NIO中都是从一个Channel中开始。Channel有点像流,数据可以从Channel读到Buffer中,也可以从Buffer写入到Channel中。 Channel和Buffer有好几种类型。下面是JAVA NIO中的一些主要Channel的实现: FileChannel DatagramChannel SocketChannel ServerSocketChannel 这些通道覆盖了UDP和TCP网络IO,以及文件IO。
  • Volatile底层实现

    volatile 硬件屏障 各个硬件的内存屏障不同 内存屏障 LoadLoad屏障 对于这样的语句 Load1;LoadLoad;Load2; 在Load2及后续读取操作要读取得数据被访问前,保证Load1要读取的数据被读取完毕。 StoreStore屏障 对于这样的语句 Store1;StoreStore;Store2; 在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。 LoadStore屏障 对于这样的语句 Load1;LoadStore;Store2; 在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。 StoreLoad屏障 对于这样的语句 Store1;StoreLoad;Load2; 在Load2及后续所有读取操作执行前,保证Store1的写入对所有的处理器可见 volatile的实现细节 字节码层面 ACC_VOLATILE 加了这样一个标识 JVM层面 –读取到字节码上的ACC_VOLATILE标识加下面的内存屏障 StoreStoreBarrier volatile写操作 StoreStoreBarrier LoadLoadBarrier volatile读操作 LoadLoadBarrier OS和硬件层面 需要用hsdis查看 windows 就是lock指令实现 synchronized的实现 字节码层面 ACC_SYNCHRONIZED 标识 monitorenter 实现 monitorexit 实现 JVM层面 C 和C++调用操作系统提供的同步机制 OS和硬件层面