Java 11被宣布为最新的LTS版本.因此,我们正在尝试基于此Java版本启动新服务.
但是,Java 11的基本Docker镜像远大于Java 8的等效镜像:
openjdk:8-jre-alpine:84 MB
openjdk:11-jre-slim:283 MB
(我只考虑每个Java版本的官方OpenJDK和最轻量级的图像.)
更深入的挖掘发现了以下"事物":
的openjdk:11-jre-slim图像使用基本图像debian:sid-slim.这带来了两个问题:
这比60 MB大 alpine:3.8
在Debian的sid版本是不稳定
openjdk-11-jre-headless安装在映像中的包比(运行Docker容器内部)大3倍openjdk8-jre:
openjdk:8-jre-alpine:
Run Code Online (Sandbox Code Playgroud)/ # du -hs /usr/lib/jvm/java-1.8-openjdk/jre/lib/ 57.5M /usr/lib/jvm/java-1.8-openjdk/jre/lib/
openjdk:11-jre-slim:
Run Code Online (Sandbox Code Playgroud)# du -sh /usr/lib/jvm/java-11-openjdk-amd64/lib/ 179M /usr/lib/jvm/java-11-openjdk-amd64/lib/
更深入地我发现了这种沉重的"根" - 这modules是JDK 的文件:
Run Code Online (Sandbox Code Playgroud)# ls -lhG /usr/lib/jvm/java-11-openjdk-amd64/lib/modules 135M /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
所以,现在问题来了:
为什么alpine不再使用Java 11 slim图像的基本映像?
为什么不稳定的sid版本用于LTS Java图像?
为什么OpenJDK 11的纤薄/无头/ JRE封装与类似的OpenJDK 8封装相比如此之大?
灵感来自问题为什么Java 11基础Docker镜像如此之大?(openjdk:11-jre-slim)我发现Java世界中的这个话题还没有解决.
至于07 Dec 2018存在共同的问题/陷阱(在上面的票证中讨论):
JRE不作为单独的"包"分发.应该使用JDK的模块
Oracle OpenJDK 11不支持Linux Alpine,因此无法轻松创建轻量级图像
目前可用的Oracle openjdk-11映像构建了未剥离的libjvm.so模块,该模块有数百兆字节,必须单独剥离:
由于这些问题,即使是简洁的 Oracle Java 11基础映像也非常繁重,并且被认为是不稳定的:https://hub.docker.com/_/openjdk/
所以问题是:
什么是构建和提供Java 11应用程序作为docker镜像的优化或推荐方法?
UPD 21.11.2017:该错误已在JDK中修复,请参阅Vicente Romero的评论
摘要:
如果for语句用于任何Iterable实现,则集合将保留在堆内存中直到当前作用域(方法,语句体)的结尾,并且即使您没有对集合和应用程序的任何其他引用也不会进行垃圾回收需要分配一个新的内存.
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8175883
https://bugs.openjdk.java.net/browse/JDK-8175883
例子:
如果我有下一个代码,它会分配一个包含随机内容的大字符串列表:
import java.util.ArrayList;
public class IteratorAndGc {
// number of strings and the size of every string
static final int N = 7500;
public static void main(String[] args) {
System.gc();
gcInMethod();
System.gc();
showMemoryUsage("GC after the method body");
ArrayList<String> strings2 = generateLargeStringsArray(N);
showMemoryUsage("Third allocation outside the method is always successful");
}
// main testable method
public static void gcInMethod() {
showMemoryUsage("Before first memory allocating");
ArrayList<String> strings …Run Code Online (Sandbox Code Playgroud) 在k8s中,Cron Job Limitations提到无法保证作业只执行一次:
cron作业在其计划的每个执行时间创建一个作业对象.我们说"约",因为在某些情况下可能会创建两个作业,或者不会创建任何作业.我们试图使这些罕见,但不要完全阻止它们.因此,工作应该是幂等的
谁能解释一下:
在Spring Boot项目中,我们启用了Spring Security并使用承载令牌应用 Keycloak 身份验证,如以下文章中所述:
https://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/spring-security-adapter.html
https://www.keycloak.org/docs/3.2/securing_apps/topics/oidc/java/spring-boot-adapter.html
但是我找不到任何关于如何进行自动化测试以便应用 Keycloak 配置的建议。
那么,如何在启用 Spring 安全性的情况下测试/模拟/验证 Keycloak 配置?一件非常烦人的事情:默认情况下,Spring 会激活csrf安全过滤器,但如何避免对其进行测试?
(注意:我们使用不记名令牌,因此@WithMockUser在这种情况下似乎不适用)
奖金的问题:基本上我们不希望核实每个控制器集成测试的安全性,所以是有可能从控制器集成测试分别验证(那些使用安全@SpringBootTest,@WebAppConfiguration,@AutoConfigureMockMvc等?
我转换PDF - >许多JPEG和许多JPEG - >许多PDF使用ghostscript.我需要在每个转换的JPEG(PDF)页面上添加水印文本.是否可以只使用Ghostscript和PostScript?
我找到的唯一方法:
gswin32c -q -sDEVICE = pdfwrite -dBATCH -dNOPAUSE -sOutputFile = output.pdf watermark.ps input.pdf
但这将watermark.ps在第一个单独的页面上插入水印output.pdf.
我可以直接在输出PDF页面上执行此操作吗?
我可以直接在输出JPEG页面上执行此操作吗?
<<
/BeginPage
{ gsave
/Helvetica_Bold 120 selectfont
.85 setgray 130 70 moveto 50 rotate (Sample) show
grestore
} bind
>> setpagedevice
Run Code Online (Sandbox Code Playgroud)
如果我使用/EndPage而不是/BeginPage- 它说不setpagedevice适用...
如何重新制作此脚本/EndPage?
就像这段代码:
dependencies {
compile ('com.wdullaer:materialdatetimepicker:3.2.2') {
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'design'
}
}
Run Code Online (Sandbox Code Playgroud)
在android应用程序build.gradle文件中,当我想依赖远程库时,如何使用排除组语法来排除多个组?
上面的代码虽然是正确的方法,但是有点复杂,有没有更简单的方法?
在Java中(但在PHP中类似),ArrayDeque实现的能力始终为2的幂:
对于HashMap这种选择很明显-基于修剪的32位哈希具有均匀的元素分布。但是Deque顺序插入/删除元素。
同样,ArrayList不将其容量限制为2的幂,只是确保其至少为元素数量。
那么,为什么Deque实现要求其容量为2的幂?
Maven有一个功能,即依赖项版本管理可以集中在根/父项目中,并且当版本/范围/从父项目继承时,所有子模块/子项目仅指向依赖项名称。
gradle有一些标准方法吗?我找到了一些解决方法,例如Sprint Better Dependency Management for Gradle和How to Centralize Support Libraries,但我真的很好奇是否gradle有一些内置的解决方案?
AbstractIterableAssert#containsOnly说:
验证实际组是否仅按任何顺序包含给定值而不包含任何其他值.
AbstractIterableAssert#containsExactlyInAnyOrder说:
验证实际组是否包含完全给定的值,而不是任何其他顺序.
描述看起来几乎一样,那么唯一和确切的实际区别是什么?
java ×4
alpine-linux ×2
docker ×2
gradle ×2
java-11 ×2
arraydeque ×1
assert ×1
assertj ×1
bearer-token ×1
capacity ×1
cron ×1
deque ×1
for-loop ×1
ghostscript ×1
groovy ×1
iterator ×1
jobs ×1
jpeg ×1
junit ×1
keycloak ×1
kubernetes ×1
list ×1
maven ×1
pdf ×1
postscript ×1
security ×1
spring-boot ×1
unit-testing ×1
watermark ×1