An谩lisis de JPoint 2019

imagen

Hola a todos!

JPoint 2019, una de las conferencias de Java m谩s exigentes, termin贸, se celebr贸 por s茅ptima vez y, como siempre, rompi贸 el r茅cord de asistencia, esta vez el evento atrajo a m谩s de 1700 especialistas en el campo del desarrollo de Java.

Odnoklassniki particip贸 en todas las conferencias de JPoint. Desde 2013, hemos estado apoyando activamente a JPoint y en nuestros stands hemos estado organizando varias actividades de prueba de conocimiento de Java para nuestros participantes. Este a帽o tuvimos las famosas tareas "irresolubles" de los principales desarrolladores de OK.ru. Los participantes de la conferencia que respondieron las preguntas correctamente recibieron premios.

Para ser justos, debo decir que de 600 folletos con las tareas que entregamos, se devolvieron menos de 100, el puntaje promedio es de aproximadamente 0.25.

La mejor soluci贸n fue obtener 4 puntos de 5 posibles.

Publicamos tareas y sus soluciones para que pueda probar su fortaleza.

Beats be


Este problema fue resuelto por el 40% que aprob贸 las respuestas.

Michael crea un an谩logo de BitSet seguro para BitSet . Agregue una implementaci贸n del m茅todo setBit() .

Por simplicidad, el tama帽o de BitSet puede considerarse constante.

 public class ConcurrentBitSet { private final AtomicLongArray bits; public ConcurrentBitSet(int size) { assert size >= 0; int words = (size + 63) / 64; bits = new AtomicLongArray(words); } public void setBit(int index) { // TODO: Implement me! } } 

Soluci贸n
Una implementaci贸n que use updateAndGet() / getAndUpdate() , disponible con Java 8, podr铆a verse as铆:

 public void setBit(int index) { int word = index >> 6; long mask = 1L << index; bits.updateAndGet(word, value -> value | mask); } 

La implementaci贸n en el buen viejo compareAndSet() es similar:

 public void setBit(int index) { int word = index >> 6; long mask = 1L << index; long oldValue; long newValue; do { oldValue = bits.get(word); newValue = oldValue | mask; } while (!bits.compareAndSet(word, oldValue, newValue)); } 


Enum no es lo mismo


Este problema fue resuelto por el 45% que aprob贸 las respuestas.

Tatiana quiere verificar si dos objetos son constantes de la misma enum . 驴Qu茅 no tuvo en cuenta?

 boolean sameEnum(Object o1, Object o2) { return o1.getClass().isEnum() && o1.getClass() == o2.getClass(); } 

Soluci贸n
La sugerencia se encuentra en la documentaci贸n del m茅todo Enum.getDeclaringClass () , que se utiliza, por ejemplo, en Enum.compareTo():

 public final Class<E> getDeclaringClass() { Class<?> clazz = getClass(); Class<?> zuper = clazz.getSuperclass(); return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper; } 

Para las constantes enum con cuerpos no vac铆os, se crean clases intermedias, por lo que la respuesta correcta podr铆a verse as铆:

 boolean sameEnum(Object o1, Object o2) { return o1 instanceof Enum && o2 instanceof Enum && ((Enum) o1).getDeclaringClass() == ((Enum) o2).getDeclaringClass(); } 


Enlaces sin compilar


Este problema fue resuelto por el 42% que aprob贸 las respuestas.

La siguiente interfaz est谩 disponible:

 interface Link<T> { T next(); } 

Cambie la firma (pero no el cuerpo) del m茅todo getTail() ) para que el c贸digo se compile sin errores ni advertencias.

 Link getTail(Link head) { if (head.next() == null) { return head; } return getTail(head.next()); } 

Soluci贸n
Solo hay tres respuestas m铆nimas correctas:

 <T extends Link<T>> Link<T> getTail(Link<T> head) <T extends Link<T>> Link<T> getTail(T head) <T extends Link<T>> T getTail(T head) 

Por parad贸jico que parezca, una firma de este tipo es demasiado dif铆cil para el compilador de Java:

 <T extends Link<T>> T getTail(Link<T> head) 


Mensajero


Este problema fue resuelto por el 14% que aprob贸 las respuestas.

Kostya est谩 desarrollando una aplicaci贸n de mensajer铆a. Indique errores en el m茅todo para enviar mensajes a trav茅s de la red.

 void send(SocketChannel ch, String message) throws IOException { byte[] bytes = message.getBytes(); ByteBuffer header = ByteBuffer.allocate(4); header.putInt(bytes.length); ch.write(header); ch.write(ByteBuffer.wrap(bytes)); } 

Soluci贸n
Hay al menos tres errores en este c贸digo:


Esto puede parecer una versi贸n fija:

 void send(SocketChannel ch, String message) throws IOException { byte[] bytes = message.getBytes(StandardCharsets.UTF_8); ByteBuffer header = ByteBuffer.allocate(4); header.putInt(bytes.length); header.flip(); while (header.hasRemaining()) { ch.write(header); } ByteBuffer body = ByteBuffer.wrap(bytes); while (body.hasRemaining()) { ch.write(body); } } 


Java en contenedor


Este problema fue resuelto por el 7,5% que aprob贸 las respuestas.

驴Qu茅 par谩metros de la JVM se deben prescribir a Alexei para evitar que el sistema operativo Linux mate el proceso Java debido a que excede el l铆mite de memoria asignado para el contenedor?

  • -Xmx
  • -XX:MaxMetaspaceSize
  • -XX:ReservedCodeCacheSize
  • -XX:+UseContainerSupport
  • -XX:MaxRAMPercentage
  • La memoria JVM no puede ser limitada

Soluci贸n
La memoria consumida por el proceso de Java est谩 lejos de limitarse a la cadera, Metaspace y Code Cache. Muchas otras estructuras JVM tambi茅n ocupan memoria, y no todas est谩n reguladas por la configuraci贸n. Adem谩s de la m谩quina Java virtual, la memoria nativa es asignada por la Biblioteca de clases Java y el c贸digo de usuario a trav茅s de Direct ByteBuffers y Mapped ByteBuffers.

El par谩metro MaxRAMPercentage junto con MaxRAMPercentage afecta solo el tama帽o del mont贸n. Por lo tanto, no hay una forma garantizada de evitar exceder el l铆mite utilizando solo banderas JVM, y la 煤ltima respuesta ser谩 la correcta. Para obtener m谩s informaci贸n sobre el uso de la memoria Java por un proceso, consulte el informe de Andrei Pangin en Joker 2018 " Shelf Process Java Storage" .

Source: https://habr.com/ru/post/447218/


All Articles